我正在寻找一个离散小波变换(DWT)的C ++库,它也可以返回 变换的NxN DWT矩阵。 这里有一个类似的问题
Looking for a good C/C++ wavelet library for signal processing
但我正在寻找更具体的内容,你可以看到。
如果库有一些非GNU许可证允许我在专有软件(LGPL,MPL,BSD等)中使用它会更有帮助
提前致谢
答案 0 :(得分:1)
永远不计算此矩阵的原因是使用它计算DWT效率非常低。 FWT方法要快得多。
对于长度为16和3级haar变换的信号,我在matlab中发现了这个矩阵
>> h=[1 1];
>> g=[1 -1];
>> m1=[[ones(1,8) zeros(1,8); ...
zeros(1,8) ones(1,8); ...
1 1 1 1 -1 -1 -1 -1 zeros(1,8); ...
zeros(1,8) 1 1 1 1 -1 -1 -1 -1]/sqrt(8); ...
[1 1 -1 -1 zeros(1,12); ...
zeros(1,4) 1 1 -1 -1 zeros(1,8); ...
zeros(1,8) 1 1 -1 -1 zeros(1,4); ...
zeros(1,12) 1 1 -1 -1]/sqrt(4); ...
[g zeros(1,14); ...
zeros(1,2) g zeros(1,12); ...
zeros(1,4) g zeros(1,10); ...
zeros(1,6) g zeros(1,8); ...
zeros(1,8) g zeros(1,6); ...
zeros(1,10) g zeros(1,4); ...
zeros(1,12) g zeros(1,2); ...
zeros(1,14) g]/sqrt(2)]
m1 =
A A A A A A A A 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 A A A A A A A A
A A A A -A -A -A -A 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 A A A A -A -A -A -A
B B -B -B 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 B B -B -B 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 B B -B -B 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 B B -B -B
C -C 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 C -C 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 C -C 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 C -C 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 C -C 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 C -C 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 C -C 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 C -C
其中A=1/sqrt(8)
,B=1/sqrt(4)
和C=1/sqrt(2)
。
对应于FWT。这将向您展示如何从过滤器构建矩阵。你从矩阵的下半部分开始 - 一个零的矩阵,将过滤器g
每行放两步。然后将滤波器放宽两倍并重复,现在一次仅移动4个步骤。重复此操作,直到达到最高级别的分解,最后将近似滤波器置于相同的宽度(此处为8)。
就像检查一样
>> signal=1:16; % ramp
>> [h g]=daubcqf(2); % Haar coefficients from the Rice wavelet toolbox
>> fwt(h,signal,3) % fwt code by Jeffrey Kantor
>> m1*signal' % should produce the same vector
希望能帮助您用C ++编写它。这并不困难(有点簿记),但正如所说,没有人使用它,因为有效的算法不需要它。