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).