我需要创建一个包含高斯小波函数的傅里叶系数的对角矩阵,但我不确定该怎么做。
目前我正在使用此功能生成Haar小波矩阵
并以二元标度(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
答案 0 :(得分:2)
我可能不会回答这个问题,但我会尽力帮助你前进。
据我所知,Matlab小波工具箱只处理小波运算和系数,增加或减少分辨率等级,以及类似的操作,但不公开用于从信号和系数进行变换的内部矩阵。
因此我担心这个问题的答案是否定的。前段时间,我为一些Hart类小波做了这个,我实际上是从头开始构建矩阵,然后我用内置Matlab小波工具箱比较得到的系数,从而确保你的矩阵对你来说足够好算法。在我的例子中,时变模型的递归参数估计。
对于函数 ConstructHaarWaveletTransformationMatrix ,创建矩阵非常简单,因为Hart类可以非常简单地表示为Kronecker产品。 我担心的高斯小波情况也应该从头开始......
我建议的步骤是;
虽然MATLAB没有明确地包含矩阵,但您可以使用Matlab内置函数来恢复高斯小波,从而为您的算法组成矩阵。
使用每个高斯小波构建矩阵的每一列,对于您需要的每个分辨率级别(二元尺度)。使用Matlab Wavelets工具箱恢复形状。
然后,将您获得的系数与工具箱的系数进行比较。这样您就可以更正Matrix行的顺序。
数值上, 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的