Auteur Sujet: AcousticDSP-C++ : générateur de filtres FIR Linkwitz-Riley à phase linéaire  (Lu 6652 fois)

LeChacal619

  • Hero Member
  • *****
  • Messages: 2024
    • E-mail
Bon alors j'ai laissé un peu tomber mon projet Octave et mon projet C++ en Qt pour finalement faire une version simple en C++ en mode console qui importe les paramètres d'un fichier config.txt et génère pour l'instant seulement des filtres FIR tronqués avec une fenêtre rectangulaire à la taille souhaitée. L'impulsion est centrée pour un signal impair, et avancé de 0.5 samples pour un signal de taille pair (exemple pour un filtre passe-tout de taille 4, le filtre sera 0 1 0 0).

J'ai implémenté le code trouvé d'un algorithme FFT assez simple, ce qui me permettra en théorie de le porter facilement sous linux.

La version se trouve ici (v2014-04-09): https://drive.google.com/file/d/0B_qpfrOOECB0eFFEcVRRbFQ5Ums/edit?usp=sharing

Le filtre généré est un .txt, il suffit de l'importer sous HolmImpulse pour pouvoir visualiser sa réponse (import -> impulse -> rentrer le chemin a la main ou cliquer sur browser -> import ; si vous cliquez sur browser, n'oubliez pas de désactiver les filtres de fichiers .wav pour afficher les fichiers .txt) et éventuellement si besoin l'exporter en .wav (avec BruteFir sous linux les fichiers .txt sont parfait mais je sais que Dominique a besoin des .wav avec convolverVST ^^).

Je rajoute le fenêtrage très rapidement, la correction d'une mesure pour plus tard.
« Modifié: septembre 01, 2014, 20:05:24 pm par LeChacal619 »

LeChacal619

  • Hero Member
  • *****
  • Messages: 2024
    • E-mail
Re : AcousticDSP-C++ : générateur de filtres FIR (freeware)
« Réponse #1 le: avril 09, 2014, 09:08:41 am »
Mise à jour de la version avec ajout d'une option de configuration permettant de définir un fenêtrage rectangulaire ou gaussien (paramètre fixe 1.4 pour l'instant).

On peut également configurer cette fois la taille de FFT utilisé pour le calcul de la réponse d'impulsion du filtre, qui est en suite tronqué suivant le fenêtrage souhaité à la taille finale.

Le programme exporte cette fois 2 fichiers :

=> filtre.txt : le filtre généré
=> filtre_test.txt : le filtre généré avec du silence ajouté avant/après pour permettre une meilleure analyse de la réponse fréquentielle du filtre après importation dans un logiciel comme HolmImpulse (en effet si le filtre est trop petit la FFT sous HolmImpulse ne sera pas fidèle à la vrai réponse du filtre). C'est donc ce fichier qu'il faut utiliser pour visualiser la réponse du filtre (pas pour la convolution !!!).
« Modifié: avril 09, 2014, 09:12:24 am par LeChacal619 »

igabiva

  • Invité
Re : AcousticDSP-C++ : générateur de filtres FIR (freeware)
« Réponse #2 le: avril 23, 2014, 09:45:27 am »
Bonjour,

Je vais suivre votre projet avec intérêt car il faut que je mette en œuvre du filtrage actif sur PC.

Question idiote sans doute : qu'est-ce qui ne vous plaisait pas dans un logiciel comme Rephase pour vous lancer dans la conception ? Ça ma parait être un travail énorme !
J'avoue ne rien avoir compris dans la phrase "L'impulsion est centrée pour un signal impair, et avancé de 0.5 samples pour un signal de taille pair".

Cordialement
Patrick

LeChacal619

  • Hero Member
  • *****
  • Messages: 2024
    • E-mail
Re : AcousticDSP-C++ : générateur de filtres FIR (freeware)
« Réponse #3 le: avril 23, 2014, 09:58:56 am »
De ce qye j'ai vu rephase ne permet pas de faire des corrections de reponse d'impulsion. C'est la raison qui m'a pousse a faire mon projet (a terme je dois implementer ma correction qui n'est pas disponible pr l'instant).

