小波的分解和重构在很多领域都有运用。

第一: matlab中相关小波函数

   1、 wavedec:  Multilevel 1-D wavelet decomposition    小波分解

                  [C,L] = wavedec(X,N,'wname')    
                  [C,L] = wavedec(X,N,Lo_D,Hi_D)   

  • Lo_D, the decomposition low-pass filter

  • Hi_D, the decomposition high-pass filter

  • X is signal,N is layer,C 是小波系数 ,L是小波.  

 

     2、 detcoef:  Multilevel 1-D wavelet detail  coefficients    小波细节系数,目的是获取上图种的cDx

                  D = detcoef(C,L,N)
                  D = detcoef(C,L)

     3、appcoef :1-D approximation coefficients     小波近似系数, 目的是获取cA

                  A = appcoef(C,L,'wname',N)
                  A = appcoef(C,L,'wname')
                  A = appcoef(C,L,Lo_R,Hi_R)
                  A = appcoef(C,L,Lo_R,Hi_R,N)

   4、 waverec :   Multilevel 1-D wavelet reconstruction  小波重构

                   X = waverec(C,L,Lo_R,Hi_R)
                    X = waverec(C,L,'wname')
                    X = appcoef(C,L,'wname',0)

第二: 案例

           用小波分解重构函数后,用MSE 来进行比较分析 

          eg1:  小波信号分解到a1 ,和b1 然后重构信号。

 

               eg2: 小波分解到第三层重构信号

 eg3: 小波分解到第三层,但是通过第二层的a2,d2,d1,最后重构部分要加上length(ecg)

 eg4: idwt 重构函数:

 完整代码:

clc,clear all;close all;
fs=180;
N=2000;
t=(1:N-1)/fs;
s=1.2*sin(2*pi*t*20)+0.5*cos(2*pi*t*60);%%% 滤掉60Hz的信号
% level=8; wavename='bior2.6';
figure;
subplot(211); plot(t,s); title('原始信号') ;  grid on
[f, spectrum ] = gan_fft(s,fs,N);
subplot(212);plot(f,spectrum); title('原始信号pinpu');   grid on
[C,L]=wavedec(s,2,'db6');
X = waverec(C,L,'db6');

figure;
subplot(211);plot(t,X); title('原始信号分解后又重构的信号') ; grid on
[f, spectrum ] = gan_fft(X,fs,N);
subplot(212);plot(f,spectrum); title('原始信号分解后又重构pinpu');  grid on
%%%% 均方误差
MSE=sum((X-s).^2)/length(s);
function [f, spectrum ] = gan_fft(s,Fs,L)
%GAN_FFT 此处显示有关此函数的摘要
%   此处显示详细说明
y=fft(s);
p2=abs(y/L);
p1=p2(1:L/2+1);
p1(2:end-1)=2*p1(2:end-1);
f = Fs*(0:(L/2))/L;
spectrum=p1;
 
end
 

例子2:

clc,clear all;close all;
fs=180;
N=2000;
t=(1:N-1)/fs;
s=1.2*sin(2*pi*t*20)+0.5*cos(2*pi*t*60);%%% 滤掉60Hz的信号
% level=8; wavename='bior2.6';
figure;
subplot(211); plot(t,s); title('原始信号') ;  grid on
[f, spectrum ] = gan_fft(s,fs,N);
subplot(212);plot(f,spectrum); title('原始信号pinpu');   grid on
[C,L]=wavedec(s,3,'db6');
X = waverec(C,L,'db6');
[A1]=appcoef(C,L,'db6',1);
[A2]=appcoef(C,L,'db6',2);
[A3]=appcoef(C,L,'db6',3);
[D1,D2,D3]=detcoef(C,L,[1 2 3]);
C1=[A3,D3,D2,D1];%%% z注意此处是逗号还是分号
%[length(A3);length(D3);length(D2);length(D1);length(s)]
x2=waverec(C1,L,'db6');
MSE=sum((x2-s).^2)/length(s)

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