|
Autor |
Diskrete Wavelet Transformation |
|
MatLab
Neu  Dabei seit: 08.02.2022 Mitteilungen: 1
 | Themenstart: 2022-02-08
|
Hallo Leute!
Ich versuche mich an der diskreten Wavelet-Transformation zur Hintergrund-Korrektur.
Dazu habe ich dieses Paper hier gefunden:
Yaogai Hu et al., A background elimination method based on wavelet transform for Raman spectra, Chemometrics and intelligent laboratory systems, 2006
Ich fasse mal kurz die Theorie zusammen:
Gegeben sei ein zeitdiskretes Signal \(x(t)\) mit \(N\) Datenpunkten. Die Wavelet-Funktion \(\psi\) und seine binären Dilatationen sind
\[\psi_{j,k}(t)=2^{-j/2}\psi(2^{-j}t-k)\]
mit \(j=1,2,\dots,J\) und \(k=1,2,\dots,N/2\) und \(J,k\in\mathbb{Z}\). Das Signal ist die Summe aller Details
\[x(t)=\sum\limits_j D_j(t)\]
wobei
\[D_j(t)=\sum\limits_k C(j,k)\psi_{j,k}(t)\]
\[C(j,k)=\int\limits_{-\infty}^\infty x(t)\psi_{j,k}(t)~dt\]
Der Knackpunkt an dem ganzen ist, dass der Hintergrund meist nur die niedrigen Frequenzen enthält und das Signal die höheren. Je höher der Wert für \(j\) desto niedriger die Frequenz des Details. Der Hintergrund \(BG(t)\) lässt sich also (für ein geeignetes \(\varepsilon\)). approximieren durch
\[BG(t)=\sum\limits_{j>\varepsilon} D_j(t)\]
Hier mein Skript
\sourceon MATLAB
% Signal & background
t=linspace(500,600,1000);
Spc=5*gaussian(t,mean(t),5);
BG=cos(2*pi*1/100*t);
x=Spc+BG;
% Wavelets (Harr & Shannon)
H=@(t) 1.*((t>=0) & (t<1/2))-1.*((t>=1/2) & (t<1))+0.*((t<0) & (t>=1));
S=@(t) 2*sinc(2*t)-sinc(t);
% Wavelet transform & reconstruction
MW=H; % select H for Haar and S for Shannon
J=10; % # of levels for signal approximation
MM=cell(1,J);
FF=cell(1,J);
C=cell(1,J);
D=cell(1,J);
MP=zeros(length(t)/2,length(t));
FP=zeros(length(t)/2,length(t));
for j=1:J
for k=1:length(t)/2
MP(k,:)=2^(-(j/2))*MW(2^(-j)*t-k);
end
MM{1,j}=MP;
C{1,j}=mean(diff(t))*trapz(x.*MM{1,j},2);
D{1,j}=sum(C{1,j}.*MM{1,j});
end
DD=cell2mat(D.');
X=sum(DD);
l=6; % # last l Details to approximate the Background
B=sum(DD(J-l:J,:));
% Visualization
figure
subplot(2,2,[1 2])
plot(t,MW(t-mean(t)),'LineWidth',1)
xlabel('Time')
ylabel('Intensity [a.u.]')
set(gca,'FontSize',12)
subplot(2,2,[3 4])
plot(t,DD,'LineWidth',1)
xlabel('Time')
ylabel('Intensity [a.u.]')
set(gca,'FontSize',12)
figure
subplot(2,2,[1 2])
plot(t,x,'LineWidth',1)
hold on
plot(t,X,'LineWidth',1)
xlabel('Time')
ylabel('Intensity [a.u.]')
set(gca,'FontSize',12)
subplot(2,2,[3 4])
plot(t,BG,'LineWidth',1)
hold on
plot(t,B,'k--','LineWidth',1)
xlabel('Time')
ylabel('Intensity [a.u.]')
set(gca,'FontSize',12)
\sourceoff
Hier gibt es noch einiges was ich nicht verstehe. Mein Ergebnis hängt sehr davon ab welches Intervall (Start und Endpunkt) ich für meinen Zeitvektor \(t\) wähle. Woher kommt das? Für ein Signal von \(0\) bis \(100\) sehe ich zum Beispiel Randeffekte.
Mit den Matlab-Funktionen 'wavedec' und 'waverec' bekommt man ein viel besseres Resulat. Ich möchte es aber unbedingt selbst schreiben damit ich es besser verstehe. Kann sich jemand mein Skript anschauen?
Vielen lieben Dank
|
Profil
|
|
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen. Lesen Sie die
Nutzungsbedingungen,
die Distanzierung,
die Datenschutzerklärung und das Impressum.
[Seitenanfang]
|