在二元尺度上创建高斯小波矩阵

时间:2013-08-27 09:33:07

标签: matlab matrix

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

目前我正在使用此功能生成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);

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

作为参考,我在本文第4部分实现了算法:

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

1 个答案:

答案 0 :(得分:2)

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

据我所知,Matlab小波工具箱只处理小波运算和系数,增加或减少分辨率等级,以及类似的操作,但不公开用于从信号和系数进行变换的内部矩阵。

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

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

我建议的步骤是;

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

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

  3. 然后,将您获得的系数与工具箱的系数进行比较。这样您就可以更正Matrix行的顺序。

  4. 数值上, fj Vj 上的信号投影( PHI 信号空间,缩放功能)在分辨率级别 j < / strong>, gj Wj 上的信号投影( PSI 信号空间,母函数)在分辨率级别 j ,我们可以写:

      

    <强> F = fj0 + sum_ {J0} ^ {J1-1} {GJ}

    因此, fj0 gj 都会产生两个矩阵,我们称之为 PHIj PSIj 矩阵:

      

    <强> F = PHIj0 * CJ0 + sum_ {J0} ^ {J1-1} {PSIJ * DJ}

    PHIj 列包含近似投影的缩放和移位缩放小波信号(仅适用于j0)( Vj0 空间), PSIj 列包含缩放和移位的母小波信号(几个,从 j0 j1-1 )用于细节投影(在 Wj0 Wj1-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,:);
    

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

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

    Hyp的