Tp_TdS_2.pdf



Comments



Description

Scripts, fonctions, exercices appliqués au Traitement numérique du signal1. Representing Signals 1.1 Vector Representation MATLAB represents ordinary one-dimensional sampled data signals, or sequences, as vectors. Vectors are 1-by- n or n-by-1 arrays, where n is the number of samples in the sequence. One way to introduce a sequence into MATLAB is to enter it as a list of elements at the command prompt. The statement x = [4 3 7 -9 1] creates a simple five-element real sequence in a row vector. Transposition turns the sequence into a column vector x = x' resulting in x = 4 3 7 -9 1 Column orientation is preferable for single channel signals because it extends naturally to the multichannel case. For multichannel data, each column of a matrix represents one channel. Each row of such a matrix then corresponds to a sample point. A three-channel signal that consists of x, 2x, and x/pi is y = [x 2*x x/pi] This results in y = 4.0000 8.0000 1.2732 3.0000 6.0000 0.9549 7.0000 14.0000 2.2282 -9.0000 -18.0000 -2.8648 1.0000 2.0000 0.3183 1.2. Waveform Generation: Time Vectors and Sinusoids A variety of toolbox functions generate waveforms. Most require you to begin with a vector representing a time base. Consider generating data with a 1000 Hz sample frequency, for example. An appropriate time vector is t = (0:0.001:1)'; where MATLAB's colon operator creates a 1001-element row vector that represents time running from zero to one second in steps of one millisecond. The transpose operator (') changes the row vector into a column; the semicolon (;) tells MATLAB to compute but not display the result. Given t you can create a sample signal y consisting of two sinusoids, one at 50 Hz and one at 120 Hz with twice the amplitude. y = sin(2*pi*50*t) + 2*sin(2*pi*120*t); The new variable y, formed from vector t, is also 1001 elements long. You can add normally distributed white noise to the signal and graph the first fifty points using randn : yn = y + 0.5*randn(size(t)); plot(t(1:50),yn(1:50)) 1 Ex1: Un signal sinusoïdal et du bruit Réaliser le script suivant, expérimenter différentes fréquences. t = (0:0.001:1)'; y = sin(2*pi*80*t) + 2*sin(2*pi*160*t); yn = y + 0.5*randn(size(t)); plot(t(1:50),yn(1:50)) % on pourrait utiliser la fonction sound, mais comme de nombreuses valeurs % dépassent l'intervalle +/- 1, on utilise soundsc (sc=scale=mise à l'échelle) % de plus il faut indiquer la période d'échantillonnage, ici par le biais de % la fréquence d'échantillonnage fs (s=sampling) qui est son inverse soundsc(y,1000); disp('Taper sur la touche "Entrée" pour continuer'); pause; soundsc(yn,1000); 1.3. Common Sequences: Unit Impulse, Unit Step, and Unit Ramp Since MATLAB is a programming language, an endless variety of different signals is possible. Here are some statements that generate several commonly used sequences, including the unit impulse, unit step, and unit ramp functions. t = (0:0.001:1)'; imp = [1; zeros(99,1)]; % impulse step = ones(100,1); % step (filter assumes 0 initial cond.) ramp = t; % ramp y = t.^2; y = square(4*t); All of these sequences are column vectors. The last three inherit their shapes from t. Ex2: La fonction "stem" En utilisant la fonction "stem", représenter : a) imp(n-10) b) step(n-1) c) ramp(n-10) pour les échantillons situés entre n=1 et n=20 1.4. Common Periodic Waveforms The toolbox provides functions for generating widely used periodic waveforms: sawtooth generates a sawtooth wave with peaks at ±1 and a period of 2 pi. An optional width parameter specifies a fractional multiple of 2 pi at which the signal's maximum occurs. square generates a square wave with a period of 2 pi . An optional parameter specifies duty cycle, the percent of the period for which the signal is positive. Ex3: Le signal "dents de scie" et "carré" To generate 1.5 seconds of 180 Hz sawtooth and square wave with a sample rate of 10 kHz and plot 0.2 seconds of the generated waveform, use fs = 10000; t = 0:1/fs:1.5; x1 = 0.2*sawtooth(2*pi*180*t); % on met une amplitude de 0.2 pour ne pas saturer les oreilles x2=0.2*square (2*pi*180*t); plot(t,x1,t,x2), axis([0 0.2 -1 1]); sound(x1,fs); disp('Taper sur la touche "Entrée" pour continuer'); pause; sound(x2,1000); 2 1.5. Common Aperiodic Waveforms The toolbox also provides functions for generating several widely used aperiodic waveforms: gauspuls generates a Gaussian-modulated sinusoidal pulse with a specified time, center frequency, and fractional bandwidth. clear; close all; fs = 10000; t = -5:1/fs:5; fc=1000; bw=0.0002; y = gauspuls(t,fc,bw); plot(t,y), axis([-5 5 -1 1]); sound(y,fs); chirp generates a linear swept-frequency cosine signal. An optional parameter specifies alternative sweep methods. Ex4: Le signal "chirp" To compute 4 seconds of a linear chirp signal with a sample rate of 10 kHz, that starts at 100 Hz and crosses 500 Hz at 1 second, use t = 0:1/10000:4; y = 0.2*chirp(t,100,1,500); % amplitude 0.2 plot(t,y); sound(y,10000); 2. Exercices liés au cours 2.1. Quelques séries La fonction suivante "serie_fourrier", simule le calcul de la décomposition en série de Fourrier. function [rtdf,itdf]=Serie_Fourrier(t,s,fs); % Calcule les parties réélle, imaginaire et le module de % la transformée de Fourrier discrète du signal s % échantillonné sur t à la fréquence fs % Le but étant de simuler la décomposition en série de Fourrier N=length(t); % N nombre d'échantillons (supposé grand sinon modifier cette fonction) if rem(N,2) ~= 0 % On impose N pair N=N-1; % quitte à enlever un échantillon si nécessaire end tdf=fft(s)/N; % rapportée au nombre N d'échantillons tdf=[tdf(N/2+1:N) tdf(1:N/2)]; % la seconde partie du spectre correspond % à la périodisation, on la raméne dans les % fréquences négatives f=fs/N*(-N/2:N/2-1); rtdf=real(tdf); itdf=imag(tdf); Rymax=max(rtdf);Iymax=max(itdf);ymax=1.1*max([Rymax Iymax]); Rymin=min(rtdf);Iymin=min(itdf);ymin=1.1*min([Rymin Iymin]); subplot(3,1,1);plot(f,rtdf),ylim([ymin ymax]),ylabel('Partie réelle'); subplot(3,1,2);plot(f,itdf),ylim([ymin ymax]),ylabel('Partie imaginaire'); subplot(3,1,3);plot(f,abs(tdf)),ylabel('Module'),xlabel('Fréquence(Hz)'); 3 Ex5: Séries de Fourrier de quelques signaux importants Représenter le spectre de a) s(t)=cos(2 pi F 0 t) b) s(t)=sin(2 pi F 0 t) c) du signal carré périodique unité de période T 0 d) d'un peigne de dirac temporel en utilisant l'option "duty" de la fonction square Vérifier les résultats obtenus avec les calculs "formels". Ex6: Entendre le repliement Créer 3 signaux en sinusoïdaux d'amplitude 1, fréquence 1 000 Hz échantillonnés a) à 20 000 Hz b) à 5 000 Hz c) à 1 500 Hz Les représenter dans le même graphe. Les entendre successivement, avec la fonction "sound". Enfin représenter leur spectre avec la fonction "serie_fourrier". Interpréter. Ex7: Erreur de quantification On veut vérifier les résultats de l'étude théorique du bruit de quantification. Créer un script qui : a) réalise un signal cosinus s1, d'amplitude 1, d'une durée de 1 seconde, de fréquence 100 Hz, échantillonné à 10 000 Hz. b) afin de simuler la quantification, multiplie s1 par 5, réalise un arrondi au plus proche entier (utiliser la fonction "round"), puis divise le résultat par 5 pour obtenir le signal quantifié s2. c) représente s1 et s2 dans le même graphe. d) représente bq=s2-s1, le bruit de quantification dans une autre figure. De cette représentation en déduire une estimation de q 0 le quantum. e) calcule la moyenne (fonction "mean"), la variance (fonction "var"). f) calcule à partir de e), le quantum q 0 . Ex8: Transformée de Fourrier Discrète (TFD) avec la fonction "fft" Créer un signal s de 0.8 secondes, sinusoïdal d'amplitude 1 de fréquence 100 Hz échantillonné à 1 000 Hz. Combien y a t'il d'échantillons ? Quelle est la longueur du vecteur s ? Représenter le module de la TFD en écrivant dans la fenêtre de commande : >> plot(abs(fft(s))); On voit en abscisse l'indice varier de 1 à N = 800, le nombre d'échantillons temporels et fréquentiels. D'aprés l'étude théorique, le pas fréquentiel est f 0 = fs/N. La fréquence varie donc de f=f 0 (indice=1) à f=fs (l'indice=800). Afin de bien concrétiser les fréquences du signal à traiter, créer le vecteur fréquence freq = n.f 0 avec n variant de 0 à N-1. Tracer abs(fft(s)) en fonction de freq en écrivant : >> plot(freq,abs(fft(s))); Vérifier qu'il y a bien une raie à la fréquence du signal. Créer un signal "trichromatique" égale à la somme de 3 sinusoïdes de fréquence f1=2*f2=3*f3=1200 Hz et d'amplidude 1, 1.5 et 4 respectivement. La durée du signal est de 1.2 seconde. Réaliser un script qui représente le signal ou une partie du signal ainsi que sa TDF (on prendra désormais, sauf indication contraire le module de la TDF : abs(fft(s))). Modifier le sript en ajoutant un bruit aléatoire au signal. Expérimenter plusieurs amplitudes du bruit. Ex9: Précision spectrale Le but de cet exercice est de montrer que la précision fréquentielle dépend du nombre de points N dans la TFD. Ce nombre correspond au nombre de fréquences dans la représentation du spectre. Matlab utilise l'algorithme Fast Fourier Transform dont la vitesse d'exécution est optimale pour N = puissance de 2. La fonction fft de Matlab, permet de préciser le nombre de points N dans la TFD (si il n'est pas précisé, N = nombre d'échantillons temporels). Le domaine fréquentiel [0 fs] est alors à diviser en N fréquences. 4 Dans un script, créer un signal sinusoïdal s d'amplitude 1, fréquence 600 Hz, fréquence d'échantillonnage fs = 5 000 Hz de durée d = 300 ms. Calculer la TFD pour N = 32, N = 128 et N = 1024. Les représenter dans la même figure de f =0 à fs/2. A quelle fréquence se situe la raie spectrale dans chaque cas. Interpréter. Résolution Ex10: Influence de la durée d'observation, fenêtre rectangulaire, résolution Le fait de ne travailler qu'avec des signaux de durée limitée introduit une distorsion en sinc dans les raies du signal à analyser. Cette "perte" d'information est d'autant plus grande que la fenêtre d'observation est petite. Réaliser un signal sinusoïdal de fréquence 1 000 Hz, d'amplitude 1, échantillonné à 20 000 Hz. Dans une même figure, représenter : a) ce signal sur une durée de 2 ms et en dessous sa TFD à 2048 points b) le même signal mais sur une durée de 24 ms et en dessous sa TFD à 2048 points. Interpreter les résultats, notamment la largeur des raies. c) modifier le script en ajoutant une composante à 1 200 Hz. Conséquences sur la résolution (capacité à discerner des fréquences distinctes dans un même signal). Ex11: Transformée de Fourrier inverse. Taper le script suivant. Commenter chaque partie en expliquant ce que réalise le script. Remarquer que fft et ifft sont des calculs portant aussi bien sur des signaux réels que complexes. Expérimenter des signaux complexes, par exemple en modifiant s : s = i * s; % le signal est maintenant imaginaire Quelle est la conséquence sur la suite du script ? clear; close all; fe=20000; fsig=1000; N=2048; d=0.024; t=0:1/fe:d-1/fe; s=cos(2*pi*fsig*t); f=0:fe/N:fe-fe/N; tfd=fft(s,N); rtfd=real(fft(s,N)); subplot(311);plot(f,rtfd,'-'),xlim([0 3000]); itfd=imag(fft(s,N)); subplot(312);plot(f,itfd,'-'),xlim([0 3000]); mtfd=abs(fft(s,N)); subplot(313);plot(f,mtfd,'-'),xlim([0 3000]); figure signal=ifft(tfd,N); plot(real(signal)); hold on; plot(imag(signal),'k'); figure t=1/fe*(0:N-1); plot(t,real(signal)); Ex12: Convolution Réaliser un script qui crée un bruit blanc de N = 10 000 échantillons, le fasse entendre avec une fréquence d'échantillonnage fs = 10 000 Hz, le représente ainsi que sa TDF dans le domaine de fréquences [0 fs/2]. 5 Aprés une pause de 2 secondes (fonction "pause"), ce bruit est convolué (fonction "conv") avec un signal porte de m échantillons et d'amplitude 1/m. Représenter le signal résultant ainsi que sa TDF et l'écouter. Expérimenter plusieurs valeurs de m en termes de fraction de N : m = N/10, N/100, ... Interpréter les observations. ex13a: Filtre_bruit_a Le bruit gaussien, normal est un bruit blanc. Il est constitué de raies d'amplitude aléatoire à toute fréquence. Dans cet exercice, on va prélever une partie du pectre (ci-dessous entre 2000 et 2200 Hz) d'un signal bruit et reconstituer un signal à partir de ce prélévement. Créer un signal bruit de 10 000 échantillons à une fréquence d'échantillonnage de fe=10 4 Hz. Le représenter ainsi que le module de sa TFD. L'écouter avec la fonction "soundsc". Pélever une partie de sa tfd (qui est un vecteur complexe) entre la fréquence f1 et la fréquence f2. Compléter les segments [0, f1[ et ]f2,fs] avec des zéros. En utilisant la fonction "ifft", reconstituer le signal bf (bruit filtré), signal lui-aussi complexe. Représenter Re(bf), Re(fft(bf)) et l'écouter. Même question pour la partie imaginaire. Au total, obtenir une figure similaire à celle ci-dessus. Expérimenter différentes valeurs de f1 et f2. "Zoomer" sur le signal reconstitué afin d'estimer sa période et comparer le signal réel et imaginaire. ex13b (facultatif): Filtre_bruit_b Reprendre le script précédent et le modifier (aprés l'avoir sauver sous un autre nom) de façon à ce que la transformée de fourier inverse du signal porte utilisé pour le prélévement soit convolué avec le signal de départ. Quel est le résultat ? Que peut on observer en terme de temps d'exécution par rapport au script précédent ? Modifier (légérement) le script de façon à ne convoluer que les 100 ou 200 premières valeurs de fft(porte). Que peut on observer ? PROJET 1 Filtre sinc Etude théorique préliminaire (à effectuer à la maison) Soit P f0,ϕ (f) le signal porte tel que : P f0,ϕ (f) = 1 pour f0 - ϕ/2 <= f <= f0 + ϕ/2 P f0,ϕ (f) = 0 partout ailleurs Montrer que la transformée de Fourier inverse de P f0,ϕ (f) est : p(t) = exp(2 j π f0 t) . sinc(ϕ t) 6 Réalisation d'un passe-bande D'aprés l' exercice 13b, on peut réaliser un filtre f1-f2 par convolution avec la fonction sinc correctement paramètrée. Le but de cet exercice est de réaliser une fonction filtre(signal,fs,f1,f2) qui renvoie le signal filtré. L'étude théorique ci-dessus (et le théorême de Plancherel) montre que si on convolue un signal quelconque s(t) avec p(t) alors, le résultat est le signal sf(t) ne comprenant que les fréquences comprises entre f1 et f2. réaliser cette fonction, elle devra débuter par la ligne suivante : function [sf,noyau]=filtre(signal,fs,f1,f2) où les paramètres renvoyés par la fonction sont sf le signal filtré et noyau le signal p(t) limité à ses 100 premières valeurs. Les paramètres passés à la fonction sont signal, le signal à filtrer, fs la fréquence d'échantillonnage, f1 et f2 les bornes fréquentielles du passe bande. La fonction devra de plus : - comporter des instructions testant si le nombre de paramètres passés est correct (utiliser "nargin"), si les fréquences f1 et f2 sont positives. Cette partie devra comporter l'éventualité de messages d'erreur (utiliser l'instruction"error"). - donner les représentations des signaux, original et filtré, ainsi que leur tfd respective. Les tfd seront réalisées sur 2048 points. - permettre l'écoute de signal et de sf. Il sera judicieux de tester la fonction sur un signal bruit. Expérimenter différentes bandes, différentes longueurs du noyau. ex14 : La fonction "filter" 0/ Préliminaire. Comme on l'a fait quelques fois ci-dessus, nous sommes souvent amenés à comparer un signal original avec le résultat aprés filtrage. On peut gagner du temps en créant la fonction : function ex14_comparer(s1,fs1,s2,fs2) qui représente dans la même fenêtre, les signaux s1 et s2 échantillonnés aux fréquences fs1 et fs2, ainsi que leur TFD respective. 1/ Appeler l'aide de Matlab afin d'obtenir la documentation de cette fonction (la fonction "filter") de base du traitement du signal numérique sous Matlab. Dans le paragraphe "Algoritm", l'équation aux différences finies est donnée. Quelle est la différence avec celle donnée en cours ? Bien remarquer que a(1) sous Matlab correspond au a 0 du cours. Ils prennent, en général, la valeur 1 car ils correspondent au "poids" de y(n). Donnons un exemple : Soit l'équation aux différences finies y(n) + 0.5y(n-1) - y(n-2) = x(n) + 2x(n-1) + 3x(n-2) elle correspond à 1 SLI dont la réponse à une entrée x sera calculée sous Matlab par y = filter([1,2,3],[1,0.5,-1],x); 2/ Déterminer les vecteurs a et b pour le filtre "moyenne mobile" sur une longueur L = 20 échantillons. Créer un signal s dichromatique additionné de bruit, le filtrer avec la moyenne mobile. Expérimenter différentes longueurs. Quelle est la nature du filtre ainsi réalisé ? 7 On doit obtenir : 3/ La fonction "filter" utilisée en moyenne mobile, est équivalente à la convolution du signal avec une porte de longueur L. Interpréter les résultats obtenus. Vous devez normalement pouvoir "prédire" la longueur L nécessaire à une fréquence de coupure fc donnée. ex15 : Synthése d'un coupe bande avec la fonction yulewalker (du nom de l'algoritme utilisé). Le problème avec la fonction "filter" est de trouver les coefficients adéquats à un filtrage désiré. Cela est résolu gràce à la fonction "yulewalker" qui cherche pour un ordre donné (la longueur maximale des vecteurs a ou b) les coefficients de ces vecteurs qui sont ensuite utilisé dans la fonction filter. 1/ Utiliser la fonction "wavread" pour charger un fichier .wav quelconque (dans l'exemple ci-dessous c'est notify.wav qui a été utilisé). 2/ Si le fichier était stéréophonique (2 canaux donc 2 colonnes), ne prendre que l'un des canaux. 3/ Ecouter le son produit avec "soundsc". 4/ Supposons que nous voulions éliminer (ou atténuer) un signal dans la bande de fréquences comprises entre f1 et f2. On crée alors une sorte de gabarit schématisé ci-dessous : Fréquence Amplitude 0 1 f1 f2 fs 0 Dans Matlab, ce gabarit peut être décrit avec les points de coordonnées définies par les 2 vecteurs suivants: freq=[0 f1 f1 f2 f2 fs] magn=[1 1 0 0 1 1] 8
Copyright © 2024 DOKUMEN.SITE Inc.