Analyse spectrale par FFT et filtres à seuillage
Transcription
Analyse spectrale par FFT et filtres à seuillage
Université du Québec à Montréal Département d’Informatique MIC4220 Traitement numérique des signaux Laboratoire 4: L’analyse spectrale et le filtrage par transformée de Fourier But Familiarisation avec la conception et l’usage de la Transformée de Fourier Rapide (TFR, «FFT» en anglais) en analyse spectrale et comme filtre. Exercices I. Usage de la FFT 1. Génération d’un signal de bruit a. Générer le signal de bruit blanc Gaussien suivant en utilisant le code Matlab: x = 10*randn([1,4096]); % génère 4096 échantillons Afficher les 75 premiers échantillons du signal en utilisant la fonction Matlab stem (Indication : figure; subplot(2,1,1);stem(x(1:75)); obtient-on toujours le même résultat en répétant l’exécution du programme? Pourquoi? b. Utiliser la fonction fft de Matlab pour calculer les coefficients de la transformée de Fourier discrète du signal; afficher l’amplitude du spectre fréquentiel obtenu en assumant que la fréquence d’échantillonnage est de 8000 Hz. Le code Matlab requis est: Ak=abs(fft(x))/length(x); % calcul du spectre d’amplitude fs=8000; k=0:1:length(x)-1; % Génération de l’indice des fréqu. f=k*fs/length(x); % conversion en Hz subplot(2,1,2); plot(f,Ak); % trace du spectre d’amplitude Utiliser les fonctions axis, xlabel, ylabel et title pour finaliser le tracé. Quelle fréquence(s) devrait-on voir sur le graphique (fréquence du signal) ? Quelle est la résolution en fréquence ? c. Utiliser la fonction sound de Matlab pour écouter le signal généré en utilisant une fréquence d’échantillonnage de 8000 Hz. sound(x/max(abs(x)),8000);% joue un son à une fréquence donné Qu’entend-on? À quelle bande de fréquence est limitée l’oreille? 2. Génération d’une somme de cosinusoïdes numériques a. Générer trois cosinusoïdes avec les amplitudes et phases suivantes: 1 x1(t) = 10 cos[2π(500)t] ; x2(t) = 10 cos[2π(1200)t + 0.25 π] ; x3(t) = 10 cos[2π(1800)t+ 0.5 π] ; Afficher les trois signaux pour une durée d’environ 0.01 seconde. Chaque signal doit être échantillonné à une fréquence de 8000 Hz ; vérifier que la phase et l’amplitude de chacun des trois signaux est correcte (correspond à la formule mathématique). Indication: utiliser x(0) et max(x) dans Matlab. À quelles notes de musique la plus proche correspondent ces trois fréquences? b. Créer un programme qui génère la somme de trois cosinusoïdes en additionnant les trois cosinusoïdes générées x(t) + x1(t) + x2 (t) + x3 (t) Afficher x(t) sur la même période de temps utilisée en a), en utilisant la commande: subplot(2,1,1);plot(t,x); Quel est la fréquence d’échantillonnage de x(t)? c. Utiliser fft pour calculer les coefficients de la transformée de Fourier discrète du signal précédent; afficher et examiner le spectre du signal x(n) (composantes fréquentielles) en incluant les légendes. Quelles fréquences apparaissent sur le spectre fréquentiel ? Est-ce que toutes ces fréquences existent dans le signal temporel non échantillonné? D’où viennent les nouvelles fréquences? De façon rigoureuse, la bande de fréquence comprise entre fs/2 et fs devrait se retrouver où dans le spectre fréquentiel? d. Écouter et comparer les signaux générés en exécutant le code suivant: sound(x1/max(abs(x1)), 8000);pause sound(x2/max(abs(x2)), 8000);pause sound(x3/max(abs(x3)), 8000);pause sound(x/max(abs(x)), 8000); 3. Génération d’une multiplication de signaux numériques a. Générer deux signaux cosinusoidaux possédant les amplitudes et phases suivantes: x1(t) = 10 cos[2π(500)t] ; x2(t) = 10 cos[2π(1200)t + 0.25 π] ; Afficher les deux signaux sur un axe des temps de durée 0.01 s ou plus. Chaque signal doit être échantillonné à une fréquence de 8000 Hz. Indication : t=0:(1/8000):0.5; figure; subplot(3,1,1);plot(t,x1); axis([0 0.01 –6 6]); Utiliser max et mean de Matlab pour déterminer la valeur maximale et la valeur moyenne quadratique (indication: sqrt(mean(x1.*x1)) b. Créer un vecteur qui est la multiplication des deux cosinusoïdes: y(t) = x1(t) × x2(t) 2 (Indication : y=x1.*x2; % noter le point avant le signe *) Utiliser le code suivant pour afficher y(t) sur la même période de temps qu’en a) : subplot(3,1,2);plot(t,y);axis([0 0.01 -6 6]); c. Utiliser fft pour calculer les coefficients de la transformée de Fourier discrète du signal précédent ; afficher et examiner le spectre du signal x(n) (composantes fréquentielles) en incluant les légendes. Quelles fréquences apparaissent sur le spectre fréquentiel ? Montrer mathématiquement que ces fréquences sont bien celles que l’on doit obtenir. d. Utiliser sound pour écouter x1, x2 et y avec une fréquence d’échantillonnage de 8 kHz. 4. Traitement d’un signal de parole a. Charger le fichier de voix we.dat utilisé dans le laboratoire précédent et utiliser la fonction fft pour calculer les coefficients de la transformée de Fourier discrète du signal ; afficher et examiner le spectre du signal x(n) (composantes fréquentielles) en incluant les légendes. Dans quelle bande de fréquences se situe le signal ? S’il y avait un signal à 5000Hz dans le fichier we.dat, à quelle(s) fréquence(s) apparaitrait-il dans le spectre fréquentiel? Expliquer la réponse. 3 II. Filtrage avec la FFT Un signal biomédical est corrompu avec un signal sinusoïdal de bruit de fréquence 60 Hz. On veut éliminer le bruit du signal capté avant l’enregistrement de ce dernier. La procédure suivie est Signal d’entrée Bloc d’entrée DSP Bloc de sortie Signal de sortie AIC illustrée par la figure suivante : Le signal EEG est d’abord échantillonné dans le temps et passé à travers un convertisseur A/N. Ensuite, le signal numérique obtenu subit un filtrage passe-bas avec une fréquence de coupure de 50 Hz pour éliminer le bruit. Finalement, le signal filtré passe par un convertisseur N/A et un filtre de reconstruction avant l’enregistrement. Le filtrage passe-bas consiste à calculer le spectre de Fourier du signal corrompu à l’aide de la TFR, à modifiant ce spectre afin d’éliminer le bruit à 60 Hz, et à calculer la TFR inverse. La modification du spectre se fait selon la règle: X ( ) si f 45 Hz Y ( ) X ( ) si 45 Hz f 60 Hz 0 autrement où α=1-(f-45)/15, X(ω) et Y(ω) représentent le spectre de Fourier original et modifié, et f =ω/2π. On sait que : - Le signal de départ ne possède pas de composantes de fréquence supérieure à 125Hz - On veut obtenir un spectre de fréquences avec une résolution minimale de 1 Hz a. Donner la fréquence d’échantillonnage et le nombre minimum de points requis pour la TFR. b. Évaluer le nombre d’opérations requises pour effectuer la TFR, le filtrage et la TFR inverse et discuter de la possibilité de réaliser le système avec la période d’échantillonnage choisie et un DSP capable de multiplier et d’additionner en 50 ns. c. Utiliser Matlab pour simuler un signal d’entrée corrompu avec s(t=|sin(60t)|+0,4sin(120πt) et tracer son spectre de Fourier. l’équation d. Écrire un programme Matlab pour simuler l’opération du système et vérifier son fonctionnement en traçant la courbe du signal de sortie. e. Reprendre le programme précédent en utilisant un filtre : X ( ) si f 58 Hz Y( ) 0 si f 58 Hz Comparer le résultat obtenu avec le précédent et expliquer toute différence. 4 Exemple d’utilisation de la TFR avec Matlab : % % % % % On commence par générer un axe des temps de 1024 points et un axe des fréquence de 512 points (1024/2). Par la suite, on va générer 4 cycles d'un signal de période 1 ms, ce qui implique une période d'échantillonnage de .001/256 ou encore une fréquence d'échantillonnage de 256 kHz. L'axe des fréquence consiste alors en 512 points qui vont de 0 à 128 kHz (w0=2pi/Te). t=1/256*(0:1023); % Te=1/256 ms, t=0-4 ms f=256/1024*(0:511); % f0=256/1024 khz, f=0-256 kHz, on prend seulement la 1ère moitié % Il faut maintenant générer s1 s1=sin(2*pi*t); for k=1:1024 if s1(k)<0 s1(k)=0.5; end; end; % Ensuite on calcule le spectre de Fourier du signal S1=fft(s1); SS1=abs(S1); subplot(211), plot(t,s1), axis([0 4 -0.5 1]), title('signal'); subplot(212), plot(f(1:20),SS1(1:20)), title('Spectre d''amplitude'); pause % Le signal est modulé par une porteuse a 20 kHz phi=s1.*cos(40*pi*t); PHI=fft(phi); SPHI=abs(PHI); subplot(211), plot(t,phi), axis([0 4 -1 1]), title('signal modulé par une porteuse a 20 kHz'); subplot(212), plot(f,SPHI(1:512)), axis([0 128 0 max(SPHI)]), title('Spectre d''amplitude'); pause % Maintenant, on part le processus de demodulation synchrone (muliplication % par la porteuse a nouveau, suivi d'un filtrage passe bas) phi1=phi.*cos(40*pi*t); PHI1=fft(phi1); SPHI1=abs(PHI1); subplot(211), plot(t,phi1), axis([0 4 -1 1]), title('signal demodulé avant filtrage'); subplot(212), plot(f,SPHI1(1:512)), axis([0 128 0 max(SPHI1)]), title('Spectre d''amplitude'); pause % Un filtre de passe bas pas cher, pas cher for k=100:900 PHI1(k)=0; end; % voici ce que donne le spectre filtré SPHI2=abs(PHI1); phi1=2*ifft(PHI1); subplot(211), plot(f,SPHI2(1:512)), axis([0 128 0 max(SPHI1)]), title('Spectre d''amplitude filtré'); subplot(212), plot(t,real(phi1)), axis([0 4 -0.5 1]), title('signal temporel correspondant') ; 5