Main Content

La traduction de cette page n'est pas à jour. Cliquez ici pour voir la dernière version en anglais.

Lifting

Cet exemple montre comment utiliser le lifting sur un signal 1-D.

Créez un signal 1-D qui est une constante par morceaux sur 2 échantillons. Ajoutez le bruit N(0,0.12) au signal.

x = [1 1 2 2 -3.5 -3.5 4.3 4.3 6 6 -4.5 -4.5 2.2 2.2 -1.5 -1.5];
x = repmat(x,1,64);
rng default
x = x+ 0.1*randn(size(x));

Tracez le signal et zoomez sur les 100 premiers échantillons pour visualiser la corrélation dans les échantillons voisins.

plot(x)
xlim([0 100])
title('Signal')
xlabel('Index')
ylabel('Amplitude')

Figure contains an axes object. The axes object with title Signal, xlabel Index, ylabel Amplitude contains an object of type line.

Utilisez l'ondelette paresseuse pour obtenir les composantes polyphasées paires et impaires du signal. Tracez les coefficients de détails (ou d'ondelettes) dans D, et vérifiez que cette transformée n'a pas décorrélé le signal. Les coefficients d'ondelettes ressemblent beaucoup au signal.

LS = liftingScheme;
[A,D] = lwt(x,'LiftingScheme',LS,'Level',1);
plot(D{1})
xlim([0 100])
title('Detail Coefficients')
xlabel('Index')
ylabel('Amplitude')

Figure contains an axes object. The axes object with title Detail Coefficients, xlabel Index, ylabel Amplitude contains an object of type line.

Ajoutez une étape de lifting de prédiction qui soustrait le coefficient indexé pair du coefficient impair sur un échantillon ultérieur, x(2n+1)-x(2n).

ElemLiftStep = liftingStep('Type','predict','Coefficients',-1,'MaxOrder',0);
LSnew = addlift(LS,ElemLiftStep);

Le signal étant constant par morceaux sur des échantillons consécutifs avec un bruit additif, la nouvelle étape de prédiction devrait donner des coefficients d'ondelettes faibles en valeur absolue. Le cas échéant, la transformée en ondelettes décorrèle les données. Vérifiez cela en trouvant les coefficients d'approximation et de détails avec la nouvelle étape de prédiction.

[A,D] = lwt(x,'liftingScheme',LSnew,'Level',1);

