TP 1 Matlab – Séries de Fourier et transformée en ondelettes sur

Transcription

TP 1 Matlab – Séries de Fourier et transformée en ondelettes sur
TP 1 Matlab – Séries de Fourier et transformée en ondelettes sur des signaux 1D
Master 2 Pro IIA – Module A.I.
1) Installation des toolboxes
- Vous devez télécharger 2 toolboxes (pour Matlab) à ces adresses :
http://www.ceremade.dauphine.fr/~peyre/numerical-tour/tours/toolbox_general.zip
http://www.ceremade.dauphine.fr/~peyre/numerical-tour/tours/toolbox_signal.zip
- Dézippez-les dans le répertoire « rep » de votre choix (celui où vous allez travailler)
(vous obtenez deux répertoires : toolbox_general/ et toolbox_signal/)
ATTENTION à ne pas avoir ceci : rep/toolbox_general/toolbox_general/ !
- Avant de démarrer, vous devez exécuter cette ligne dans Matlab :
getd = @(p)path(path,p);
- Puis il faut ajouter les 2 toolboxes au PATH, pour cela, placez-vous dans votre répertoire de
travail « rep » (avec la commande cd ou l’explorateur de Matlab), puis ajoutez ces 2 lignes :
getd('toolbox_signal/');
getd('toolbox_general/');
2) Charger et afficher des signaux
2.1) http://www.ceremade.dauphine.fr/~peyre/numerical-tour/tours/introduction_2_signal/ est
l’adresse où vous trouverez un ensemble de fonctions Matlab pour charger et afficher des signaux 1D
ATTENTION les signaux 1D seront représentés par des vecteurs colonnes !
2.2) Essayez les signaux suivants (définis dans l’une des toolboxes) : 'step', 'regular' et 'rand'
(les 2 dernières fonctions sont aléatoires c’est-à-dire différentes à chaque fois : à vérifier).
Affichez-les tous dans une même fenêtre, en ne gardant que les 512 premiers échantillons pour
chaque signal : fonction rescale)
help load_signal
% pour voir les autres signaux disponibles
2.3) Pour générer 128 échantillons d'une sinusoïde de fréquence Freq, on peut procéder ainsi :
1. Donner une valeur à la fréquence de la sinusoïde : Freq = 1000 ;
2. Choisir une fréquence d'échantillonnage : Fe = 8000 ;
3. Créer le vecteur des temps : t = (0:127)/Fe ;
4. Enfin calculer les échantillons : x = sin(2*pi*t*Freq) ;
5. Regarder le résultat : plot(x) ou plot(t,x).
A partir de la sinusoïde précédente, changez sa fréquence (et éventuellement son échantillonnage,
sans descendre en-dessous de Fe = 2000). Regardez le résultat à l’affichage (avec la même échelle).
2.4) En utilisant des sommes de cosinus, retrouvez le signal donné en cours (CM1 – diapo n°14),
avec t = 0:0.001:1.
3) Comparaison des ondelettes de Haar et de Daubechies en 1D
3.1) Analyse en ondelettes
Sur le signal 'piece-regular' avec 512 échantillons :
N = 512;
name = 'piece-regular';
f = rescale(load_signal(name,N)); % rescale : signal d’amplitude
clf; subplot(2,1,1); plot(f); axis('tight'); title('Signal');
ϵ [0,1]
3.1.1) Ondelettes de Haar normalisées sur 1 niveau de résolution
Lancer et analyser le code suivant :
A = f(1:N);
% A : vecteur colonne de 512 lignes
Coarse = ( A(1:2:length(A)) + A(2:2:length(A)) ) / sqrt(2);
Detail = ( A(1:2:length(A)) - A(2:2:length(A)) ) / sqrt(2);
A = [Coarse ; Detail];
% A : vecteur colonne de 512 lignes
subplot(2,1,2); plot(A); axis('tight'); title('Haar sur un niveau');
Que peut-on dire des figures obtenues par le code suivant :
s = 400; t=40;
clf;
subplot(2,1,1); plot(f, '.- '); axis([s-t s+t 0 1]); title('Signal (zoom)');
subplot(2,1,2); plot(Coarse, '.- ');
axis([(s-t)/2 (s+t)/2 min(A) max(A)]); title('Moyennes (zoom)');
3.1.2) Ondelettes de Haar normalisées sur 8 niveaux de résolution (max possible pour 512 éch.)
Appliquer la fonction suivante : fwH = analyse_haar(f) au signal 'piece-regular' et analyser les
résultats obtenus ainsi que le code Matlab de cette fonction.
Tester le code suivant et analyser le résultat :
figure; plot_wavelet(fwH);
axis([1 N -2 2]);
ATTENTION, dans la fonction ‘analyse_haar’ les niveaux de résolution sont décroissants :
- Signal original : niveau 9
- Signal juste plus grossier : niveau 8
- …
- Signal le plus grossier : niveau 0
Dans ‘toolbox_signal’, la fonction fwH = perform_haar_transf(f,Jmin,+1) réalise l’analyse
de Haar pour des signaux f de n’importe quelle dimension, jusqu’au niveau de résolution Jmin.
3.1.3) Ondelettes de Daubechies sur plusieurs niveaux de résolution
Appliquer la fonction suivante : [fwD,h,g] = analyse_daub(f,p) au signal 'piece-regular' où :
f : signal à analyser
fwD : transformée en ondelettes obtenue
h : filtre passe-bas correspondant aux fonctions d’échelles de Daubechies
g : filtre passe-haut correspondant aux fonctions d’ondelettes de Daubechies
p : longueur des filtres h et g
 si p = 2, on retombe sur les ondelettes de Haar (1 moment nul)
 si p = 4, les filtres correspondants sont idéaux pour les signaux linéaires (2 moments nuls)
 si p = 6, les filtres sont idéaux pour les signaux quadratiques (3 moments nuls)
 on peut encore choisir p = 8,10,12,14,16,18 ou 20 (avec p/2 moments nuls)
