Professional Documents
Culture Documents
Signaux Matlab2
Signaux Matlab2
__________________________________________________________________
Ce TP a pour but d’apprendre à utiliser le logiciel Matlab afin de pouvoir développer des
applications simples en traitement du signal.
Créer d’abord un répertoire portant votre nom sous la directorie work pour y
développer vos programmes : >>mkdir « votre nom » puis >>cd « votre nom ».
1- Variables scalaires
Dans un premier temps on génère trois variables scalaires a, b et c de la manière
suivante :
>> a=2 ;
>> b=3;
>> c=4 ;
>> a
La réponse serait :
a=
2
Cela signifie que les valeurs des variables sont mémorisées automatiquement avec
leurs noms.
3- Commandes de base :
who et whos :
Affiche la taille mémoire et types de toutes les variables utilisées.
cd :
Affiche le répertoire (directorie) où vous opérez en ce moment.
what, dir :
Affiche la liste les noms des fichiers contenus dans le répertoire actuel.
help nom_fonction :
Donne un descriptif de la fonction et ses arguments d’entrée sortie.
4- Opérations sur les variables
>>d=a+b+c
>>e=a+b*c
>>f=(a+b)*c
>>g=(a/b)*c
>>h=a^2
Matlab est optimisé pour l’usage matriciel : Eviter les formulations non matricielles.
[ a b c ] est un vecteur ligne.
[a ;b ;c ;] est un vecteur colonne.
V’ est le transposé du vecteur V
u=1:5 est le vecteur [1 2 3 4 5] (de même que [1 :5] et (1 :5).
t=0 :2 :15 est le vecteur [0 2 4 6 8 10 12 14]
sin(t) est le vecteur [sin(0) sin(2) …sin(14)]
zeros(1,N) est le vecteur ligne nul à N éléments.
Ones(1,N) est le vecteur ligne à N éléments égaux à 1.
V=début:pas:fin;
On définit une valeur de début : début
On définit une valeur de fin : fin
On définit un pas de progression linéaire ou logarithmique
(incrémentation) : pas ;
si le pas n’est pas spécifié, il est égal à 1 automatiquement.
>>v3=1:10
>>v4=1:-0.5:-1
>>debut=0;fin=256;pas=8;
>>v5=debut:pas:fin
Une liste des fonctions les plus courantes est disponible dans l’aide en ligne en tapant la
commande (elfun désigne elementary functions : sin, cos, log, exp…)
>>help elfun
7- Les matrices
Saisir la matrice 3x3 suivante :
a=[1 2 3 ;4 5 6 ;7 8 9]
Noter que deux lignes sont séparées par un point virgule.
Si vous entrez la commande a(:) vous obtenez le vecteur colonne [1 4 7 2 5 8 3 6 9]’.
La fonction eig donne les valeurs propres de la matrice a.
zeros(N) est la matrice nulle NxN, eye(N) est la matrice identité NxN.
II- ROGRAMMATION
1-LES SCRIPTS
Plutôt que de taper les commandes au clavier les unes après les autres pour effectuer
une tâche, ce qui vous oblige à refaire la même chose à chaque utilisation de cette
tâche, il est préférable de grouper les commandes dans un fichier à extension .m, ainsi
tous les programmes auront pour nom name.m. Il suffit alors de taper name pour que la
tâche s’exécute.
Exemple 1 :
Créez un fichier qui s’appelle essai1.m, qui génère un signal sinusoïdal x(t) de n points,
puis visualisez le à l’aide de la commande plot(x).
Etape 1 : édition du fichier par la commande : edit essai1.m
Etape 2 : taper les commandes suivantes dans la fenêtre d’édition :
>>essai1
2- Utilitaires graphiques
Exemple 2 :
Générez,à l’aide d’un programme prog1.m, deux périodes des deux signaux x(t)=cos(t)
et y(t)=sin(t) et visualisez les deux signaux sur une même figure, l’une en rouge et
l’autre en bleu à l’aide de la fonction plot(t,x,’b’,t,y,’r’). Mettre une légende.
Exemple 3 :
Visualisez sur une même figure,à l’aide d’un programme prog2.m, les quatre signaux
cos(t), sin(t),log10(t) et exp(t) en utilisant la fonction subplot(.,.,.) qui divise l’écran en
quatre sous figures : (2,2,1),(2,2,2),(2,2,3) et (2,2,4).
>>subplot(2,2,1),plot(t,x);
x=input(‘x=’) ;
fprintf(‘x=’%d) ;
III- LES FONCTIONS
Si plusieurs de vos programmes personnels utilisent en commun une liste d’instructions,
il est préférable de regrouper ces instructions sous forme d’un programme indépendant.
A chaque besoin on appelle le dit programme par son nom : c’est une fonction.
Une fonction possède des paramètres d’entrée et des paramètres de sortie, dont la
syntaxe de déclaration est la suivante :
function [sortie1,sortie2,…]=nom_fonction(entrée1,entrée2,…)
Le programme matlab correspondant à la fonction doit porter le même nom que la
fonction : nom_fonction.m
Exemple 1 :
Calcul de la moyenne arithmétique m d’un vecteur v de dimension n :
1 n
m= v(i)
n i 1
La fonction moyenne.m comportera les instructions suivantes :
function resultat=moyenne(v,n); %déclaration de la fonction
1 n 2
s= p = x (i)
n i 1
Testez cette fonction sur un signal sinusoïdal d’amplitude A et de période 1.
Comparer avec la fonction matlab std.
PARTIE THEORIQUE
1. En utilisant e j .n e j . , Trouver les expressions de cos(nα) et sin(nα) pour n=2 et n=3.
n
/2 /2
8. Calculer I n sin ( x)dx et J n cos
n n
( x) dx
0 0
________________________________________________________________________
Le compte rendu de la séance doit être rédigé sur la feuille qui vous est fournie
et doit contenir en plus de la partie théorique :
Un listing des programmes :
prog1.m
prog2.m
puissance.m
spectre(f,H)
myfilter.m
factoriel(n)
somme(x,n)
prog3.m
___________________________________________________________________________
factoriel.m
function p=factoriel(n)
if n>1
p=factoriel(n-1)*n ;% récursivité
else
p=1 ;
end
end
___________________________________________________________________________
myfilter.m
%TP1 : myfilter.m
H1=(1+j*f./fc).^(-1) ;
H2=(j*f./fc).*H1 ;
___________________________________________________________________________
prog1.m
Te=0.001;
T=2*pi;
t=0:Te:2*T;
x=sin(t);
y=cos(t) ;
plot(t,x,’b’,t,y,’r’) ;grid on ;
legend(‚Sin(t)’,’Cos(t)’);
___________________________________________________________________________
prog2.m
Te=0.001;T=2*pi;t=0:Te:2*T;
subplot(2,2,3);plot(t1,z);grid on;legend(‚log10(t)’);
subplot(2,2,4);plot(t2,u);grid on;legend(‚Exp(t)’);
_________________________________________________________________________
TP1 : prog3.m
s=somme(2,1) ;
fprintf(‚incertitude : %d\n’,(exp(2)-s)/exp(2));
___________________________________________________________________________
puissance.m
function r=puissance(v) ;
p=mean(v.^2) ;%la puissance de v
r=[p,s];
end
___________________________________________________________________________
somme.m
end
___________________________________________________________________________
spectre.m
function spectre(f,H,i)
subplot(2,2,i);plot(f,20*log10(abs(H)));title('spectre d''amplitude');
I- Définition
Un signal numérique s(k) est une suite de N échantillons régulièrement espacés de T e
secondes :
s(0,),s(Te),s(2Te),…,s((N-1)Te)
La grandeur Fe=1/Te est appelée fréquence d’échantillonnage : c’est le nombre
d’échantillons par seconde.
Le nombre d’échantillons N est le plus souvent une puissance de 2 : N= 2 p où p est un
entier naturel.
Signal numérique
100
80
s(kTe)
60
40
20
0
Te 2Te 3Te 4Te kTe
kTe (secondes)
Remarque :
Le nombre de points de z(k) est généralement N+M-1 où N et M
désignent le nombre d’échantillons respectifs de x et y.
L’expression générale de la convolution est un peu différente si la
variable temps débute à zéro au lieu de un (ce qu’exige Matlab).
4
(1) k
s2(t)=
k 1 k
. cos(2 .k . f 2 .t )
Le bruit b(k) est défini comme étant un signal indésirable se mêlant additivement ou
autrement à un signal s(t) qui intéresse l’observateur.
Le model le plus fréquent de bruit de mesure de grandeurs physiques est le bruit blanc
gaussien : c’est un bruit aléatoire b(k) dont les échantillons sont dé-corrélés (entendez
par cela que même si on connaît b(k1), b(k2) reste aussi imprévisible qu’avant).
La fonction b=randn(1,N) permet de générer un vecteur bruit b de distribution pseudo
normale (de Gauss) de taille N de moyenne nulle et d’écart type 1.
Un coefficient multiplié par randn permet d’augmenter à volonté la puissance du bruit.
Ainsi pour générer un vecteur bruit blanc de taille N, de moyenne m et d’écart type la
commande est :
bruit= m+ *randn(1,N);
Dont la puissance est Pb m 2 2 (Puissance de la moyenne plus celle des fluctuations
autour de cette moyenne).
Ps
SNR= 10. log10
Pb
On distingue trois cas de figure :
SNR positif : le signal est plus puissant que le bruit.
SNR nul : il y a autant de bruit que de signal.
SNR négatif : le signal est dégradé, il ya plus de bruit que d’information.
L’énergie d’un signal x(k) est fournie sous matlab par sum(x.^2). Concernant la
puissance moyenne, il faut diviser l’énergie par le nombre d’éléments de x(k).
PARTIE THEORIQUE
1- s(t) étant un signal défini sur [-T/2,T/2], on peut l’analyser sous la forme :
s(t ) C e
n
n
j 2nf 0t
Avec :
T
2
1
s(t )e
j 2nf 0t
Cn= dt , f0=T 1
T T
2
(Cn)n constituent le spectre de Fourier du signal s(t) aux fréquences (harmoniques) nf 0 multiples
du fondamental f0.
s(t)=sin(t) si 0≤ t <
a) Tracer s(t).
b) Calculer la valeur moyenne de s(t).
c) Calculer la série de Fourier de s(t).
s(t)=0 si T/4<|t|<T/2
a) Tracer s(t).
b) Calculer la valeur moyenne de s(t).
c) Calculer la série de Fourier de s(t).
a) Tracer s(t).
b) Calculer la valeur moyenne de s(t).
c) Calculer la série de Fourier de s(t).
d) On définit le spectre de puissance du signal s(t) par Pn=Cn 2 , Cn désigne un coefficient
de Fourier.
Calculer Pn.
_____________________________________________________________________________________________________
Le compte rendu de la séance doit être rédigé sur la feuille qui vous est fournie
et doit contenir en plus de la partie théorique :
Un listing des programmes : prog1.m, prog2.m, prog3.m
___________________________________________________________________________
prog1.m
%TP2 : prog1.m
for i=1:n/4 rec(i)=1;end % on génére une impulsion rectangulaire Rec de durée n/4
x=[rec,zeros(1,n-1)]; % on complète avec des zéros car la convolution x*x admet 2n-1 échantillons
for m=1:k
end
end
___________________________________________________________________________
prog2.m
%TP 2 : prog2.m
s1=zeros(1,n);%initialisation
te=1/fe;t2=0:te:(n-1)*te;s2=zeros(1,n);
___________________________________________________________________________
TP2 : prog3.m
f=50;%fréquence de la sinusoide
a=1;%amplitude de la sinusoide
fe=2500;%fréquence d'échantillonnage
s=a*sin(2*pi*f*t);%génération du signal
Es=sum(s.^2);%énergie du signal
m=0;%moyenne du bruit
b=m+sigma*rand(1,n);%génération du bruit
y=s+b;%bruitage
Ps=Es/n;%puissance du signal
Pb=sigma^2;%puissance du bruit
subplot(2,2,1);plot(t,s);title('sinusoide');subplot(2,2,2);plot(t,b);title('bruit');subplot(2,2,3);
sin(u )
Où : sin c(u ) .
u
Obstacles pratiques :
Les signaux physiques observés possèdent le plus souvent des spectres
de Fourier occupant des bandes fréquentielles illimitées, donc Fmax est
infini.
L’observation d’un signal physique se fait durant un intervalle limité [0,T]
ce qui donne le plus souvent un spectre très étalé.
Pour pallier ces difficultés, il faut noter que le spectre d’un signal physique tend vers
zéro avec la fréquence (l’énergie du signal s’évanouit aux hautes fréquences). Ceci
nous permet de limiter la bande significative du spectre et par la suite appliquer le
théorème de Shannon.
II- Transformée de Fourier Discrète :
La TFD d’ordre N d’un signal numérique s(kTe), k=0…N-1 est définie par :
N 1
n
S(f)=S( .Fe )= s(kTe) Exp[ j 2kn / N ] , n= -N/2…N/2-1
N k 0
La transformation inverse :
N / 2 1
1
s(t)=s(kTe)=
N
S (nFe / N ) Exp[ j 2kn / N ] , k=0…N-1
n N / 2
Remarques :
Par abus d’écriture et pour simplifier on note s(k) et S(n) le signal
et sa TFD en omettant les facteurs Te et Fe.
N est souvent une puissance de 2 et dans ce cas il ya un
algorithme rapide de calcul des N coefficients de la TFD, on parle
de FFT (Fast Fourier Transform).
Ainsi aux coefficients s(1)…s(N) correspondent par TFD les coefficients S(1)…S(N).
Sous matlab la TFD est donnée par la fonction fft(s,N).
La transformée inverse est donnée par ifft(s,N).
Transformée de Fourier Discrète
35
30
|S(nFe/N)|
25
20
15
10
5
0
Fe/N 2Fe/N 3Fe/N 4Fe/N (1-1/N)Fe
nFe/N (Hertz)
20*log10(abs(fft(s,N)))
angle(fft(s,N))
Repliement de spectre (aliaising)
prog1.m :
Générer et visualisez les n/8 points de la TFD d’ordre n d’une sinusoïde
sin(t) ainsi que sa phase. Utiliser le zoom et « data cursor » pour lire les
pics.
Faites de même pour une somme de sinusoïdes sin[(2k+1)t], k=0…4.
prog2.m
Générer et visualisez Rec(k), sur 2 secondes. Visualisez les n/8 points
des spectres d’amplitude et de phase de la TFD d’ordre n=512 en
respectant les unités temporelle et fréquentielle.
Générer et visualisez la convolution z(k) de Rec(k) avec lui-même
(utilisez la fonction conv(Rec,Rec)) ainsi que sa TFD et sa phase (Les
n/8 points uniquement).
Comparez la TFD de z(k) et le carré de la TFD de Rec(k).
Générez wave(k) une onde carrée à l’aide de la fonction square( pour
l’utiliser correctement tapez help square).
Visualisez wave et sa TFD.
prog3.m
Générer et visualisez la TFD d’une sinusoïde bruitée de fréquence f0 en
lui rajoutant un bruit blanc centré de puissance 2 et observez si l’on
distingue le pic correspondant à la fréquence de la sinusoïde. Testez
plusieurs valeurs de 2 et de f0.
PARTIE THEORIQUE
I- Propriétés de la TFD
II- Modulation
On considère un signal s(t) dont la transformée de Fourier S(f) occupe la bande de
fréquences [-Fmax,Fmax].
TPIII : TFD
___________________________________________________________________________
prog1.m
n=1024;%nombre de points
x=sin(t);%sinusoide
y=fft(x);%sa tfd
moduly=abs(y);phasey=angle(y);
s=zeros(1,n);%initialisation de la somme
z=fft(s);%tfd de s
modulz=abs(z);phasez=angle(z);
%On visualise les n/8 points pour bien voir les pics
subplot(3,2,1);plot(t,x);title('sin(t)');grid on;
subplot(3,2,3);plot(f(1:n/8),moduly(1:n/8));
title('spectre d''amplitude de sin(t)');grid on;
___________________________________________________________________________
prog2.m
%TP 3 : prog2.m
s=fft(rec);moduls=abs(s);%spectre de module
phases=angle(s);%spectre de phase
te=2/n;%pas d'échantillonnage
fe=1/te;%fréquence d'échantillonnage
t=0:te:(n-1)*te;%durée d'observation
sx=fft(x);modulx=abs(sx);phasex=angle(sx);
sw=fft(wave);modulw=abs(sw);
%on visionne les n/8 points pour voir les pics sans zoomer
___________________________________________________________________________
prog3.m
%TP3 : prog3.m
n=1024;%nombre de points
fe=1/te;
f0=1;
y=fft(x);%sa tfd
moduly=abs(y);
phasey=angle(y);
%On visualise les n/8 points pour bien voir les pics
subplot(3,1,1);plot(t,x);title('sin(t)+randn(t)');grid on;
2- Fenêtre d’analyse :
Une fenêtre d’analyse est une mise en forme que l’on donne au signal avant de
l’analyser par TFD :
On multiplie s(k) terme à terme par une fenêtre w(k) de forme adéquate pour réduire les
lobes secondaires afin que le spectre observé tende vers le résultat théorique qui est
pour une sinusoïde de fréquence f0 une raie pure à la fréquence f0.
Les analyseurs de spectre (appareils qui donnent le spectre d’un signal) proposent de
nombreuses fenêtres d’analyse, qui ont chacune des effets différents : Blackman,
Hamming, Hanning…
Sous matlab on peut utiliser les fonctions hanning(N) et blackman(N) pour le fenêtrage
(ce sont deux vecteurs colonnes de taille N).
f=Fe/N
On va essayer de voir les limites de l’analyse par TFD en essayant de détecter des
sinusoïdes prôches.
12. Visualise la TFD X(n) d’un signal rectangulaire x(k), sa fonction d’auto-corrélation
R(n) et la TFD de R. Utiliser xcorr(x,x,’biased’) ;
13. Visualise un bruit blanc b(k), son auto-corrélation B(n) et la TFD de B.
14. En comparant R(n) et X(n), vérifiez le théorème de Wiener-kinchine.
PARTIE THEORIQUE
On désigne par u(t) l’échelon unité, nul pour t négatif et égal à 1 ailleurs.
5- Quelle est la puissance ΔP localisée dans la bande [f0- f/2, f0+ f/2] d’un signal s(t) à
puissance moyenne finie. Que se passe-t-il si f tend vers zéro ?
_________________________________________________________________
Le compte rendu de la séance doit être rédigé sur la feuille qui vous est fournie et
doit contenir en plus de la partie théorique :
Un listing du programme :
prog1.m, prog2.m, prog3.m, prog4.m
TP IV : ANALYSE SPECTRALE
___________________________________________________________________________
prog1.m
%TP4 : prog1.m
clear all;
f0=100;%fréquence de la sinusoïde
fe=1000;%fréquence d'échantillonnage
te=1/fe;
for k=1:6
m=ordre(k);%ordre de la TFD
t=0:te:(m-1)*te;%durée observée
s=sin(2*pi*f0*t);%génération de la sinusoïde
x=fft(s,m);
y=abs(x);%spectre de module
end
___________________________________________________________________________
prog2.m
%TP 4: prog2.m
clear all;
n=512;
blak=blackman(n);%fenêtre de blackman
mhan=abs(fft(han));
mblak=abs(fft(blak));
f0=100;%fréquence de la sinusoïde
fe=1000;%fréquence d'échantillonnage
te=1/fe;t=0:te:(n-1)*te;%durée observée
s=sin(2*pi*f0*t);clear f;%initialisation de f
sh=s.*han';%fenêtrage
sb=s.*blak';%fenêtrage
msh=abs(fft(sh));msb=abs(fft(sb));
subplot(4,2,5);plot(sh);title('sin(t)*hanning');grid on;subplot(4,2,6);plot(sb);title('sin(t)*blackman');grid
on;subplot(4,2,7);plot(f,msh(1:n/2));title('spectre de sin*hanning');grid on;
___________________________________________________________________________
prog3.m
%TP4 : prog3.m
fe=1000;%fréquence d'échantillonnage
te=1/fe;
for k=5:8% calcul des TFD d'ordres 256, 512, 1024, 2048
n=2^(3+k);%ordre de la TFD
t=0:te:(n-1)*te;%durée observée
x=fft(s,n);%TFD de la somme
y=abs(x);%spectre de module
%Affichage
end
___________________________________________________________________________
prog4.m
%TP4 : prog4.m
mx=abs(X);
sr=fft(R);%TFD de R
B=xcorr(b,b,'biased');%autocorrélation du bruit
mb=abs(sb);
%affichage
1- La puissance acoustique
P
P étant la puissance par cm2, la puissance en dB s’écrit : PdB 10. log10 , avec P0=10-
P0
16
. La puissance est proportionnelle au carré de la pression subie par le tympan.
L’écart de puissance minimum distinguable par l’oreille est de l’ordre de 1dB soit à peu
près 11% d’écart relatif en puissance (correspond à une pression minimale de 20
micropascales).
L’oreille possède une sensibilité logarithmique : un facteur deux ressenti correspond à
un facteur dix en puissance.
2- La hauteur du son
Le fondamental étant f, les harmoniques sont 2f, 3f, 4f, …liés respectivement aux modes
fondamental (do3), second (do4), troisième (sol4)…
3. Le timbre
Il correspond au contenu spectral du son, peu importe son allure temporelle.
4. Echelle logarithmique
la séparation minimum entre niveaux distinguables étant de 1dB, pour coder la plage
allant de 0dB à 120 dB il faudra coder la plage de puissance allant de 0 à 10 12 soit sur
40 bits.
Du fait que l’oreille ait une sensibilité logarithmique, seuls 120 niveaux sont
distinguables, d’où un codage sur 8 bits uniquement. Cela exige une quantification
logarithmique des échantillons sonores (Echelle de quantification compensée).
X étant la donnée originale, la donnée quantifiée Y s’écrit :
ln(1 . X )
Y , 0 X 1 (standard US, ex. =255)
ln(1 )
1 ln( A. X )
Y , 1/A X 1 (standard EU, ex. A=87.6)
1 ln( A)
5. Qualité des données audio
u=wavread(‘son1.wav’,N) ;
u contient les N premières données ou échantillons.
fid=fopen(‘son1.wav’,’r’) ;
Ouvre le fichier son en tant que flot de données non spécifiés pour sa lecture.
fid est le pointeur du fichier :pointe la donnée actuelle.
son_lu=fread(fid,inf,’int16’);
son_lu est un vecteur colonne constitué de données 16 bits ;
inf demande la lecture jusqu’à la fin du fichier.
fclose(fid); Ferme le fichier.
Testez ces instructions sur un fichier son et en déduire la taille de l’entête.
wavwrite(x,fs,’son2.wav’) ;
prog2.m
Enregistrer un son x stéréo de durée 16 secondes.
Visualisez sur deux systèmes d’axes différents les N=2048 premiers échantillons
de chaque canal (un extrait y).
Visualisez les spectres de phase et d’amplitude correspondant à y.
Modifier le contenu de x, en effaçant quelques passages, puis écouter le résultat.
prog3.m
Mixage : Enregistrer deux sons différents x1 et x2 et fusionner les données
alternativement (un morceau de x1 suivi d’un morceau de x2…etc) dans un
fichier y .
Ecouter x1, x2 et y .
___________________________________________________________________
Le compte rendu de la séance doit être rédigé sur la feuille qui vous est fournie et
doit contenir un listing des programmes : prog1.m, prog2.m, prog3.m
TP V : NOTIONS d’AUDIO
play(x);
___________________________________________________________________________
wavplay(x,fs);%ecoute
siz=wavread(son,'size');%
fprintf('nombre d''échantillons:');siz(1)
fprintf('nombre de canaux:');siz(2)
fprintf('durée du son:');siz(1)/fs
fclose(fid);
___________________________________________________________________________
prog1.m
te=1/fe;%pas d'échantillonnage
D=100/f0;%durée du son
n=D*fe+1;%nombre de samples
t=0:te:D;%durée du son
wavplay(x);%écouter
wavplay(y);
___________________________________________________________________________
prog2.m
%enregistrement audio
recordblocking(x,D) ;
play(x);
y2=y(1:n,2);%extrait canal 2
subplot(3,2,1);plot(y1(1:n));title('extrait de l''enregistrement');
subplot(3,2,3);plot(abs(fft(y1)));title('spectre d''amplitude');
subplot(3,2,5);plot(angle(fft(y1)));title('spectre de phase');
subplot(3,2,2);plot(y2(1:n));title('extrait de l''enregistrement');
subplot(3,2,4);plot(abs(fft(y2)));title('spectre d''amplitude');
subplot(3,2,6);plot(angle(fft(y2)));title('spectre de phase');
%modification de l'enregistrement
L=size(y,1);
wavplay(z,fs);
_________________________________________________________________________
prog3.m
%TP5 prog3.m
%mixage audio
clear all;
recordblocking(x1,D) ;
recordblocking(x2,D) ;
%modification de l'enregistrement
L=size(y1,1);%nombre d'échantillons
z=[y1(1:L/4,:);y2(1:L/4,:);y1(L/4+1:L/2,:);y2(L/4+1:L/2,:)];%mixage
wavplay(z,fs);
TP VI MODULATIONS NUMERIQUES
_____________________________________________________________________________________________________
I- Modulations analogiques
On se propose de moduler un signal audio en utilisant les fonctions Matlab ammod et pmmod.
1- Modulation d’amplitude
prog2.m
Visualiser et écouter les trois signaux x ,y et z ainsi que leurs spectres d’amplitude.
2- Modulation de phase
x = sin(2*pi*t) + sin(4*pi*t);
Fp = 10;
y = pmmod(x,Fc,Fs,phasedev); % Modulation
Matlab permet d’effectuer le tracé des constellations des modulations les plus courantes (trace
l’enveloppe complexe des symboles de l’alphabet). En voici deux exemples :
PSK-16
x = int16([0:M-1]);
QAM-32
M = 32;
x = int16([0:M-1]);
y = qammod(x,M);
scale = modnorm(y,'peakpow',1);
2- Modulation QAM-16
y = qammod(x,M); % modulation
Visualisez x et y.
scatterplot(ynoisy);
z = qamdemod(ynoisy,M); % démodulation
Visualisez x, y, ynoisy et z
PARTIE THEORIQUE
4- Donner l’enveloppe et la phase du signal modulé x(t ) a(t ).cos(2 . f 0 t ) , a(t) étant
un signal réel. Faire un tracé qui illustre l’enveloppe de x(t).
L’enveloppe complexe d’un signal réel x(t) est définie, pour une pulsation arbitraire 0
par : ~ x (t ).e j.0t
r (t ) ~
On peut interpréter l’enveloppe complexe comme le résultat d’une modulation
d’amplitude du signal analytique.
5- Exprimer les parties réelles et imaginaires a(t) et b(t) de ~
r (t ) en fonction de x(t),
y(t) et les porteuses sin( 0 t) et cos( 0 t).
a(t) et b(t) s’appellent la composante en phase (IN) et en quadrature (Q) du signal réel
x(t).
6- Inversement, exprimer x(t) et y(t) en fonction de a(t), b(t) et les porteuses.
7- On considère un signal x(t) réel, aléatoire ou non, à spectre passe
bande symétrique :
x ( f ) 1 , pour f1 f f 2 Et nul ailleurs.
8- Exprimer les spectres de x(t), a(t) et b(t) en fonction du spectre de l’enveloppe
complexe. Faites un schéma illustratif.
_____________________________________________________________________________________________________
Le compte rendu de la séance doit être rédigé sur la feuille qui vous est fournie et
doit contenir en plus de la partie théorique : Un listing des programmes prog1.m et
prog2.m
TP VI : MODULATION
prog1.m
%modulation analogique
fe=8000;%fréquence d'échantillonnage
te=1/fe;
n=512;%ombre de points
t=0:te:te*(n-1);%durée d'observation
x=sin(2*pi*f0*t);%signal à moduler
fp=2500;%fréquence porteuse
p=cos(2*pi*fp*t);%la porteuse
sx=abs(fft(x));
sp=abs(fft(p));
sm=abs(fft(m));
sdm=abs(fft(dm));
f=0:fe/n:fe/2-fe/n;
%visualisation
subplot(4,2,1);plot(x);title('signal original');grid on;
___________________________________________________________________________
prog2.m
clear all;
[x,fe]=wavread(nom);
sx=abs(fft(x));%spectre original
te=1/fe;
n=size(x,1);%taille du son
T=te*(n-1);
fp=5000;%fréquence porteuse
t=0:te:T;%durée du son
y=ammod(x,fp,fe);%modulation d'amplitude
z=amdemod(y,fp,fe);%démodulation d'amplitude
sz=abs(fft(z));%spectre du son démodulé
f=0:fe/n:fe/2-fe/n;%plage spectrale
wavplay(x,fe);
wavplay(y,fe);
wavplay(z,fe);
subplot(3,2,1);plot(x(1024:2*1024));title('signal audio');
I- Estimation de la moyenne
Soit X une variable aléatoire stationnaire d’ordre un et x(1)…x(N) une série de N observations
ou mesures de X décorrélées. On se propose d’étudier le comportement de l’estimateur de la
moyenne =E[X] suivant (moyenne empirique):
1 N
̂ ( N ) . x(i)
N i 1
prog1.m
N.B. : Avant chaque génération de bruit il faut initialiser le processus de génération à l’aide de la
commande rand('state',0);
1 N
ˆ 1 2 ( N ) . [ x(i ) ˆ ( N )]2
N i 1
1 N
ˆ 2 2 ( N ) . [ x(i) ˆ ( N )]2
N 1 i 1
prog2.m
Générez 1000 échantillons décorrélés d’une variable aléatoire X stationnaire au second
ordre en additionnant une sinusoïde et un bruit blanc de moyenne =5 et de variance
2 =1.5.
Calculez les deux estimateurs ˆ (N) pour les valeurs de N = 1…1000.
Visualisez ˆ 1(N), l’erreur (N)=( ˆ 1- )(N) et l’erreur quadratique 2(N).
Est ce qu’il y a convergence?
On considère un signal constant C noyé dans un bruit b(k) blanc centré de variance v, le signal
résultant observé est s(k). On estime la valeur de la constante en prenant la moyenne de s(k).
PARTIE THEORIQUE
Soit N échantillons [x1,…xN] extraits d’un signal stationnaire X centré d’ordre deux de fonction de
corrélation inconnue RX(n)=E[x(k).x(k+n)].
prog1.m
T=2*pi;%période du signal
te=1/fe;
t=0:te:4*T;%durée observée
s=sin(2*pi*t/T);%le signal
mu=5;%moyenne du bruit
b=mu+randn(1,n);%le bruit
x=s+b;%signal bruité
moyenne(k)=mean(x(1:k));
end
e=moyenne-5;%le biais
eqd=e.^2;%l'erreur quadratique
subplot(2,2,1);plot(t,x);
subplot(2,2,2);plot(moyenne);
xlabel('N');grid on;subplot(2,2,4);plot(eqd);
xlabel('N');grid on;
___________________________________________________________________________
prog2.m
clear all;
T=2*pi;%période du signal
a=1;%amplitude du signal
te=1/fe;
t=0:te:4*T;%durée observée
s=a*sin(2*pi*t/T);%le signal
mu=5;%moyenne du bruit
b=mu+sigma*randn(1,n);%le bruit
x=s+b;%signal bruité
variance1(1)=0;%initialisation
variance2(1)=0;
variance1(k)=mean((x(1:k)-mean(x(1:k))).^2);
variance2(k)=k/(k-1)*variance1(k);
end
e1=variance1-Px;%le biais
eqd1=e1.^2;%l'erreur quadratique
e2=variance2-Px;%le biais
eqd2=e2.^2;%l'erreur quadratique
%premier estimateur
subplot(2,4,1);plot(t,x);
subplot(2,4,2);plot(variance1);
title('variance1');xlabel('N');grid on;
subplot(2,4,3);plot(e1);
xlabel('N');grid on;
subplot(2,4,4);plot(eqd1);
xlabel('N');grid on;
%second estimateur
subplot(2,4,5);plot(variance2);
title('variance2');xlabel('N');grid on;
subplot(2,4,6);plot(e2);
xlabel('N');grid on;
subplot(2,4,7);plot(eqd2);
xlabel('N');grid on;
___________________________________________________________________________
prog3.m
te=1/fe;
t=0:te:T;%durée observée
mu=0;%moyenne du bruit
v=C/2;
b=mu+sqrt(v)*randn(1,n);%le bruit
Ce=mean(x);
e=Ce-C;%le biais
eqd=e.^2;%l'erreur quadratique
fprintf('Biais : %d\n',e);
fprintf('EQ : %d\n',eqd);
TP VIII FILTRAGE NUMERIQUE
Remarques :
il peut y avoir plusieurs fréquences de coupure.
Les fonctions filter, fir1, fir2, remez…permettent la création de filtres
suivant plusieurs méthodes.
La réponse fréquentielle (RF) du filtre, égale à la TFD de la RI en dB, doit
être contenue dans le gabarit pour que le filtre soit utilisable
correctement ; sinon on dit que la méthode diverge :il faut chercher une
autre procédure.
Le module de H(f) étant déterminé, le choix de la phase se fait
généralement en prenant tous les pôles et zéros de h(k) à l’intérieur du
cercle unité (exigences de stabilité et de causalité).
Passe haut
|H(f)
tra
|
ond
att
coupée
passante
|
f1 fc Fe/2 f
La fonction matlab y=filter(b,a,x) permet de filtrer le signal x(kTe), la sortie du filtre étant y(kTe).
b et a sont les vecteurs dont les éléments sont les coefficients du numérateur et du
dénominateur de la fonction de transfert du filtre :
M
b
m 0
m z m
H(z)= N
, b=[b0,..,bM], a=[a0,..,aN]
a
n 0
n z n
On se propose de rehausser une sinusoïde noyée dans le bruit. Un bruit blanc possède
un spectre étalé sur toute la bande fréquentielle, alors que celui du sinus est concentré
autour de sa fréquence.
prog4.m
H(z)=1+2 z 1 +3 z 2
___________________________________________________________________________
prog1.m
% filtrage numérique
%réponses impulsionnelles
clear all
n=32;%nombre d'échantillons
d=zeros(1,n);%impulsion de Dirac
d(1)=1;
for i=1:5
subplot(2,3,i);stem(h(i,:));title(['h' num2str(i,'%d')]);
end
%visualisation des RF
for i=1:5
H(i,:)=abs(fft(h(i,:)));
subplot(2,3,i);plot([-1/2+1/n:1/n:1/2],H(i,:));title(['H' num2str(i,'%d')]);grid on
end
for i=1:5
end
T=100;
t=0:2*T;
x=sin(2*pi*t/T);
for i=1:5
end
ech=ones(1,n);%échelon unité
%visualisation
for i=1:5
end
__________________________________________________________________________
prog2.m
% Synthèse par TFD d'un filtre passe bas
clear all;
max=10^(datt/20);
Hg=[ones(1,8) min inter max max/2 max/4 zeros(1,n-26) max/4 max/2 max inter min ones(1,8)];
mH=abs(H);
pH=angle(H);
%visualisations
%Filtrage d'harmoniques
te=1/fe;%pas d'échantillonnage
t=0:te:(n-1)*te;%durée d'observation
e1=sin(2*pi*f1*t);
e2=sin(2*pi*f2*t);
s2=real(ifft(H.*fft(e2)));
%affichage
________________________________________________________________________
prog3.m
%Filtrage d'harmoniques
fe=8000;%fréquence d'échantillonnage
te=1/fe;
f0=100;%le fondamental
n=1024;
t=0:te:(n-1)*te;%durée d'observation
x=zeros(1,n);%initialisation
f=0:fe/n:fe/2-fe/n;%bande 0,fe/2
sx=abs(fft(x));%module du spectre
%visualisation
subplot(3,2,2);plot(f,sx(1:n/2));
H=fft(h);%RF estimée
mH=abs(H);
xf=conv(h,x);%signal filtré
%visualisation
___________________________________________________________________________
prog4.m
clear all;
fe=10000;%fréquence d'échantillonnage
te=1/fe;
f0=1000;%le fondamental
n=256;
t=0:te:(n-1)*te;%durée d'observation
x=sin(2*pi*f0*t);%sinusoide
b=sigma*randn(1,n);%bruit
y=x+b;%signal bruité
sx=abs(fft(x));%spectre original
f=0:fe/n:fe/2-fe/n;
subplot(3,2,1);plot(t,x);title('sinusoide');
subplot(3,2,2);plot(t,b);title('bruit');
subplot(3,2,3);plot(f,sx(1:n/2));title('spectre de la sinusoide');
subplot(3,2,4);plot(t,y);title('sinusoide bruitée');
z=filter(ones(1,m)/m,1,y);%moyennage mobile
subplot(3,2,5);plot(t,z);title('sinusoide débruitée');
sz=abs(fft(z));
subplot(3,2,6);plot(f,sz(1:n/2));title('spectre débruité');
TP IX NOTIONS de TRAITEMENT d’IMAGES
_____________________________________________________________________________________________________
I- DEFINITIONS
1- Une image à deux dimensions est définie comme une matrice I(N,N) de N ligne et N
colonnes.
2- Le point (i,j) est appelé pixel (picture cell), sa valeur I(i,j) réelle traduit le degré de luminosité
de l’image au point (i,j) : On l’appelle niveau de gris de l’image au point (i,j).
3- Généralement N est une puissance de 2 (32,64,…,1024..) et le niveau de gris des pixels varie
entre 0 et 255=256-1=2 8 -1.
0 correspond au noir (luminosité minimum) et 255 au blanc (luminosité maximum) ; Tous les
niveaux sont codables sur 8 bits (octet ou byte). Ceci pour une image noir et blanc, pour une
image couleur, il faut prévoir trois matrices qui correspondent aux niveaux du rouge, vert et bleu
(RVB ou RGB).
pixel
(1, N )
(1,1)
( N ,1) (N , N )
Les images noir et blanc ou couleur occupent beaucoup d’espace mémoire, ceci est ressenti
lors de la conception d’un programme manipulant plusieurs images.
Ainsi une image telle que celle définie ci-dessus, va occuper NxNx8 bits ou encore NxN
octets (un Kilo octets=1Kb=1024 octets=2 10 octets):
N Mémoire en bytes Mémoire en Kby
128 16.384 16
256 65.536 64
On parle aussi de compression d’une image. Vue la taille occupée par une image, surtout en
couleur et lorsque les images sont animées, on a inventé des méthodes qui permettent de
réduire considérablement la taille mémoire d’une image après compression : On distingue les
images bitmap, tif, gif, epg, jpeg…suivant la méthode de compression utilisée.
MATLAB Dénomination
Une entête : c’est une suite d’octets spécifiant le nombre de lignes et de colonnes
de l’image, le nombre d’octets par pixel, le genre de codage utilisé pour
compresser l’image…
C’est justement le format induit par la méthode de compression : tif, gif,
mpeg…
Les données : c’est la suite des niveaux de gris de tout les pixels de l’image
tenant compte de la méthode de compression, ce qui exige pour lire l’image un
programme spécifique connaissant le code de l’image.
Si R est une matrice NxN, la commande imwrite (R,’nom.tif’) crée une nouvelle image
NxN nom.tif dont les pixels ont les niveaux de gris figurant dans la matrice r.
Exemple 1
Cette instruction stock l’image cameraman.tif dans une matrice i de type uint8.
Les niveaux de gris de l’image sont disponibles maintenant dans la matrice i, ce qui nous
permet d’effectuer toutes les transformations possibles sur cette image et de sauver les résultats
du traitement dans une autre image (il faut la convertir au type double avant de la manipuler
x=double(i)).
Les opérations mathématiques nécessaires s’effectuent sur des variables de type double ; il
serait indispensable de convertir les images sources avant leur traitement de la manière
suivante :
id=double (isource) ;
prog1.m :
m=mean (i( :) ); % donne la moyenne de tous les niveaux de gris :un scalaire
On considère le pixel x(i,j) d’une image donnée à laquelle on a additionné un bruit gaussien
(utiliser rand(N,N)), et on s’intéresse à ses 8 pixels proches voisins : x(i-1,j-1), x(i,,j-1), x(i+1,j-1),
x(i-1,j), x(i+1,,j), x(i-1,j+1), x(i,j+1) et x(i+1,j+1). Ces neuf pixels forment une fenêtre locale :
Un filtrage linéaire de l’image x(.,.) consiste à créer une nouvelle image y(.,.) en glissant le
masque point par point et en effectuant une combinaison pondérée linéaire des niveaux de gris :
m 3 n 3
y (i, j ) a m,n .x(i m 2, j n 2)
m 1 n 1
Réalisez un programme prog2.m qui effectue le filtrage local 3x3 et visualisez le résultat pour
plusieurs images. Quel est l’effet du filtre ?
Filtrage médian
Le filtrage médian est une opération non linéaire, qui consiste en deux étapes :
prog3.m
Le seuillage d’une image consiste à choisir un nombre réel s (threshold) et de tester les pixels
de l’image point par point et ligne par ligne : tout niveau de gris inférieur au seuil s est mis à zéro
(noir) sinon il est mis à 255 (blanc) ou 1 : Binarisation.
Matlab permet en une seule instruction de comparer les éléments d’une matrice M à un seuil
donné s : a=(M>s), a est une matrice composée de 1 et de 0.
prog4.m
L’image C contient les limites ou frontières ou périmètres des objets contenus dans Im. Par
exemple si Im est la photo d’un disque plein alors C sera une image contenant un cercle de
même centre et rayon que le disque.
Méthode du gradient :
Le parcours d’une image ligne par ligne (ordre lexicographique) dans un programme s’effectue
de la manière suivante :
traitement1 ;
traitement2 ;…
end
end
prog5.m
____________________________________________________________________________________________________
Le compte rendu de la séance doit être rédigé sur la feuille qui vous est fournie et
doit contenir :
Un listing des programmes : prog1.m, prog2.m, prog3.m, prog4.m, prog5.m
___________________________________________________________________________
prog1.m
sup=max(x(:));%niveau max
inf=min(x(:));%niveau min
m=mean(x(:));%moyenne
v=mean(d(:));%variance
s=sqrt(v);%ecart type
___________________________________________________________________________
prog2.m
%TP 9 prog2.m
clear all;
isource=imread('cameraman.tif');%lecture de l'image
n=256;%taille de l'image
end
%affichage
subplot(1,2,1);imshow(isource);title('image originale');
___________________________________________________________________________
prog3.m
%TP 9 prog3.m
%Filtrage median
clear all;
isource=imread('cameraman.tif');%lecture de l'image
n=256;%taille de l'image
end
end
%affichage
subplot(1,2,1);imshow(isource);title('image originale');
___________________________________________________________________________
prog4.m
clear all;
isource=imread('cameraman.tif');%lecture de l'image
m=mean(x(:));%moyenne de l'image
sx=255*(x>s);%seuillage par s
sx2=255*(x>m);%seuillage par m
%affichage
subplot(2,2,1);imshow(isource);title('image originale');
___________________________________________________________________________
prog5.m
clear all;
isource=imread('cameraman.tif');%lecture de l'image
n=256;%taille originale
for i=1:n-1
for j=1:n-1
ch(i,j)=abs(x(i,j+1)-x(i,j));%gradient horizontal
cv(i,j)=abs(x(i+1,j)-x(i,j));%gradient vertical
end
end
mcv=mean(cv(:));
ym=(ch+cv)/2;%le gradient moyen
ch1=255*(ch>mch);%binarisation du gradient h
cv1=255*(cv>mcv);%binarisation du gradient v
%affichage
subplot(2,4,1);imshow(isource);title('image originale');
subplot(2,4,2);imshow(uint8(ch));title('gradient horizontal');
subplot(2,4,3);imshow(uint8(cv));title('gradient vertical');