Si vous tracez les coefficients de détails (ou d'ondelettes), vous constaterez que les coefficients d'ondelettes ne ressemblent plus au signal d'origine.

plot(D{1})
xlim([0 100])
title('Detail Coefficients')
xlabel('Index')
ylabel('Amplitude')

Figure contains an axes object. The axes object with title Detail Coefficients, xlabel Index, ylabel Amplitude contains an object of type line.

Les coefficients d'approximation, A, de la transformée précédente constituent la composante polyphasée paire du signal. Les coefficients sont donc affectés par l'aliasing. Utilisez une étape de mise à jour du lifting pour réactualiser les coefficients d'approximation et réduire l'aliasing. L'étape de mise à jour remplace les coefficients d'approximation par x(2n)+1/2(x(2n+1)-x(2n)), qui est égal à la moyenne de x(2n) et x(2n+1). La moyenne est un filtrage passe-bas, qui aide à réduire l'aliasing.

ElemLiftStep = liftingStep('Type','update','Coefficients',1/2,'MaxOrder',0);
LSnew = addlift(LSnew,ElemLiftStep);

Utilisez le nouveau schéma de lifting pour obtenir la transformée en ondelettes du signal d'entrée. Les coefficients d'approximation ressemblent à une version lissée du signal original.

[A,D] = lwt(x,'liftingScheme',LSnew,'Level',1);
plot(A)
xlim([0 100])

Figure contains an axes object. The axes object contains an object of type line.

Créez un nouveau schéma de lifting avec les mêmes étapes de lifting que LSnew. Appliquez des facteurs d'échelle pour garantir une reconstruction parfaite. Obtenez les coefficients d'approximation et d'ondelette en utilisant le schéma de lifting et reconstruisez le signal en utilisant ilwt. Vérifiez la parfaite reconstruction.

scaleFactors = [sqrt(2) sqrt(2)/2];
ElemLiftStep1 = liftingStep('Type','predict','Coefficients',-1,'MaxOrder',0);
ElemLiftStep2 = liftingStep('Type','update','Coefficients',1/2,'MaxOrder',0);
LSscale = liftingScheme('LiftingSteps',[ElemLiftStep1;ElemLiftStep2], ...
    'NormalizationFactors',scaleFactors);
[A,D] = lwt(x,'liftingScheme',LSscale,'Level',1);
xrecon = ilwt(A,D,'liftingScheme',LSscale);
max(abs(x(:)-xrecon(:)))
ans = 1.7764e-15

L'exemple précédent a conçu une ondelette, qui a effectivement supprimé un polynôme d'ordre zéro (constante). Si le comportement du signal est mieux représenté par un polynôme d'ordre supérieur, vous pouvez concevoir une ondelette double avec le nombre approprié de moments de fuite pour décorréler le signal.

Utilisez le schéma de lifting pour concevoir une ondelette avec deux moments de fuite. Une ondelette double à deux moments de fuite décorrèle un signal dont le comportement local est approximé par un polynôme du premier ordre. Créez un signal caractérisé par un comportement polynomial du premier ordre avec un bruit additif N(0,0.252).

y = [1 0 0 4 0 0 -1 0 0 2 0 0 7 0 0 -4 0 0 1 0 0 -3];
x1 = 1:(21/1024):22-(21/1024);
y1 = interp1(1:22,y,x1,'linear');
rng default
y1 = y1+0.25*randn(size(y1));
plot(x1,y1)
xlim([1 22])

Figure contains an axes object. The axes object contains an object of type line.

Le cas échéant, les coefficients d'ondelettes devraient supprimer un polynôme du premier ordre. Si la valeur du signal à un indice impair, x(2n+1), est bien approximée par un polynôme du premier ordre ajusté aux valeurs de l'échantillon environnant, alors 1/2(x(2n)+x(2n+2)) devrait fournir un bon ajustement pour x(2n+1). En d'autres termes, x(2n+1) devrait être le point médian entre x(2n) et x(2n+2).

Il s'ensuit que x(2n+1)-1/2(x(2n)+x(2n+2)) devrait décorréler le signal.

Créez un nouveau schéma de lifting avec une étape de lifting de prédiction qui modélise l'équation précédente.

ElemLiftStep = liftingStep('Type','predict','Coefficients',[-1/2 -1/2],'MaxOrder',1);
LS = liftingScheme('LiftingSteps',ElemLiftStep,'NormalizationFactors',1);

Utilisez le schéma de lifting pour obtenir les coefficients d'approximation et de détails et tracez le résultat.

[A,D] = lwt(y1,'LiftingScheme',LS,'Level',1);
subplot(2,1,1)
plot(A)
xlim([1 512])
title('Approximation Coefficients')
subplot(2,1,2)
plot(D{1})
xlim([1 512])
title('Detail Coefficients')

Figure contains 2 axes objects. Axes object 1 with title Approximation Coefficients contains an object of type line. Axes object 2 with title Detail Coefficients contains an object of type line.

Vous voyez que les coefficients d'ondelettes semblent ne contenir que du bruit, tandis que les coefficients d'approximation représentent une version débruitée du signal original. La transformée précédente utilisant uniquement la composante polyphasée paire pour les coefficients d'approximation, vous pouvez réduire l'aliasing en ajoutant une étape de mise à jour.

Créez un nouveau schéma de lifting qui consiste en l'étape de prédiction précédente et une nouvelle étape de mise à jour qui réduit l'aliasing. Normalisez le schéma de lifting pour produire un banc de filtres de reconstruction parfait. Obtenez la transformée en ondelettes discrète avec le nouveau schéma de lifting et tracez les résultats.

scaleFactors = [sqrt(2) sqrt(2)/2];
ElemLiftStep1 = liftingStep('Type','predict','Coefficients',[-1/2 -1/2],'MaxOrder',1);
ElemLiftStep2 = liftingStep('Type','update','Coefficients',[1/4 1/4],'MaxOrder',0);
LSnew = liftingScheme('LiftingSteps',[ElemLiftStep1;ElemLiftStep2], ...
    'NormalizationFactors',scaleFactors);
[A,D] = lwt(y1,'liftingScheme',LSnew,'Level',1);
subplot(2,1,1)
plot(A)
xlim([1 512])
title('Approximation Coefficients')
subplot(2,1,2)
plot(D{1})
xlim([1 512])
title('Detail Coefficients')

Figure contains 2 axes objects. Axes object 1 with title Approximation Coefficients contains an object of type line. Axes object 2 with title Detail Coefficients contains an object of type line.

Démontrez que vous avez conçu un banc de filtres de reconstruction parfait.

y2 = ilwt(A,D,'liftingScheme',LSnew);
max(abs(y2(:)-y1(:)))
ans = 1.7764e-15

Voir aussi

|

Sujets associés