180 likes | 283 Views
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 s’aidant des polycopiés, des travaux dirigés, et de Scilab ou de Matlab pour vérifier les prévisions et faire des calculs.
E N D
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 s’aidant 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 à l’aide 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 l’intervalle 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)]; • préciser les instructions Matlab ou Scilab qui permettent de tracer H1 entre 0 et fe. • tracer maintenant H1 entre –fe/2 et fe/2, préciser gain statique et fréquence de coupure • on l’a vu en cours, l’instruction 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]: • que réalise ifft(H1) ? • pourquoi real(ifft(H1)) et pourquoi pas abs(ifft(H1)) ? • pourquoi utiliser fftshift ? • écrire l’équation à programmer pour filtrer un signal composé de N échantillons contenus dans le vecteur e=[e0,e1, … eN-1] • prévoir l’effet du filtre sur le spectre du signal contenu dans e ? • calculer la sortie du filtre si l’entrée e est une impulsion : e0=1 et e1=e2=…=eN-1=0. • II – Signal et signal filtré : on applique à l’entrée du filtre H1 précédent un signal sinusoïdal de fréquence f0=1000 Hz et d’amplitude 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. l’instruction Matlab : e1=filter(h,1,e) ; ou l’instruction 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 l’effet sur le vecteur e1 ? • on crée le vecteur e1d avec l’instruction : 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 d’utiliser le théorème de Parseval, à tirer du cours)
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."])
I – Filtre tracer entre –fe/2 et fe/2 plot2d3(f-fe/2,fftshift(H1))
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, c’est une quantité complexe real prend la partie réelle, avantage sur abs, elle peut être négative fftshift permet d’avoir un filtre causal, h débute en t=0 et pas avant
I – Filtre : effet de H1 sur le spectre d’un 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, D’où le gain statique égale à 1 par 0.5, la composante du spectre de e de fréquence 2000Hz, d’où la fréquence de coupure à -6dB par 0.9, à la fréquence Par 0.1 à la fréquence
I – Filtre : réponse à une entrée impulsion La réponse à une impulsion e0=1 et e1=e2=…=eN-1=0 est la réponse impulsionnelle, en effet, seul e0=1 est différent de 0, Il en résulte e1n=hn, n=0 .. R-1 D’où la dénomination filtre à réponse impulsionnelle finie, car de durée RTe, Et R longueur du filtre
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")
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")
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();
II – Signal et signal filtré : f0=2000Hz f0= 2000Hz // le gain de H1 vaut 0.5 et non plus 1
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 ?
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")
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
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
II- Banc de filtres : h2=fftshift(real(ifft(H2))); plot2d3([0:R-1]/fe,h2) xgrid(); xlabel("temps(s)") ylabel("h2");
II- Banc de filtres : e filtré par H2 e2 sera nul, car 3000Hz est hors de la bande passante de H2
compresser banc de filtres banc de M=2 filtres conserver K signaux sur M bandes xdi, i=1..M e1interp e1 ed1 e1se H1 e erec e2 ed2 e2se H2 e2interp 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= 16/7 = 2.3 environ …
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= 1310.72 D’après Parseval :