Dans ‘toolbox_signal’, la fonction fwD = perform_wavortho_transf(f,Jmin,+1,options)
réalise l’analyse de Daubechies pour des signaux f de n’importe quelle dimension, jusqu’au niveau
de résolution Jmin et en appliquant le filtre passe-bas défini dans options.h.
Remarquer que les filtres h (passe-bas) et g (passe-haut) changent pour différents p et observer les
changements dans l’analyse du signal.
Tester le code suivant et analyser le résultat :
figure; plot_wavelet(fwD);
axis([1 N -2 2]);
3.1.4) Différence entre analyse_haar(f) et analyse_daub(f,2)
Observez les différences au niveau des détails obtenus par les 2 fonctions précédentes.
Expliquer cette différence en regardant la forme et la position des ondelettes obtenues à différents
niveaux de résolution, grâce aux fonctions :
- forme_ondelettes(0) : qui utilise la fonction perform_haar_transf
- forme_ondelettes(1,2) : qui utilise la fonction perform_wavortho_transf avec p=2
3.2) Vérifier que les analyses en ondelettes précédentes sont des transformations orthogonales :
c’est-à-dire qu’il y a conservation de l’énergie du signal après transformation (énergie des
coefficients d’ondelettes = énergie du signal) :
fprintf('Difference energie = %.3f\n', (norm(f)-norm(fwH))/norm(f));
fprintf('Difference energie = %.3f\n', (norm(f)-norm(fwD))/norm(f));
%pour Haar
3.3) Synthèse en ondelettes : transformée inverse
Toujours sur le signal 'piece-regular' avec 512 échantillons.
3.3.1) Ondelettes de Haar normalisées sur 8 niveaux de résolution
Appliquer la fonction suivante : frH = synthese_haar(fwH) et analyser les résultats obtenus ainsi
que le code Matlab de cette fonction. Tester le code suivant et analyser le résultat :
fprintf('Erreur de reconstruction = %.3f\n', (norm(f-frH))/norm(f));
3.3.2) Faire de même pour les ondelettes de Daubechies
En appliquant la fonction frD = synthese_daub(fwD,p) et en veillant à utiliser le même p à
l’analyse et à la synthèse !
Analyser les résultats pour plusieurs valeurs de p.
Tester le code suivant et analyser le résultat :
fprintf('Erreur de reconstruction = %.3f\n', (norm(f-frD))/norm(f));
3.4) Seuillage des coefficients d’ondelettes de Haar et de Daubechies
3.4.1) En faisant varier le seuil T
Ecrire une fonction Matlab fr = seuillage_ondelettes(f,T,type,p), qui prend en paramètres :
- f : le signal à analyser,
- T : le seuil,
- type : le type d’ondelettes considérées (= 0 pour Haar, = 1 pour Daubechies),
- p : la longueur des filtres (seulement pour Daubechies)
et retourne le signal reconstruit après ce seuillage (fr).
Cette fonction doit mettre à zéro tous les coefficients d’ondelettes dont l’amplitude (la valeur
absolue) est inférieure à T. Essayer T = 0.01, 0.1, 0.2, 0.5, 1, …
La fonction affichera dans une même fenêtre :
- les coefficients d’ondelettes originaux (avec la fonction plot_wavelet),
- les coefficients d’ondelettes seuillés (avec la fonction plot_wavelet),
- le signal fr reconstruit après ce seuillage.
Pour évaluer la qualité de reconstruction (différence de qualité entre les signaux fr et f),
utilisez la fonction p = psnr(f,fr).
Observer les différences obtenues avec les ondelettes de Haar et de Daubechies (vous pouvez
utiliser directement les fonctions perform_haar_transf et perform_wavortho_transf.
3.4.2) En ne conservant que m coefficients et en faisant varier m
Ecrire une fonction Matlab fr = seuillage_ondelettes_nb(f,m,type,p), qui, au lieu du seuil T,
prend en paramètre un nombre m et ne garde que les m coefficients d’amplitude maximale (tous
les autres seront mis à zéro). Utiliser pour cela la fonction sort de Matlab.
Essayer avec m = 25, 50, 100, ... en gardant le même affichage que précédemment et en faisant
varier le nombre de moments nuls des ondelettes de Daubechies (i.e. la taille des filtres).