Construire et utiliser un banc de filtres Jean-Paul Stromboni, Polytech'Nice Sophia, S.I. 3ème année cours 7, novembre 2015, durée : 50mn, vidéoprojecteur Les objectifs de ce cours : Définir le concept de banc de filtre et d’analyse du signal Expliquer la fonction et l’utilisation d’un banc de filtre Calculer l’énergie associée à un signal Construire un banc de filtres à partir d’un filtre générateur Créer et utiliser un banc de filtres : un exemple avec Scilab. TD n°7 : création et utilisation d’un banc de filtres en Scilab Qu’est ce qu’un banc de filtres ? Banc de filtres : il s’agit d’un ensemble de M filtres de même taille R opérant à la même fréquence d’échantillonnage fe, et conçus pour analyser automatiquement la composition fréquentielle d’un signal audio présenté à l’entrée du banc de filtre. Analyse d’un signal par un banc de M filtres : consiste à découper le spectre du signal en M bandes de fréquences, ou encore à décomposer le signal analysé en M signaux différents à la sortie des filtres du banc. Reconstitution du signal : l’addition des signaux de sortie des filtres du banc de filtre permet de reconstituer le signal initial.
Définition d’un banc de filtres et exemple Notation : on désigne un filtre de taille R par le vecteur de ses coef-ficients h= (hn, n= 0..R-1) ou par H= (Hk, k= 0..R-1), sa réponse fréquentielle, avec H= fft(h) si h=ifft(H) mais h= fftshift(real(ifft(H))) ! On trace H=abs(fft(h)) ou on calcule H=fft(fftshift(h)) ! Un banc de M filtres sera donc constitué de filtres désignés par hi ou Hi, i = 1 .. M avec Hi= fft(hi) Contrainte de définition d’un banc de filtres : Exemple d’un banc de M=4 filtres de taille R=64 (attention, H1, H2, H3, H4 tracés entre –fe/2 et fe/2)
Utilisation d’un banc de filtres On désigne par le vecteur x = (xn=x(nTe), n= 0..N-1) le signal à l’entrée du banc (x contient N échantillons) et par le vecteur X=fft (x(1:R)) le spectre de x calculé par Transformée de Fourier Discrète (TFD) de taille R x est filtré tour à tour par les M filtres du banc, et on note x1, x2, x3, … xM les signaux filtrés avec : X1+X2+ … +XM= (H1+H2+..+HM)*X= X car H1+ H2+ ...+ HM= ones(1,R) donc x1+x2+ … +xM = x Exemple avec M=4: filtre1 filtre2 filtre3 filtre4
Découper X en quatre bandes égales, B1, B2, B3 et B4 Exercice : appliquer graphiquement un banc de 4 filtres au signal x de spectre X donné ci-dessous compléter f fe R R/2 R/4 R/8 Découper X en quatre bandes égales, B1, B2, B3 et B4 B1 B1 f f B2 f B3 f B4
Définition de l’énergie d’un signal et comparaison des signaux x1, x2, … xM issus du banc de filtres Définition de l’énergie associée à un signal à partir des échantillons de ce signal : Calcul de l’énergie à partir du spectre (théorème de Parseval) : Appliquer à l’exemple de la page précédente : calculer l’énergie de x, x1, x2, x3 et x4 Quelle est l’erreur faite si on approxime x par x3 ? On perd 10% de l’énergie du signal x, mais on peut com-presser x3 dans un facteur C=4
Création d’un banc de filtres par décalages et additions successifs d’un filtre générateur unique Soit le filtre de vecteur de coefficients h, et de réponse fréquentielle H, donc H=fft(h), length(h)= length(H)= R et hn complexe HkHk-k0 hn réel et Pour décaler de la réponse fréquentielle du filtre H, il suffit de multiplier le coefficient hn par où k0 entier vaut Exemple : k0 =6, R=32, fe=8000 Hz, que vaut f0 ? f0? Hk? Hk-k0? Hk+k0?
Exercice : créer les quatre filtres H1, H2, H3 et H4 engendrés de cette manière par H0 pour R=32 k0= fe= H1 f0=500Hz k0=2 H2 f0= k0= H3 f0=2500Hz k0= H4 f0= k0= Comment vérifier que ces quatre filtres constituent bien un banc ?
Création d’un banc de filtres et analyse par le banc du signal audio tiré d’un fichier wave function [s, E, Esignal, fe]=bancfiltres(M, R, fichier, play) //fichier ‘bancfiltres.sce’ //utilisation [s,e,es,fe]=bancfiltres(8,128,'piano.wav',0); [e,fe]=wavread(fichier); N= R/(4*M); H=[ones(1,N-1),0.9,0.5,0.1,zeros(1,R-2*N-3),... 0.1,0.5,0.9,ones(1,N-2)]; h=fftshift(real(ifft(H))); n=0:R-1; for j=0:M-1 bande(j+1,:)=2*cos((2*j+1)*n*%pi/(2*M)).*h; end sfiltre=convol(e,bande(j+1,:)); s(j+1,:)=sfiltre(1:length(e)); wavwrite(s(j+1,:),fe,['s'+string(j+1)+'.wav']); Esignal= e*e'/2; E=diag(s*s')/2; disp(['sum(E):',string(sum(E))]) bar([0:M-1]*fe/(2*M),100*E/Esignal) xtitle(['Analyse de ',fichier],'frequence (Hz)'... ,'energie (% energie totale)') xgrid(); if play then sound(sum(s,1),fe); endfunction Lit le signal audio dans e et fe Crée le filtre générateur h Crée un banc de M filtres à partir du filtre générateur h Filtre e dans sfiltre, réduit length(sfiltre) sauve au format wave Calcule et trace le diagramme des énergies des signaux issus du banc de filtre Joue sum(s,1) si play!=0
Étudier le script ‘bancfiltres.sce’ et préciser : les dimensions des matrices bande et s : le contenu de la ligne bande(1,:) : le contenu de s(1,:) : le contenu de Esignal le contenu de E(1) la raison de la ligne s(j+1,:)=sfiltre(1:length(e)); le contenu du fichier s2.wav ? l’énergie de e conservée selon les bandes de fréquence conservées ci-dessous matrice bande matrice s h1 h2 … hM s1 s2 … sM Bandes de fréquence Énergie (en % énergie de e) 1 (basse fréquence) E(1) 1 et 2 E(1)+E(2) = 1, 2, 3 1, 2, 3 et 4 1, 2, 3, 4, 5, 6, 7 et 8
Application à la compression du signal x dans un rapport C=4 avec une perte d’énergie de 10% f fe R R/2 R/4 R/8 R/4 f fe R R/2 R/8 R/4 f fe R R/2 R/8 R/4 f fe R R/2 R/8 R/4 f fe R R/2 R/8 En perdant 10% de l’énergie du signal x, on obtient C=4