170 likes | 402 Views
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
E N D
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 dB, soit fc : • sa longueur : • sa largeur (en Hz) à -6 dB : • 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 dB • 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=',num2str(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=(h0,h1,…h31) au signal e de longueur length(e) • retrouver le résultat : sn=h0en+h1en-1+h2en-2+ … + h31en-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 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 440Hz ? • et si elle valait 1500Hz ?
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 fe/2 et • décaler de k0=4 points vers la droite • décaler de k0=4 points vers la gauche • additionner : caractériser le filtre résultat nommé H1
et si on décale maintenant de k0=12 points, quel est le filtre résultat H2 ? • nature de H2, largeur, … • H1 et H2 constituent ils un banc de filtres ?
Pour décaler H de f0, on peut aussi modifier la réponse impulsionnelle h. • Quel est le résultat du script suivant ? • R=32; • n=0:R-1; • k0=4; • h1=2*cos(2*pi*k0*n/R).*h; • subplot(2,1,1) • stem(fr-4000,fftshift(abs(fft(h1)))) • grid • xlabel('f (Hz)') • title('tracé de H1') • subplot(2,1,2) • k0=12; • h2=2*cos(2*pi*k0*n/R).*h; • stem(fr-4000,fftshift(abs(fft(h2)))) • grid • xlabel('f (Hz)') • title('tracé de H2')
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 largeurle filtre générateur est de largeurd'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 H1, k0= (R/4*M) h1n=2cos(2*pi*n*(R/(4*M))/R)hnpour H2, k0= 3*R/(4*M) h2n=2cos(2*pi*n*3*(R/(4*M))/R)hn pour H2, k0= 5*R/(4*M) h2n=2cos(2*pi*n*5*(R/(4*M))/R)hn pour H2, k0= 7*R/(4*M) h2n=2cos(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 bancfor k=1:4 stem(fr-fe/2,fftshift(abs(fft(ri(k,:)))); hold onendhold 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ésE=diag(yfiltre*yfiltre');bar([0:3]*fe/4,100*E/sum(E))grid
Sujet de travaux dirigés • Filtrer : créer un filtre passe bande de longueur R=256, de fréquences de coupure 500Hz et 1000Hz : • d'abord si fe = 8kHz, • 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. • Banc de filtres : • 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. • 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.