Retour sur les filtres et bancs de filtres
Retour sur les filtres et bancs de filtres Jean-Paul Stromboni, décembre 2007
en résumé • un banc de filtres est conçu pour découper précisément le spectre d'un signal audio • pour constituer un banc de filtres, on peut créer et décaler un filtre générateur • un filtre non récursif peut être mis en œuvre à partir de sa seule réponse impulsionnelle • la réponse impulsionnelle d'un filtre linéaire et stationnaire peut être déduite de la réponse harmonique par transformée de Fourier inverse • pour quantifier l'effet d'un filtre sur un signal, on peut considérer l'énergie du signal filtré
1. définir un filtre quasi rectangulaire à partir de sa réponse harmonique • Quel est le résultat du script MATLAB suivant ? R=32 fe=8000; H=[ones(1, 3), . 9, . 5, . 1, zeros(1, 21), . 1, . 5, . 9, 1, 1]; fr=[0: R-1]*fe/R; stem(fr, H) grid xlabel('f (Hz)') title('réponse harmonique H')
qu'est ce qui change si on utilise l'instruction suivante : stem(fr-4000, fftshift(H)) • tracer le résultat • donner • le type du filtre : • sa fréquence de coupure à – 6 d. B, soit fc : • sa longueur : • sa largeur (en Hz) à -6 d. B : • sa fréquence d'échantillonnage : • sa résolution fréquentielle :
Mon premier banc de filtres ? • tracer la réponse harmonique HH=1 -H ci-dessous • préciser : – le type du filtre HH – sa longueur – sa largeur à -6 d. B • Pourquoi H et HH constituent ils un banc de filtres ?
2. mettre le filtre H en œuvre • les instructions suivantes calculent la réponse impulsionnelle h du filtre de réponse harmonique H h=fftshift(real(ifft(H))); stem(h) grid title(['rép. impuls. h, longueur=', num 2 str(length(h))]) xlabel('indice n de l''échantillon hn') • length(h) = ? • H est il un filtre FIR ou IIR?
Pour appliquer le filtre de réponse impulsionnelle h=(h 0, h 1, …h 31) au signal e de longueur length(e) • retrouver le résultat : sn=h 0 en+h 1 en-1+h 2 en-2+ … + h 31 en-31 • que réalise le script suivant ? e=0. 6*cos(2*pi*1000*t); s=zeros(size(e)); for n=1: length(e) for k=1: R if n-k+1>0, s(n)=s(n)+h(k)*e(n-k+1); end end • pour filtrer, on utilisera plus aisément l'instruction 'filter' de MATLAB. Explicitez les arguments : s=filter(h, 1, e);
3. exploiter la réponse harmonique • quel est l'effet du script suivant ? fe=8000; t=0: 1/fe: 2; e=0. 6*cos(2*pi*1000*t); s=filter(h, 1, e); plot(t, e, t, s) legend('e', 's') • que peut on prévoir au vu de H ? • et si la fréquence de e valait 440 Hz ? • et si elle valait 1500 Hz ?
4. Calculer l'énergie d'un signal • rappeler la définition de l'énergie du signal e de longueur length(e) : • que donne Ee=e'*e/2 en Matlab selon que size(e)=(16001, 1) ou size(e)=(1, 16001) ? • avantage selon vous de Ee=sum(e. *e)/2 ?
5. créer les filtres du banc en décalant la réponse harmonique H • reprendre H représenté entre –fe/2 et – décaler de k 0=4 points vers la droite – décaler de k 0=4 points vers la gauche – additionner : caractériser le filtre résultat nommé H 1
et si on décale maintenant de k 0=12 points, quel est le filtre résultat H 2 ? • nature de H 2, largeur, … • H 1 et H 2 constituent ils un banc de filtres ?
Pour décaler H de f 0, on peut aussi modifier la réponse impulsionnelle h. • Quel est le résultat du script suivant ? R=32; n=0: R-1; k 0=4; h 1=2*cos(2*pi*k 0*n/R). *h; subplot(2, 1, 1) stem(fr-4000, fftshift(abs(fft(h 1)))) grid xlabel('f (Hz)') title('tracé de H 1') subplot(2, 1, 2) k 0=12; h 2=2*cos(2*pi*k 0*n/R). *h; stem(fr-4000, fftshift(abs(fft(h 2)))) grid xlabel('f (Hz)') title('tracé de H 2')
Construire un banc de 4 filtres sur le même principe à l'aide de Matlab • quelle est la largeur du filtre générateur ? chaque filtre est de largeur le filtre générateur est de largeur d'où H= [ • calculer la réponse impulsionnelle h associée à H : h=fftshift(real(ifft(H)); • calculer les 4 réponse impulsionnelles dans une boucle et les stocker dans un tableau ri ( ? , ? ) : pour H 1, k 0= (R/4*M) pour H 2, k 0= 3*R/(4*M) pour H 2, k 0= 5*R/(4*M) pour H 2, k 0= 7*R/(4*M) h 1 n=2 cos(2*pi*n*(R/(4*M))/R)hn h 2 n=2 cos(2*pi*n*3*(R/(4*M))/R)hn h 2 n=2 cos(2*pi*n*5*(R/(4*M))/R)hn h 2 n=2 cos(2*pi*n*7*(R/(4*M))/R)hn for k=0: 3 ri(k+1, : )=2*cos(2*(2*k+1)*pi*[0: R-1]/(4*M)). *h; end
Construire un banc de 4 filtres sur le même principe à l'aide de Matlab • Tracer les réponses harmoniques des filtres du banc for k=1: 4 stem(fr-fe/2, fftshift(abs(fft(ri(k, : )))); hold on end hold off • Filtrer e dans une boucle et placer les signaux filtrés dans un tableau efiltre(? , ? ) for k=1: 4 yfiltre(k, : )=filter(ri(k, : ), 1, e); end • Calculer et tracer les énergies des signaux filtrés E=diag(yfiltre*yfiltre'); bar([0: 3]*fe/4, 100*E/sum(E)) grid
analyse de Bbc. wav
Sujet de travaux dirigés 1. Filtrer : créer un filtre passe bande de longueur R=256, de fréquences de coupure 500 Hz et 1000 Hz : 1. d'abord si fe = 8 k. Hz, 2. puis en prenant en compte de la valeur de fe. On évaluera l'effet de ce filtre, à l'oreille, à l'aide du spectrogramme, et à l'aide de l'énergie. 2. Banc de filtres : 1. créer un banc de M=8 filtres permettant d'analyser un signal tiré d'un fichier wave. La longueur des filtres est R=128. 2. Appliquer le banc de filtres à différents signaux, et négliger les bandes de plus faible énergie, tant que la qualité du signal approximé est jugée bonne.
- Slides: 16