Acoustic passion

Acoustic passion

Filtre antialiasing

Bonjour à tous !

 

Cette fois j'ai travaillé un peu sur le filtre antialiasing. Après m'être aperçu que le filtrage apporte du "ringing" (un artefact parfaitement audible et pourtant indécelable sur une mesure) lorsque la pente du filtrage est importante, je me suis mis a analysé la réponse d'impulsion du filtre antialiasing. La courbe d'amplitude butterworth ne permettant pas d'obtenir un amortissement de la réponse d'impulsion suffisamment court, je me suis mis a chercher un nouveau type de courbe, personnalisé cette fois.

Avec un filtre butterworth et une fc de 20khz et une pente suffisamment importante pour atteindre une réjection d'au moins 60dB a 22khz, la réponse d'impulsion a une résonance énorme, étalée avant et après le pic d'impulsion dû a une phase linéaire.

 

En étudiant plusieurs type de pentes, je me suis aperçu qu'il fallait non seulement une faible pente pour atténuer ce "ringing" mais également un "angle" de chute de la courbe plus faible (avec un filtrage butterworth même a faible pente l'angle n'est pas optimal : il descend lentement puis brusquement au point de coupure pour atteindre la pente de coupure souhaitée). L'angle de courbure du butterworth sur la courbe amplitude n'est pas adaptée pour limiter au maximum les oscillations.

J'ai donc réalisé un filtre sur mesure a la main, a partir d'une fonction que j'ai "fabriqué" aux petits oignons a partir de la tangente hyperbolique. J'ai adapté cette fonction pour pouvoir changer la fc et adapter la courbure de chute de l'amplitude au besoin (la coupure a -6dB est a environ 18500hz, j'ai adapté l'angle pour qu'il corresponde a mon tweeter : comme celui-ci ne reproduit pas les fréquences >20000hz correctement, j'ai adapté l'angle pour la "pente" verticale se situe a 20000hz environ). Mais avec un tweeter reproduisant des fréquences plus importantes on aurait pu envisager une courbure plus faible donc moins "brutale".

Ca c'est pour la courbe amplitude. Pour la courbe de phase, étant donné que de nombreux articles estiment que notre oreille (et notre cerveau) n'apprécie pas une "préoscillation" avant le pic d'impulsion (dans la réalité, puisque la bande passante des sons n'est pas limitée, le son naturel ne comporte pas d'oscillation ni avant le pic ni après), et qu'il a été démontré par de nombreuses études que notre cerveau a un effet de "masque" (effet "haas") qui assimile l'énergie située après une impulsion a cette impulsion elle-même, j'ai décidé de "déphaser" mon impulsion. Après avoir réfléchi a la courbe de déphasage a choisir, j'ai tout simplement appliqué le même déphasage que le déphasage naturel : je m'explique !

Dans la réalité, lorsque la courbe d'une filtre analogique ou numérique IIR (c'est la même chose) chute de 6dB, il s'ensuit d'un déphasage de 90° (normal : deux sinusoides déphasées de 90° ont une amplitude totale de 0.5 fois l'amplitude des 2 mêmes sinusoides en phase). J'ai suis donc parti de ce principe pour calculer la phase a partir de ma courbe amplitude :

Avec un brouillon j'ai déduis :

A 0dB, l'amplitude normalisée vaut 1, le déphasage vaut 0°
A -6dB, l'amplitude vaut 0.5, le déphasgae vaut +/-90°
A -infini dB, l'amplitude vaut 0, le déphasage vaut +/-180°.

La phase a donc un comportement linéaire en fonction de l'amplitude, variant de 0 a -180° (je souhaite retardé la phase lorsque l'amplitude diminue) lorsque l'amplitude linéaire varie de 1 a 0.

