我正在尝试实现一篇论文 1 中的一些水印算法。这是本文的一部分:
为所有重新编号的段执行H级DWT。
然后在模拟部分,作者解释了用于实验的小波。
DWT变换采用普通小波“Daubechies-1”和等级H = 3。
我只是不知道H的含义,我如何在matlab DWT函数中输入H = 3?
我的实际代码是:
[cA,cD] = dwt(audio,'db3');
有人可以帮助我吗?
1 Ji,Y。& Kim,J。基于DWT-DCT的量化音频水印算法。多媒体,计算机图形和广播339-344(2011)
答案 0 :(得分:4)
<强> 1。问:“H(水平)是什么意思?”
答:Wikipedia很好地描述了这个概念,但我会尝试总结一下。对于每个级别,数据(级别1的原始数据,否则来自先前级别的近似数据)被分解为近似和详细数据。结果是系数,用于描述不同frequency bins中的数据。
<强> 2。问:如何在matlab DWT函数中输入H = 3?
答:正如您所指出的,他们正在使用db1。为了提取水平H = 3的正确系数,我们需要实现这种级联算法。这是代码的草图。
nLevels = 3;
% Get the coefficients for level 1
[cA,cD{1}] = dwt(audio,'db1');
% Continue to cascade to get additional coefficients at each level
for n = 2:nLevels
[cA,cD{n}] = dwt(cA,'db1');
end
% Final coefficients are cA from highest level and cD from each level
答案 1 :(得分:3)
kl3755已经很好地回答了您的问题,尽管提供的解决方案可以进一步改进。对于多级小波变换,请使用wavedec
而不是dwt
命令:
H = 3;
[cA, cD] = wavedec(audio, H, 'db1');
答案 2 :(得分:1)
Daubechies-1是Haar小波。它是低通滤波器h
和高通滤波器g
>> s = sqrt(2);
>> h = [1 1] / s;
>> g = [1 -1] / s;
要查看dwt的动作,您可以发出信号
>> x = (1:64) / 64;
>> y = humps(x) - humps(0);
如@ kl3755所说,你需要申请3次:
- 每次迭代,dwt返回
低通滤波信号(近似)
高通滤波信号(细节)
- 每次下一次迭代都应用于先前的近似值
然而,术语dwt
是模糊的 - 它通常用于快速小波变换fwt
,它在每次迭代时下采样近似和细节2倍。由于这是最常用的版本,让我们在这里做FWT:
>> c1 = filter (h, s, y); % level 1 approximation
>> d1 = filter (g, s, y); % level 1 detail
>> c1 = c1 (2:2:end); d1 = d1 (2:2:end); % downsample
>> c2 = filter (h, s, c1); % level 2 approximation
>> d2 = filter (g, s, c1); % level 2 detail
>> c2 = c2 (2:2:end); d2 = d2 (2:2:end); % downsample
>> c3 = filter (h, s, c2); % level 3 approximation
>> d3 = filter (g, s, c2); % level 3 detail
>> c3 = c3 (2:2:end); d3 = d3 (2:2:end); % downsample
很容易看出你如何编程这个递归。
fwt
输出通常仅使用最终近似值(c3)和细节信号:
>> fwt_y_3 = [c3 d3 d2 d1];
fwt
表示的'魔力'是你可以在反转过滤器之后通过过滤和上采样以上述方式重建原始内容:
>> g=reverse(g); % h is symmetric
>> d3 (2,:) = 0; d3 = d3 (:)'; % upsample d3
>> c3 (2,:) = 0; c3 = c3 (:)'; % upsample c3
>> r2 = filter (h, 1/s, c3) + filter (g, 1/s, d3); % level 2 reconstruction
>> d2 (2,:) = 0; d2 = d2 (:)'; % upsample d2
>> r2 (2,:) = 0; r2 = r2 (:)'; % upsample r2
>> r1 = filter (h, 1/s, r2) + filter (g, 1/s, d2); % level 1 reconstruction
>> d1 (2,:) = 0; d1 = d1 (:)'; % upsample d1
>> r1 (2,:) = 0; r1 = r1 (:)'; % upsample r1
>> ry = filter (h, 1/s, r1) + filter (g, 1/s, d1); % reconstruction of y
检查是否一切都是这样:
>> subplot(2,2,1);plot([y' 80+ry']);
>> subplot(2,2,2);plot([c1' 80+r1(1:2:end)']);
>> subplot(2,2,3);plot([c2' 80+r2(1:2:end)']);
>> subplot(2,2,4);plot(fwt_y_3);hold on;plot(80+c3(1:2:end));hold off
名称dwt
可能指的是未抽取小波变换的不同版本。 fwt
更快且不冗余,但其主要缺点是它不是移位不变的:你不能通过重建y的移位fwt
来移动y。未解除的小波变换是移位不变的:
1.连续小波变换cwt
如上所述,但没有下采样和上采样
见dl.acm.org/citation.cfm?id=603242.603246
2.'循环旋转'或'àtrous'变换进行子采样,但是在每个级别执行所有可能的变换。
见dl.acm.org/citation.cfm?id=1746851