La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Filtre en traitement du signal entrée filtre sortie e s h

Présentations similaires


Présentation au sujet: "Filtre en traitement du signal entrée filtre sortie e s h"— Transcription de la présentation:

1 Retour sur le cours n°6 : comment créer un filtre dont la réponse fréquentielle est imposée
Filtre en traitement du signal entrée filtre sortie e s h Signal à filtrer Signal filtré Équation du filtre (non récursif) Longueur du filtre : R s est le produit de convolution de h et e avec Avec SCILAB, faire : s= convol(h,e);

2 Réponse impulsionnelle
Le vecteur h qui contient les coefficients du filtre contient aussi la réponse impulsionnelle du filtre Signal impulsion e contient le signal impulsion Réponse impulsionnelle C’est la sortie du filtre en réponse à l’entrée impulsion La réponse impulsionnelle du filtre est h.

3 La réponse fréquentielle est la transformée de Fourier de la réponse impulsionnelle
D’après la démonstration du cours 6, page 7 S=fft(s(1:R)) contient le spectre de s(1:R) E=fft(e(1:R)) contient le spectre de e(1:R) H=fft(h) est la réponse fréquentielle du filtre dont la réponse impulsionnelle est h (de longueur R) h=ifft (H) est la réponse impulsionnelle du filtre dont la réponse fréquentielle est H (longueur R) Mais le vecteur H ne contient que R valeurs de la réponse fréquentielle H(f) du filtre, pour les seules fréquences k*fe /R, k=0…R-1

4 D’où le principe de calcul des coefficients d’un filtre dont la réponse fréquentielle est imposée
On spécifie la réponse fréquentielle H(f) imposée entre 0 et fe dans un vecteur H de taille R, puis on calcule les R coefficients du filtre dans h : Créer H = {Hk= H(kfe/R), k=0...R-1} Calculer les R coefficients du filtre avec h = ifft(H) (h est la réponse impulsionnelle du filtre) Deux contraintes : h doit être un vecteur réel comme e (sinon, le signal filtré s= h*e sera à valeurs complexes et non réelles) Pour cela, il suffit que H(f) soit symétrique par rapport à la fréquence fe/2 (démo cours 6, page 6) H(f) doit rester proche de H même entre les valeurs Hk imposées aux fréquences kfe/R H(f) Hk+1 Hk f k*fe/R (k+1)*fe/R

5 Comment vérifier que ces deux contraintes sont remplies
1. On sait imposer h réel D’après la démonstration du cours 6 page 6, h=ifft(H) est réel si : ce qui implique aussi : H(f)=H(fe/2-f) vérification Scilab : imag(ifft(H)) doit être nul Calcul : h= real(ifft(H)) impose un format réel à h 2. On peut vérifier que H(f) reste proche de H entre f=kfe/R et f= (k+1)fe/R Il suffit de calculer plus de R valeurs de H(f), cf. page 10 du cours 6. Avec Scilab : h=real(ifft(H)) // calcule R valeurs dans h HR=fft(h) // calcule R valeurs de H(f) H16R= fft([h, zeros(1,15*R)]) // calcule 16*R valeurs

6 Avec le vecteur H2 ci-dessous qui est symétrique par rapport à R/2, la partie imaginaire de h est bien nulle fe=8000; R=64; // H2 symétrique par rapport à R/2 H2 = 4*[zeros(1,R/8),ones(1,1+R/8),zeros(1,-1+R/2), ones(1,1+R/8), zeros(1,-1+R/8)]; h=ifft(H2); t=[0:R-1]/fe; plot2d(t',[real(h'),imag(h')]) e=gce(); e.children(1).thickness=3; xgrid(); xtitle("vérification: imag(ifft(H))=0",... "temps (s)","donc h=real(ifft(H))") h1=legend(['real(h)';'imag(h)']) H(f) et H2 sont superposées Symétrie de H(f) par rapport à 400Hz symétrie de H2 par rapport à R/2 : H2m=H2R-m, m=0..R-1 fréquences de coupure fe= 8000Hz, R=64 fe/64 = 125 Hz et donc (R/8)*fe/64= 1000 Hz H(f)

