在Matlab的小波工具箱中,可以设置9种数据边界的控制模式。除per
(periodization)之外的模式,其做256点数据的8级分解的结果的数据量,可能比256大几倍。居士早年的处理,结果始终是256点,如果要扔掉旧程序、转入Matlab小波工具箱,那么应对模式per最感兴趣,因为在Matlab中其变换结果数据量最小,所以可能最易兼容。此外,Matlab也声明:其1维、2维平稳小波变换(swt),也是用per模式定义的。
对滤波器序列,以偶数为周期做周期化,然后用其偶数平移系分解单位矩阵的测试,可以给类似于per模式中的各级分解与合成,提供条件。而且,在小波包树上,不同块上使用的滤波器序列、周期长度可以完全独立,可以有多种混合。
如果,不强求相间隔的尺度上的二进栅格采样的关系,在每个尺度上都只求周期为偶数,那么至多只需要补充一个点就可以把数据长度变为偶数。当然,在逆变换时,要相应地除去延拓部分,这是技巧,而不是分解单位矩阵的问题。延拓量被最小化,就使变换结果的数据最少了。
如果,原始数据的长度,能被2的L(正整数)次幂整除,那么做L级周期化分解的小波包树上的任一组基上的系数数目都是相同的、最小的。这应该是,离散小波变换、小波包的某种正典;其形式工整美观;背后的思想观念清晰;操作利索;在有限长数据的处理中,也简便实用,因为,地球上最著名的、应用最广的变换技术,FFT,常用的数据长度就是2的正整数次幂。其方便,还例如,可以用列举、归纳来论述实际的应用问题。
居士在讨论小波(包)的离散变换时,坚持使用了单位矩阵分解、有限维矢量空间的多分辨分析、有限维基向量、有限维小波包等概念,以强调一种理论观念和角度,而不仅限于实践技巧。Matlab使用的是普通滤波器的观点,per模式作为一种实用技巧,对付的是被处理数据,但是,这不必造成问题。不过,居士好奇的是,其per模式未被列入帮助文档(dwtmode)的表格中,而且,紧随表格的几行文字里“略有冗余的(slightly
redundant,指某些非per模式)”、两个“But”和“whatever”以及“must
be”对于“完美的重建(perfect
reconstruction)”的说明,使per模式与其它模式形成对比,也很容易让人担心per模式不良。
有趣的是,《维基百科》(en.wikipedia.org)中“Daubechies
wavelet”的“Implementation”部分,也把某种Periodization与其它模式(被称为高级(尖端,sophisticated)的方法)“相对”而论,而且强调只影响“very
ends”。但是,居士对整个滤波器系统的周期化的测试,并不管支集影响有多远;在256点数据的8级分解中,最后一个近似系数,实际上,涉及到了所有的256个数据点。
在Matlab中,做些测试,是应该的!
Matlab系统默认的模式是sym,它在表格中排在第一位。此外,系统有函数计算“合理的最大”分解深度。在命令窗中,运行
wmaxlev(256,'db33'), wmaxlev(64,'db20'),
得到的最大分解深度为1、0,即是说:只该分解一级、或干脆就不能做小波变换。分解深度越小,由滤波器系数本身的近似性和计算中的数字截断所引入的误差(不是理论上的重建问题!),一般应该更小。所以,测试时,用sym模式、系统计算的合理分解深度,作为比较标准。
本文后的图片所示(右边)的结果,用单位能量的正态分布的随机序列(左边),比较了Matlab的小波变换中的3种模式、它的65组滤波器(依次为Daubechies
1至Daubechies 45、 Coiflets 1至Coiflets
5、15组双正交)。模式sym、zpd、per的误差(未做任何变换域数据修正)结果,几乎完全重合,而且,也与居士在Scilab中周期化滤波器系统以分解单位矩阵的结果一致。用模式zpd、per时,分解深度都被强行设置为8;然而,用sym模式时的平均分解深度,仅约为3,不到8的一半,可以说sym模式很占便宜。
下面是居士写的计算图片中结果的Matlab程序temp8x.m:
function [Test8x]=temp8x
%test Matlab-Wavelet-Toolbox: dwtmode and its
Filters
%in Matlab-R2011a. 2013-August.
% tic;[Test8x]=temp8x;toc,
%------prepare
close all force;
biof1=['1.1'; '1.3'; '1.5'; '2.2'; '2.4'; '2.6';
'2.8';...
'3.1'; '3.3'; '3.5'; '3.7'; '3.9'; '4.4'; '5.5'; '6.8'];
dwtmod1=['sym';'zpd';'per']; %3 modes
rng(1.0e9); x=randn(1,256); x=x/norm(x(:)); %test data
ModeSymLevel=0;
Test8x=zeros(65,3);
%------compute
for
i1=1:65; % 65
filters
if
(i1>0)&&(i1<46)
FilterNam1=['db'
int2str(i1)]; %
Daubechies
elseif
(i1>45)&&(i1<51)
FilterNam1=['coif' int2str(i1-45)]; %Coiflets
elseif
(i1>50)&&(i1<66)
FilterNam1=['bior' biof1(i1-50,:)];
%Biorthogonal
else
error('Undefined Filter.'); %unknown
end
for
j1=1:3; %3
mode error, from dwt and idwt
if j1==1
dl0=wmaxlev(length(x),FilterNam1);%level,only for Mode sym
ModeSymLevel=ModeSymLevel+dl0; %memorize the levels
else
dl0=8;
end
dwtmode(dwtmod1(j1,:)); %set mode
[xc1,xl1]=wavedec(x,dl0,FilterNam1);
%transform
xr1=waverec(xc1,xl1,FilterNam1); %inverse
Test8x(i1,j1)=norm(xr1-x); %norm of error
end
end
%------display
ModeSymLevel=ModeSymLevel/length(Test8x(:,1)), %'sym' average level
subplot(1,2,1); plot(x); axis tight; %display raw data
title('The Normalized randn(1,256) for
wavedec');
subplot(1,2,2); %display the result
semilogy(Test8x(:,1),'-g'); hold
on;
semilogy(Test8x(:,2),'ob'); semilogy(Test8x(:,3),'+r'); hold off;
grid on; axis tight; legend(dwtmod1,'Location','NorthWest');
title('temp8x.m: Matlab dwt Modes and Its
Filters');
xlabel('db1-db45,coif1-coif5,15 Biorthogonal
Filters');
ylabel('Reconstruction-Error Norm');
end
新浪赛特居士SciteJushi-2013-08-25。
程序生成结果的图片