小波分解函数和重构函数的应用和区别
今天把有关一维小波基本函数整理了一下,也不知道在理解上是否有偏差。
小波分析基本函数可分为分解和重构两类,下面以一维小波分析为例说明小波函数的应用和相关函数的区别。
1、 一维小波分解函数和系数提取函数
对常用的dwt、wavedec、appcoef函数的常用格式进行举例说明。
格式: [ca, cd]=dwt(X,’wname’) %单尺度一维离散小波分解
[C, L]=wavedec(X,N,’wname’) %多尺度一维小波分解(多分辨分析函数)
ca=appcoef(C,L,’wname’,N) %提取一维小波变换低频系数
说明:
(1)小波分解函数和系数提取函数的结果都是分解系数;
(2)如何理解小波系数:小波系数是信号在做小波分解时所选择的小波函数空间的投影。
我们知道,一个信号可以分解为傅里叶级数,即一组三角函数之和,而傅里叶变换对应于傅里叶级数的系数;同样,一个信号可以表示为一组小波基函数之和,小波变换系数就对应于这组小波基函数的系数。
(3)多尺度分解是按照多分辨分析理论,分解尺度越大,分解系数的长度越小(是上一个尺度的二分之一)。我们会发现分解得到的小波低频系数的变化规律和原始信号相似,但要注意低频系数的数值和长度与原始信号以及后面重构得到的各层信号是不一样的。
举例:(为直观,把运行结果放在相应程序段后面)
%载入原始信号
load leleccum;
s=leleccum(1:3920);
ls=length(s);
%单尺度一维离散小波分解函数dwt的应用
[ca1,cd1]=dwt(s,'db1'); %用小波函数db1对信号s进行单尺度分解
figure(1);
subplot(411); plot(s); ylabel('s');
title('原始信号s及单尺度分解的低频系数ca1和高频系数cd1');
subplot(423); plot(ca1); ylabel('ca1');
subplot(424); plot(cd1); ylabel('cd1');
(注意: figure(1)中的ca1和cd1的长度都是1960,是原始信号s长度3920的一半。)
%多尺度一维小波分解函数wavedec的应用
[C,L]=wavedec(s,3,'db1'); %用小波函数db1对信号s进行3尺度分解
figure(2);
subplot(411); plot(s); title('原始信号'); ylabel('s');
subplot(412); plot(C);
title('信号s的3尺度分解结构:尺度3的低频系数和尺度3、2、1的高频系数');
(注意:wavedec所做的多尺度小波分解后的系数C的存储方式是按[caj, cdj,cdj-1,…,cd1]方式存放的,各层系数的长度在数组L中标示。 figure(2)中第二行将系数C显示出来,1~490段是尺度3的低频系数ca3(长度490), 491~980段是尺度3的高频系数cd3(长度是490),981~1960段是尺度2的高频系数cd2(长度是980),1961~3920段是尺度1的高频系数cd1(长度是1960)。 运行后最好观察一下数组变量C和L的值。)
%提取一维小波变换低频系数函数appcoef的应用
ca1=appcoef(C,L,'db1',1); %从前面小波3尺度分解结构[C,L]中提取尺度1的低频系数
ca2=appcoef(C,L,'db1',2); %从前面小波3尺度分解结构[C,L]中提取尺度2的低频系数
ca3=appcoef(C,L,'db1',3); %从前面小波3尺度分解结构[C,L]中提取尺度3的低频系数
figure(3);
subplot(411); plot(s); title('原始信号'); ylabel('s');
subplot(412); plot(ca1);
title('从小波3尺度分解结构[C,L]中提取尺度1、2、3的低频系数');
ylabel('ca1');
subplot(413); plot(ca2); ylabel('ca2');
subplot(414); plot(ca3); ylabel('ca3');
(注意: figure(3)中随尺度增加,低频系数长度减半,可见各层低频系数的变化规律和原始信号类似,这正好说明低频系数反映了信号的轮廓或基本信息。注意观察各层系数值和原始信号值是有很大差距的。)
2、 一维小波重构函数
对常用的idwt、waverec、wrcoef函数进行举例说明。
格式: X=idwt(ca,cd,’wmane’) %单尺度一维小波逆变换
X=waverec(C,L,’wname’) %多尺度一维小波重构
X=wrcoef(‘type’,C,L,’wname’,N) %对一维小波系数进行单支重构
说明:
(1) 小波重构函数的结果都是信号;
(2) 不管是用哪个重构函数对系数进行重构后,结果的长度和原始信号的长度是相同的;如果重构的是低频部分,那么观察得到的结果X,其数值大小和原始信号是差不多的。
举例:(在上面程序的基础上继续)
%单尺度一维小波逆变换函数idwt的应用
si1=idwt(ca1,cd1,'db1'); %基于系数[ca1,cd1],用idwt函数进行信号重构
erros1=s-si1; %求原始信号和重构信号si1的误差
figure(4);
subplot(411); plot(s); title('原始信号'); ylabel('s');
subplot(412); plot(si1); title('用idwt函数重构信号'); ylabel('si1');
subplot(413); plot(erros1); title('小波重构误差'); ylabel('erros1');
(注意:figure(4)中重构信号和原始信号的长度是一样的,数值大小也基本一样,误差数量级非常低。)
% 单尺度一维小波重构函数waverec的应用
si2=waverec(C,L,'db1'); %基于 [C,L],用waverec函数进行信号重构
erros2=s-si2; %求原始信号和重构信号si2的误差
figure(5);
subplot(411); plot(s); title('原始信号'); ylabel('s');
subplot(412); plot(si2); title('用waverec函数重构信号'); ylabel('si2');
subplot(413); plot(erros2); title('小波重构误差'); ylabel('erros2');
(注意: figure(5)中重构信号和原始信号的长度也是一样的,数值大小也基本一样,误差数量级非常低。)
%对一维小波系数进行单支重构函数wrcoef的应用
a3=wrcoef('a',C,L,'db1',3); %基于[C,L],用wrcoef函数重构第3层低频信号
a2=wrcoef('a',C,L,'db1',2); %基于[C,L],用wrcoef函数重构第2层低频信号
a1=wrcoef('a',C,L,'db1',1); %基于[C,L],用wrcoef函数重构第1层低频信号
d1=wrcoef('d',C,L,'db1',1); %基于[C,L],用wrcoef函数重构第1层高频信号
si3=a1+d1; %将第1层低、高频重构信号叠加重构原始信号
maxe=max(abs(s-si3))
erros3=s-si3; %求原始信号和重构信号si3的误差
figure(6);
subplot(711); plot(s); title('原始信号'); ylabel('s');
subplot(712); plot(a3); title('用wrcoef函数重构的第3层低频信号'); ylabel('a3');
subplot(713); plot(a2); title('用wrcoef函数重构的第2层低频信号'); ylabel('a2');
subplot(714); plot(a1); title('用wrcoef函数重构的第1层低频信号'); ylabel('a1');
subplot(715); plot(d1); title('用wrcoef函数重构的第1层高频信号'); ylabel('d1');
subplot(716); plot(si3); title('a1+d1重构的原始信号'); ylabel('a1+d1');
subplot(717); plot(erros3); title('小波重构误差'); ylabel('erros3');
(注意: figure(6)中各层低频重构信号a1,a2,a3和原始信号的长度也是一样的,数值大小也基本一样,误差数量级非常低。这个图中,第1层的高、低频信号之和a1+d1即重构了原始信号,从这里我们可以很直观的理解重构信号的含义。虽然低频重构信号和低频系数的变化规律差不多,从这里例子就可看出重构得到的信号和前面小波分解得到的系数是很不一样的。)