7 Mais entre les valeurs H(kfe/R) imposées dans H2, on peut constater ci-dessous desécarts importants avec H(f) Pour tracer R valeurs de la réponse fréquentielle du filtre de coefficients h=real(ifft(H2)), on trace abs(fft(h)) Pour tracer 16*R valeurs au lieu de R, on augmente le vecteur h de 15*R coefficients nuls : M=16*R; fe=8000; fM=[0:M-1]*fe/M; h=real(ifft(H2)); hM=zeros(1,M); hM(1:R)=h; plot2d(fM,abs(fft(hM))) xgrid(); xtitle(["tracé de … h=real(ifft(H2))) sur",string(M),"points"] ... ,"fréquence (Hz)","H=abs(fft(h))") H(f)

8 D’où proviennent ces écarts avec H(f) entre les fréquences k*fe/R, k=0.. R-1 ?
Hypothèse : l’écart provient de la discontinuité au début de la réponse impulsionnelle (discontinuité égale hautes fréquences). Proposition : puisque ifft(H2) est périodique de période R/fe, cf. cours 6 page 5, on retarde la réponse impulsionnelle de la moitié de sa durée de façon à réduire la discontinuité, avec la fonction fftshift qui permute les deux moitiés du vecteur h (cf. ci-dessous):

9 Pour vérifier, on calcule h=fftshift(real(ifft(H2))) et on compare la réponse fréquentielle obtenue à H(f) H2 = 4*[zeros(1,R/8),ones(1,1+R/8),zeros(1,-1+R/2), ones(1,1+R/8), zeros(1,-1+R/8)]; R=64; M=16*R; h= fftshift(real(ifft(H2))); fM=[0:M-1]*fe/M; hM= zeros(1,M); hM(1:R)=h; plot2d(fM, abs(fft(hM))) xgrid(); xtitle(["tracé de abs(fft(fftshift(real(ifft(H))))),", string(M)," points"],"fréquence (Hz)","H") H(f)

10 En arrondissant ‘légèrement’ la réponse fréquentielle H2 comme ci-dessous, voici ce qu’on obtient !
Aux fréquences de coupure haute et basse de H2, on impose un gain de 0.5 au lieu de 1, soit : H2= 4*[zeros(1,R/8),0.5,ones(1,R/8-1),0.5, … zeros(1,-1+R/2),0.5,ones(1,R/8-1),0.5,zeros(1,-1+R/8)]; Au lieu de : H2 = 4*[zeros(1,R/8), ones(1,1+R/8), zeros(1,-1+R/2), ones(1,1+R/8), zeros(1,-1+R/8)]; On crée des fréquences de coupure à -6dB fc1=1000Hz est une fréquence de coupure à – 6 dB : en effet, H(1000)= 2= 4 x 0.5, moitié du gain de la bande passante (et on a 0.5 ~ -6 dB)

11 Fréquences de coupures à -6db ?
Solution retenue : on arrondit un peu plus la réponse fréquentielle définie dans H2 (cf. page 12 du cours n°6), H2= 4*[zeros(1,R/8-1),0.1,0.5,0.9,ones(1,R/8-3),0.9,0.5,0.1, ... zeros(1,-3+R/2),0.1,0.5,0.9,ones(1,R/8-3),0.9,0.5,0.1, ... zeros(1,-2+R/8)]; H2 Fréquences de coupures à -6db ?

12 En résumé, créer et utiliser le filtre du cours n°6
H(f) d’où le vecteur H2: H2 = 4*[zeros(1,R/8), ones(1,1+R/8), zeros(1,-1+R/2), ones(1,1+R/8), zeros(1,-1+R/8)]; Arrondir H2 dans H2a H2a= 4*[zeros(1,R/8),0.5,ones(1,R/8-1),0.5, … zeros(1,-1+R/2),0.5,ones(1,R/8-1),0.5,zeros(1,-1+R/8)]; Arrondir davantage H2aa= 4*[zeros(1,R/8-1),0.1,0.5,0.9,ones(1,R/8-3),0.9,0.5,0.1, ... zeros(1,-3+R/2),0.1,0.5,0.9,ones(1,R/8-3),0.9,0.5,0.1, zeros(1,-2+R/8)]; Utiliser le filtre H2aa: h2= fftshift(real(ifft(H2aa))); // pour calculer les coefficients du filtre [e, fe]= wavread(‘signal.wav’); // pour charger le signal et fe s= convol(h2,e); // pour filtrer le signal e dans s


Télécharger ppt "Filtre en traitement du signal entrée filtre sortie e s h"

Présentations similaires


Annonces Google