Après calcul de l'amplitude et phase, j'ai importé sous HolmImpulse et surprise : les préoscillations sont parfaitement supprimées, et toute l'énergie de résonance du filtre se situe bien après le pic d'impulsion. De plus, avec la courbure douce appliquée a la réponse d'impulsion, j'atteint (a mes yeux) le meilleur compromis en terme de courbe amplitude / capacité de réjection (dynamique infinie si filtre de qualité infinie... contrairement au filtre butterworth ou l'amplitude est fonction de la pente et de la fc uniquement). Ici, la pente devient asymptotique a une verticale, donc on peut atteindre le niveau de réjection que l'on veut....

Dans ma feuille de calcul l'équation vaut ceci :

Amplitude (en dB) = 20*LOG(-TANH(((w-Fc)/7000)-1)*0,9+0,1)

Avec w = fréquence dont on souhaite calculer l'amplitude correspondante
Fc = fréquence de coupure (grosso modo a partir du moment ou chute la courbe amplitude, dans le calcul du filtre ci-après la fc est de 13000hz)
7000 étant le paramètre sur lequel j'influe pour faire varier la courbure du filtre (plus j'augmente ce paramètre plus la courbure est faible : c'est un peu la largeur de bande de transition...).

Pour le déphasage en fonction de l'amplitude (et la fréquence associée) le calcul est plus simple :

Déphasage (en °) = EXP(A*LN(10)/20)*180-180 (A = amplitude en dB) ou
Dépgasage (en °) = A' *180-180 (A' = amplitude linéaire).

On voit bien que (si l'on prend A') : A'=0 ==> 0*180-180=-180° : c'est bon... A'=1 ==> 1*180-180=0° : c'est bon aussi (lorsque l'amplitude vaut 1, en dB ca vaut 0, ca signifie aucune atténuation donc une cohérence parfaite : pas de déphasage).

Voici le graphe des courbes amplitudes/phases + réponse d'impulsion avec une amplitude du pic normalisée a 1, l'échelle de temps va de -0.2 a 0.4ms (c'est très peu !).

 

https://picasaweb.google.com/lh/photo/VvIUXp2qLkFzkrM8sHaOi98UwN8kjbVPbzTHADC9MPo?feat=directlink

 

On peut voir sur le réponse temporelle qu'il n'y a aucune préoscillation (du moins négligeable : <-40dB), l'oscillation situé après le pic ne correspond pas a une fréquence fixe contrairement aux filtres butterworth (exemple : un filtre butterworth a fc=20khz aura des oscillations de 20khz uniquement, étalées après le pic s'il s'agit d'un filtre naturel ou autour du pic si la phase est constante). Le retour a l'état stationnaire est a environ 0.2ms après le pic d'impulsion... La bande de réjection est aussi grande que l'on veut suivant le nombre de coefficients du filtre, bref que des avantages ? ;)

Ici l'échelle des dB est limitée mais sur un filtre de -8192 a 8191 samples (16384 coefficients) que j'utilise pour mon système la bande de réjection se situe en dessous de -120dB....

 

Voici le fichier que j'ai utilisé pour designer le filtre, j'ai simplement copié les colonnes fréquences/amplitude/phase dans un fichier texte puis importé le tout sous HolmImpulse en fréquence en cochant l'importation de phase (en °). Ensuite il suffit d'exporter la réponse d'impulsion calculé par la FFT de HolmImpulse en adaptant les index dans l'onglet "impulse" pour adapter la taille du filtre a vos besoins (en faisant attention a configurer une FFT suffisamment précise aussi dans l'onglet "Data analysis"). Il faut aussi faire très attention a DECOCHER la case "normalise amplitude" sinon vous risquez fort de griller vos HPs après convolution du filtre car le gain après normalisation de HolmImpulse peut atteindre plus de 30dB !

 

On pourrait peauffiner cette fonction pour l'adapter a un filtrage multivoies et voir ce que ça donne. Attention tout ce que je dis dans cet article est a prendre avec des pincettes : il ne s'agit là que d'une réflexion personnelle et en aucun cas d'une preuve ou d'une démonstration scientifique de la qualité de mon filtre. Je pense qu'il est plus approprié que les autres types de filtres, mais je peux me tromper !

 

La feuille excel m'ayant permit de designer le filtre : https://www.blog4ever.com/blog/fichier-1003078-1466367-378765.html



25/06/2012
0 Poster un commentaire

Inscrivez-vous au blog

Soyez prévenu par email des prochaines mises à jour

Rejoignez les 20 autres membres