SSII : séance finale , lundi 9/01/2012 Page 1 Voici quelques questions pour assimiler la seconde partie du cours S.S.I.I., spectre, filtrage, banc de filtres, compression, … Préparer les réponses avant le cours, en saidant des polycopiés, des travaux dirigés, et de Scilab ou de Matlab pour vérifier les prévisions et faire des calculs. I - Filtre : on définit à laide de Matlab ou de Scilab un filtre H1 en imposant les R=32 valeurs de sa réponse fréquentielle qui sont réparties régulièrement sur lintervalle de fréquence allant de 0 à fe=8kHz et placées dans le vecteur H1 suivant : H1=[ones(1,7),0.1,0.5,0.9,zeros(1,13),0.1,0.5,0.9,ones(1,6)]; 1. préciser les instructions Matlab ou Scilab qui permettent de tracer H1 entre 0 et fe. 2. tracer maintenant H1 entre –fe/2 et fe/2, préciser gain statique et fréquence de coupure 3.on la vu en cours, linstruction h=fftshift(real(ifft(H1))) calcule la réponse impulsionnelle du filtre de réponse fréquentielle H1 dans le vecteur h=[h0,h1, … hR-1]: 1. que réalise ifft(H1) ? 2. pourquoi real(ifft(H1)) et pourquoi pas abs(ifft(H1)) ? 3. pourquoi utiliser fftshift ? 4. écrire léquation à programmer pour filtrer un signal composé de N échantillons contenus dans le vecteur e=[e0,e1, … eN-1] 5. prévoir leffet du filtre sur le spectre du signal contenu dans e ? 6. calculer la sortie du filtre si lentrée e est une impulsion : e0=1 et e1=e2=…=eN-1=0. II – Signal et signal filtré : on applique à lentrée du filtre H1 précédent un signal sinusoïdal de fréquence f0=1000 Hz et damplitude a= 0.8 échantillonné à la fréquence fe=8000 Hz. 1. Quel est le tracé obtenu si on exécute les instructions Matlab suivantes ? N=8192 fe=8000 f=[0 :N-1]*fe/N ; plot(f,abs(fft(e(1:N))/N) 2. linstruction Matlab : e1=filter(h,1,e) ; ou linstruction Scilab: e1=convol(h,e), filtrent e et placent le signal filtré dans le vecteur e1, comment prédire la valeur de e1 ? 3. et si f0 valait 2000 Hz, puis 2250Hz, puis 2500Hz, quel serait leffet sur le vecteur e1 ? on crée le vecteur e1d avec linstruction : e1d=e1(1 :2 :length(e1)); préciser la taille de e1d, sa fréquence déchantillonnage, et tracer le spectre de e1d 4. on crée maintenant le vecteur e1se en exécutant les deux instructions ci-dessous, préciser la taille, la fréquence déchantillonnage et le spectre du signal e1se : e1se=zeros(1,length(e1)) ; e1se(1 :2 :length(e1))=e1d ; 5. proposer un filtre capable de reconstituer le spectre de e1 à partir de celui de e1se. III- Banc de filtres et compression : On construit un banc de deux filtres dont les réponses fréquentielles sont fixées dans le vecteur H1 précédent et un vecteur H2 à déterminer : 1. déterminer le vecteur H2 à partir du vecteur H1 précédent 2. tracer H2 entre 0 et fe, préciser gain statique et fréquences de coupure basse et haute 3. comment faire calculer la réponse impulsionnelle du filtre H2 dans le vecteur h2 ? 4. que contient le vecteur e2=filter(h2,1,e) ? Que peut-on prédire pour la valeur de e2 ? 5. si on néglige la sortie e2 du filtre H2 devant la sortie e1 de H1, quel est le taux de compression qui en résultera dans la structure de principe vue en cours ? 6. calculer lénergie du signal e (on suggère dutiliser le théorème de Parseval, à tirer du cours)
SSII : séance finale , lundi 9/01/2012 Page 2 I – Filtre: tracer H1 entre 0 et fe fe=8000; R=32; H1=[ones(1,7),0.9,0.5,0.1,zeros(1,13),0.1,0.5,0.9,ones(1,6)]; f=[0:R-1]*fe/R; plot2d3(f,H1) xgrid() xlabel("fréquence (Hz)") ylabel("H1") title(["tracé de H1 ",string(R)," valeurs."])
SSII : séance finale , lundi 9/01/2012 Page 3 I – Filtre tracer entre –fe/2 et fe/2 plot2d3(f-fe/2,fftshift(H1))
SSII : séance finale , lundi 9/01/2012 Page 4 I – Filtre : réponse impulsionnelle h clf(); h=fftshift(real(ifft(H1))); plot2d3([0:R-1]/fe,h) xgrid(); xlabel("temps(s)") ylabel("h"); ifft calcule la TDF inverse, cest une quantité complexe real prend la partie réelle, avantage sur abs, elle peut être négative fftshift permet davoir un filtre causal, h débute en t=0 et pas avant
SSII : séance finale , lundi 9/01/2012 Page 5 I – Filtre : effet de H1 sur le spectre dun signal e filtre passe bas, qui supprime les fréquences > 2000Hz : il multiplie par 1 les composantes du spectre de e entre 0 et 1500Hz, Doù le gain statique égale à 1 par 0.5, la composante du spectre de e de fréquence 2000Hz, doù la fréquence de coupure à -6dB par 0.9, à la fréquence Par 0.1 à la fréquence
SSII : séance finale , lundi 9/01/2012 Page 6 I – Filtre : réponse à une entrée impulsion La réponse à une impulsion e 0 =1 et e 1 =e 2 =…=e N-1 =0 est la réponse impulsionnelle, en effet, seul e 0 =1 est différent de 0, Il en résulte e1 n =h n, n=0.. R-1 Doù la dénomination filtre à réponse impulsionnelle finie, car de durée RTe, Et R longueur du filtre
SSII : séance finale , lundi 9/01/2012 Page 7 II – Signal et signal filtré : spectre de e // signal N=8192; fe=8000; f=[0:N-1]*fe/N; a=0.8; f0=1000; e=a*sin(2*%pi*f0*t); //calcul du spectre plot(f,abs(fft(e)/N)) xgrid(); xlabel("fréquence (Hz)") ylabel("abs(fft(e))/N") title("spectre de e divisé par la taille de la fenêtre")
SSII : séance finale , lundi 9/01/2012 Page 8 II – Signal et signal filtré : H1 filtre e //filtrage e1=convol(h,e); e1=e1(1:N); plot(f,abs(fft(e1(1:N))/N)) xgrid(); xlabel("fréquence (Hz)"); ylabel("abs(fft(e1(1:N)))/N") title("spectre de e1 divisé par la taille de la fenêtre")
SSII : séance finale , lundi 9/01/2012 Page 9 II – Signal et signal filtré : il y a un régime transitoire du filtre qui dure à peu près RTe plot(t,e,t,e1) legend("e","e1") xgrid();
SSII : séance finale , lundi 9/01/2012 Page 10 II – Signal et signal filtré : f0=2000Hz f0= 2000Hz // le gain de H1 vaut 0.5 et non plus 1
SSII : séance finale , lundi 9/01/2012 Page 11 II – Signal et signal filtré : sous échantillonnage //sous échantillonnage e1d=e1(1:2:length(e1)); Nd=length(e1d); fd=[0:Nd-1]*fe/(2*Nd); plot(fd,abs(fft(e1d))/length(e1d)) xgrid(); xlabel("fréquence (Hz)") ylabel("abs(fft(e1d))/length(e1d)") title("spectre de e1d divisé par la taille de la fenêtre") La contrainte de Shannon est respectée ?
SSII : séance finale , lundi 9/01/2012 Page 12 II – Signal et signal filtré : sur échantillonnage //sur échantillonnage e1se=zeros(1,length(e1)); e1se(1:2:length(e1))=e1d; //calcul du spectre plot(f,abs(fft(e1se)/N)) xgrid(); xlabel("fréquence (Hz)"); ylabel("abs(fft(e1se))/N") title("spectre de e divisé par la taille de la fenêtre")
SSII : séance finale , lundi 9/01/2012 Page 13 II – Signal et signal filtré : reconstruire e1 //reconstruction de e1 à partir de e1se e1r=convol(2*h,e1se); e1r=e1r(1:N); plot(f,abs(fft(e1r)/N)) … Il faut prendre 2H1 au lieu de H1
SSII : séance finale , lundi 9/01/2012 Page 14 II- Banc de filtres : //Banc de filtres H2=1-H1; f=[0:R-1]*fe/R; plot(f,H1,f,H2) xgrid() legend("H1","H2") xlabel("fréquence (Hz)") ylabel("H1 et H2") title(["réponse fréquentielle des filtres du banc ",string(R)," valeurs."]) Gain statique H2 = 0 Fréquence coupure basse à -6dB = 2000 Hz Fréquence coupure haute = 4000 Hz Filtre passe haut
SSII : séance finale , lundi 9/01/2012 Page 15 II- Banc de filtres : h2=fftshift(real(ifft(H2))); plot2d3([0:R-1]/fe,h2) xgrid(); xlabel("temps(s)") ylabel("h2");
SSII : séance finale , lundi 9/01/2012 Page 16 II- Banc de filtres : e filtré par H2 e2 sera nul, car 3000Hz est hors de la bande passante de H2
SSII : séance finale , lundi 9/01/2012 Page 17 III- Banc de filtres et compression Si on néglige e2 devant e1, après tout, lénergie de e2 est nulle, on obtient un taux de compression de C=M/K=2 Si on exprime en plus e1 sur 7 bits au lieu de 8, on obtient ? –C–C= 16/7 = 2.3 environ … compresser e e1e1 ed 1 e1se e rec H1H1 H2H2 conserver K signaux sur M bandes xdi, i=1..M e2e2 ed 2 banc de M=2 filtres e2se banc de filtres e1interp e2interp
SSII : séance finale , lundi 9/01/2012 Page 18 II- Banc de filtres : function [E]=energie(s) //fichier energie.sci E=0; for i=1:length(s) E=E+s(i)^2; end E=E/2; endfunction //énergie exec("energie.sci"); E=energie(e) // résultat obtenu : E= Daprès Parseval :