En fait sur un signal pair je n'arrive pas a generer un filtre correct car le pic du filtre (s'il est lineaire donc) tombe entre 2 samples. Je fais donc le calcul comme avec un filtre impair de taille N+1 et je supprime le dernier sample, ce qui a pour effet de generer un filtre "parfait" de taille voulu mais qui du coup fait qu'il n'est pas totalement centré (le decalage temporel sera different d'un filtre pair: le filtre impair a un delai de 0.5 samples inferieur. exemple :

filtre passe tout taille 5 : 0 0 1 0 0

(Le filtre est centre et le delai est de 2 samples (un filtre de delai nul serait 1 0 0 0 0).

filtre passe tout taille 6 (pair) : 0 0 1 0 0 0 (normalement ca aurait du etre : a b 0.5 0.5 b a avec a et b des valeurs proches de 0). Le probleme dans ce cas la serait que le filtre ne serait pas passe tout il y aurait un pb de troncation avec les aetfacts qui vont avec.

En fait ca revient a faire une interpolation du filtre par 2, calculer la reponse comme s'il etait de taille impair, puis faire un downsampling avec filtrage antialiasing : il y a obligatoirement des pertes. Et theoriquement la reponse des 2 filtres ne sera pas rigoureusement identique pour cette raison.

petoind

  • Administrator
  • Hero Member
  • *****
  • Messages: 7574
    • Conception des enceintes acoustiques
    • E-mail
Re : AcousticDSP-C++ : générateur de filtres FIR (freeware)
« Réponse #4 le: avril 23, 2014, 16:36:17 pm »
Bonjour

Citer
De ce que j'ai vu RePhase ne permet pas de faire des corrections de réponse d'impulsion

Qu'est-ce une réponse d'impulsion ?

Cordialement, Dominique

LeChacal619

  • Hero Member
  • *****
  • Messages: 2024
    • E-mail
Re : AcousticDSP-C++ : générateur de filtres FIR (freeware)
« Réponse #5 le: avril 24, 2014, 09:06:47 am »
C'est la reponse de ton systeme sous forme d'un signal dans le domaine temporel.

igabiva

  • Invité
Re : AcousticDSP-C++ : générateur de filtres FIR (freeware)
« Réponse #6 le: avril 24, 2014, 10:00:11 am »
C'est bien technique !!! Ça me rappelle bien quelque chose mais ça fait tellement longtemps que j'ai tout oublié.

Je reviens sur la réponse impulsionnelle. FIR c'est l'acronyme de "Finite impulse response" c'est la même chose et c'est ce que fait Rephase non ?

Cordialement
Patrick

petoind

  • Administrator
  • Hero Member
  • *****
  • Messages: 7574
    • Conception des enceintes acoustiques
    • E-mail
Re : AcousticDSP-C++ : générateur de filtres FIR (freeware)
« Réponse #7 le: avril 24, 2014, 16:42:17 pm »
Bonjour

Lorsque je faits une mesure avec Arta, la première chose que nous obtenons est une impulsion.
Ensuite, en positionnant le trait jaune avant l'impulsion, le trait rouge plus ou moins loin après l'impulsion, en indiquant le temps entre le trait jaune et le maximum de l'impulsion, nous obtenons une courbe de réponse, de phase acoustique, le délai de groupe, avec une limite de validité dans le grave.
Ces courbes sont utilisable directement par RePhase. http://petoindominique.fr/php/mesurephase.php

Quel est l'intérêt de traiter directement l'impulsion ?

Cordialement, Dominique

LeChacal619

  • Hero Member
  • *****
  • Messages: 2024
    • E-mail
Re : Re : AcousticDSP-C++ : générateur de filtres FIR (freeware)
« Réponse #8 le: avril 25, 2014, 16:59:23 pm »
Bonjour

Lorsque je faits une mesure avec Arta, la première chose que nous obtenons est une impulsion.
Ensuite, en positionnant le trait jaune avant l'impulsion, le trait rouge plus ou moins loin après l'impulsion, en indiquant le temps entre le trait jaune et le maximum de l'impulsion, nous obtenons une courbe de réponse, de phase acoustique, le délai de groupe, avec une limite de validité dans le grave.
Ces courbes sont utilisable directement par RePhase. http://petoindominique.fr/php/mesurephase.php

Quel est l'intérêt de traiter directement l'impulsion ?

Cordialement, Dominique

Bonjour,

L'intérêt c'est que la correction est automatique et se fait en 1 clic. J'ai cru comprendre que sous Rephase il fallait régler tout les paramètres a la main ?

L'impulsion de "correction" à son pic normalisé à 0dB ce qui fait que l'on évite lors de la convolution d'avoir un gain et donc de saturer numériquement (on perd tout de même en niveau RMS global mais ça c'est un autre problème...).

Par ailleurs ma correction permet de corriger "parfaitement" la courbe qu'on lui donne, en amplitude et en phase. Après, reste à savoir si la correction est possible, si la courbe cible qu'on demande au HP est bonne, si la mesure est bonne également, s'il faut ou non fenêtrer pour avoir une bonne correction etc....

Pour l'instant seul le seul programme que je connaisse à faire cela est DRC (Digital Room Correction) mais il y a énormément de paramètres à configurer et le résultat n'est pas toujours convaincant (en tout cas pour moi j'ai l'apparition d'artefacts sonores et je ne sais pas quoi régler pour les faire disparaître).

Mon projet Octave, lui, fait cette correction automatiquement et simplement : il suffit de lui fournir une mesure, le filtre utilisé pendant la mesure, une mesure du bruit, et le courbe cible à atteindre, tout ceci sous forme d'impulsions...
« Modifié: avril 25, 2014, 17:02:24 pm par LeChacal619 »

petoind

  • Administrator
  • Hero Member
  • *****
  • Messages: 7574
    • Conception des enceintes acoustiques
    • E-mail
Re : AcousticDSP-C++ : générateur de filtres FIR (freeware)
« Réponse #9 le: avril 25, 2014, 17:07:02 pm »
RePhase sait faire les corrections, mais il faut bouger les curseurs à la souris, aussi bien pour l'amplitude que pour la phase acoustique, et dans 3 Bank différentes pour être en 1/3 d'octave de 6 Hz à 40000 Hz.
Ce n'est pas rapide, ce n'est pas en 1 clic de souris...
Et il faut recommencer pour l'autre canal !!!

Part contre cela convient à mon besoin de corriger la phase acoustique à partir d'une mesure à 65 cm des enceintes, et corriger l'amplitude à partir de la mesure au point d'écoute.

Enfin suite aux mesures précédentes, amplitude, phase et délais de groupe, je passe mes larges bandes B200 en clos dans 35 L, avec une correction spécifique dans le grave avant filtrage.

Cordialement, Dominique

LeChacal619

  • Hero Member
  • *****
  • Messages: 2024
    • E-mail
Re : AcousticDSP-C++ : générateur de filtres FIR (freeware)
« Réponse #10 le: mai 05, 2014, 21:40:42 pm »
Bonjour Dominique,

Pour ma part je ne sais pas vraiment ce qu'il est preferable de faire :

1- avoir une amplitude et phase lineaire en champ proche sans diffraction d'enceinte (correction de voie individuelle avec mesure a 1-10cm)
2- correction amplitude et phase lineaire en champ proche avec diffraction de l'enceinte (65cm par exemple) (ce que je fais), ajuster la reponse (fenetree) en amplitude/phase en position d'ecoute
3- pareil que 2 mais en corrigeant uniquement la phase et en ajustant la reponse en amplitude en position d'ecoute (ce que vous faites). Cette solution a l'inconvenient que si l'ajustement de correction en position d'ecoute se fait avec un egaliseur IIR (probablement votre cas) la phase sera accidentee apres correction...
4- corrigee l'amplitude/phase uniquement en mesure fenetree en position d'ecoute (ce que je pense qu'il serait preferable de faire)

petoind

  • Administrator
  • Hero Member
  • *****
  • Messages: 7574
    • Conception des enceintes acoustiques
    • E-mail
Re : AcousticDSP-C++ : générateur de filtres FIR (freeware)
« Réponse #11 le: mai 06, 2014, 17:03:54 pm »
Bonjour

La correction de la phase à partir d'une mesure au point d'écoute n'est pas possible : Arta ne sais pas la calculer.

Je n'ai pas essayé la mesure d'un système multi voies à 10 cm. avec les distances entre HP, cela doit être curieux.

La mesure et correction en phase et amplitude à partir des mesures à 65 cm ne me plait pas à l'écoute.
Si pour le médium aigu il n'y a pas trop de soucis, la distance avec le grave n'est plus négligeable.

Cordialement, Dominique

LeChacal619

  • Hero Member
  • *****
  • Messages: 2024
    • E-mail
Re : Re : AcousticDSP-C++ : générateur de filtres FIR (freeware)
« Réponse #12 le: mai 06, 2014, 20:32:07 pm »
Je n'ai pas essayé la mesure d'un système multi voies à 10 cm. avec les distances entre HP, cela doit être curieux.

Effectivement dans votre cas ou le filtrage est en passif vous ne pouvez pas faire fonctionner et donc mesurer/corriger vos voies indépendamment les unes des autres.

La mesure et correction en phase et amplitude à partir des mesures à 65 cm ne me plait pas à l'écoute.

Vous avez bien fenêtré la mesure avant d'appliquer la correction ? Dans votre cas (correction manuelle) je pense que l'idéal serait de faire varier le fenêtrage et de corriger la courbe en partant du haut du spectre et en descendant vers le bas (en augmentant progressivement le fenêtrage au fur et à mesure que vous descendez dans le spectre dans la correction...).

Si pour le médium aigu il n'y a pas trop de soucis, la distance avec le grave n'est plus négligeable.

Comment ça ? J'aurai dit l'inverse la variation de distance est moins importante dans le bas du spectre pour le déphasage entre les voies ?

petoind

  • Administrator
  • Hero Member
  • *****
  • Messages: 7574
    • Conception des enceintes acoustiques
    • E-mail
Re : AcousticDSP-C++ : générateur de filtres FIR (freeware)
« Réponse #13 le: mai 06, 2014, 20:46:34 pm »
Pour une mesure à 65 cm, je place le micro à mi distance en hauteur entre le médium et le tweeter.
Le grave est beaucoup plus bas.

J'utilise toujours le filtre actif DCX 2496.

La partie numérique de la chaîne :
Un mini PC avec Foobar, Resampleur SoX réglé en 24 bits à 96 kHz, sans Convolver. Sortie du son numérique par HIFACE vers le SRC via un câble CANARE 75 Ohms prises comprise.
Un BEHRINGER SRC 2496 utilisé comme sélecteur de 2 sources numérique, et pour upsampling en 24 bits à 96 kHz des sources qui ne sont pas dans ce format, la télé dans mon cas puisqu'elle arrive en 24 bits à 48 kHz.
Une carte son YELLOWTEC PUC2 LITE branchée en AES/EBU, réglé en 24 bits à 96 kHz par le pilote ASIO YELLOWTEC spécifique à cette carte, traitement par VSTHost et ConvolverVST, sotie AES/EBU vers le DCX 2496.
Les fichiers .wav pour ConvolverVST sont générés avec 6521 taps, Centering : Middle et Float, Windowing : Hamming, Optimisation : Extensive, Rate : 96000 Hz, Format : 24 bits LPCM mono .wav.
Un BEHRINGER DCX 2496, le filtre actif qui fait DAC sur les 6 voies.

Cordialement, Dominique

DanyHell

  • Jr. Member
  • **
  • Messages: 381
Re : AcousticDSP-C++ : générateur de filtres FIR (freeware)
« Réponse #14 le: mai 06, 2014, 21:28:24 pm »
>> dans votre cas ou le filtrage est en passif vous ne pouvez pas faire fonctionner et donc mesurer/corriger vos voies indépendamment les unes des autres

et pourquoi donc ce serait pas possible ??? qu'on se rassure, c'est tout a fait possible, et meme tres simple...