3

我需要创建一个包含高斯小波函数的傅立叶系数的对角矩阵,但我不确定该怎么做。

目前我正在使用这个函数来生成 Haar 小波矩阵

http://www.mathworks.co.uk/matlabcentral/fileexchange/33625-haar-wavelet-transformation-matrix-implementation/content/ConstructHaarWaveletTransformationMatrix.m

并将二元尺度 (2,4,8,16) 的行作为变换:

M= 256
H = ConstructHaarWaveletTransformationMatrix(M);
fi = conj(dftmtx(M))/M;
H = fi*H;
H = H(4,:);
H = diag(H);

ETC

我如何对高斯小波重复这个?是否有内置的 Matlab 函数可以为我执行此操作?

作为参考,我正在实现本文第 4 节中的算法:

http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=04218361

4

1 回答 1

2

我可能不会回答这个问题,但我会尽力帮助你进步。

据我所知,Matlab Wavelet Toolbox 仅处理小波操作和系数、增加或减少分辨率级别以及类似操作,但不公开用于从信号和系数进行转换的内部矩阵。

因此,我担心这个问题的答案是否定的。前段时间,我为一些 Hart 类小波做了这个,我实际上是从头开始构建矩阵,然后我比较了使用内置 Matlab 小波工具箱获得的系数,从而确保你的矩阵足够好算法。就我而言,时变模型的递归参数估计。

对于函数ConstructHaarWaveletTransformationMatrix,创建矩阵非常简单,因为 Hart 类可以非常简单地表示为 Kronecker 乘积。我担心的高斯小波案例也应该从头开始......

我建议的步骤是;

  1. 尽管 MATLAB 没有明确包含矩阵,但您可以使用 Matlab 内置函数来恢复高斯小波,从而为您的算法组成矩阵。

  2. 使用每个高斯小波构建矩阵的每一列,用于您需要的每个分辨率级别(二元尺度)。使用 Matlab Wavelets 工具箱恢复形状。

  3. 在此之后,将您获得的系数与工具箱的系数进行比较。这样,您将更正 Matrix 行的顺序。

在数值上,fj是分辨率级别jVjPHI信号空间,缩放函数)上的信号投影,而gj是分辨率级别j上WjPSI信号空间,母函数)上的信号投影,我们可以写:

f=fj0+sum_{j0}^{j1-1}{gj}

因此,fj0gj都会导出两个矩阵,我们称它们为PHIjPSIj矩阵:

f=PHIj0*cj0+sum_{j0}^{j1-1}{PSIj*dj}

PHIj列包含近似投影(Vj0空间)的缩放和移位缩放小波信号(一个,仅用于 j0),PSIj包含缩放和移位母小波信号(几个,从j0j1-1)用于细节投影(到Wj0Wj1-1空间)。

因此,您需要的矩阵是:

PHI=[PHIj0 PSIj0...PSIj1]

因此,您可以将原始信号表示为:

f=PHI*C

其中C是近似系数和细节系数的向量,用于以下级别:

C=[cj0' dj0'...dj1']'

第一部分,用于解决 PHI 构建可以通过编写来实现:

function PHI=MakePhi(l,str,Jmin,Jmax)
% [PHI]=MakePhi(l,str,Jmin,Jmax)
% 
% Build full PHI Wavelet Matrix for obtaining wavelet coefficients 
% (extract)
%FILTER
[LO_R,HI_R] = wfilters(str,'r');
lf=length(LO_R);

%PHI BUILD
PHI=[];
laux=l([end-Jmax end-Jmax:end]);
PHI=[PHI MakeWMatrix('a',str,laux)];

for j=Jmax:-1:Jmin 
   laux=l([end-j end-j:end]);
   PHI=[PHI MakeWMatrix('d',str,laux)];
end

wfilters 是一个 MATLAB 内置函数,为近似和/或细节小波信号提供所需的信号。

MakeWMatrix 函数是:

function M=MakeWMatrix(typestr,str,laux)
% M=MakeWMatrix(typestr,str,laux)
% 
% Build Wavelet Matrix for obtaining wavelet coefficients 
% for a single level vector.
% (extract)
[LO_R,HI_R] = wfilters(str,'r');
if typestr=='a'
   F_R=LO_R';
else
   F_R=HI_R';
end

la=length(laux);
lin=laux(2); lout=laux(3);
M=MakeCMatrix(F_R,lin,lout);

for i=3:la-1
   lin=laux(i); lout=laux(i+1);
   Mi=MakeCMatrix(LO_R',lin,lout);
   M=Mi*M;
end

最后 MakeCMatrix 是:

function [M]=MakeCMatrix(F_R,lin,lout)
% Convolucion Matrix 
% (extract)
lf=length(F_R);

M=[];
for i=1:lin
    M(:,i)=[zeros(2*(i-1),1) ;F_R ;zeros(2*(lin-i),1)];   
end

M=[zeros(1,lin); M ;zeros(1,lin)];

[ltot,lin]=size(M);

lmin=floor((ltot-lout)/2)+1;
lmax=floor((ltot-lout)/2)+lout;

M=M(lmin:lmax,:);

最后一个矩阵应该包括一些插值程序,以便在每种情况下获得更好的一般结果。

我希望这可以解决您的部分问题......

炒作

于 2013-10-06T01:27:32.933 回答