【发布时间】:2017-07-31 04:33:36
【问题描述】:
我最近一直在尝试在 MATLAB 中实现基于 Echo Hiding 的音频水印(隐写术)技术。正如W.Bender & D.Gruhl 在 1996 年所描述的那样,我能够通过单个回声隐藏和提取数据。这种技术有许多改进版本,例如添加正和负回声、backward and forward echos、time-spreaded echos 等。
当只有很少的回声时,使用倒谱相关来捕捉编码信号中的回声峰值并不难。但是,当我尝试使用如下所示的伪随机序列实现时间扩展回声隐藏方法时,在检测回声期间对我来说变得不可能:
这是我生成时间扩展回声的方式。这不是数据隐藏的进展。我尽可能多地剪掉它以缩短我的代码:
[audio.data, audio.fs] = audioread('test.wav');
[audio.len, audio.ch] = size(audio.data);
key = 'password'; %Key to generate a pseudo-random sequence
rand('seed', sum(double(key))); %Set seed of random sequence using sum of key
a = rand(1023, 1); %1023 pseudo-random numbers between 0 and 1
pr = sign(a -.5); %Convert pseudo-random sequence into +1 and -1
delay = 50; %Delay (in samples)
alpha = .02; %Echo amplitude
echo_kernel = [1; zeros(delay-1,1); pr] * alpha; %Echo kernel
%Echoed signal via convolution with echo kernel for each channels
for i=1:audio.ch
echoed(:,i) = conv(audio.data(:,i), echo_kernel);
end
如何检测第 50 个样本后添加的回声?当我只添加少量回波时,下面的倒谱相关性为我提供了所需的峰值,但它不适用于时间扩展回波。
ifft(log(fft(signal).^2)) %Cepstrum correlation of audio signal
在创建回显内核时我做错了什么吗?我使用了一个类似的内核而不使用伪随机序列来获得一个带有以下代码的单一回显,并且效果很好:
alpha = .6; delay = 50;
echo_kernel = [1; zeros(delay-1,1); 1] * alpha; %Echo kernel
为了简化这项技术,我设置了pr = ones(1023,1),希望能捕捉到回波的峰值。作者建议在回波信号的倒谱和 PN 序列之间使用互相关。我已经在复杂的倒谱xcorr(ifft(log(fft(signal))), pr) 上尝试过它,并且有许多可能的变化,包括真正的倒谱。我已经绘制了所有的试验,试图看看我会在哪里赶上一个高峰,但我没有得到我想要的结果。
希望有人也对同一领域感兴趣。
提前致谢。
【问题讨论】:
-
伪随机序列就像噪声一样,尝试在帧大小Lpn之前及时过滤信号,并对信号的属性和它的回声。属性可能是 FFT 峰。
-
@SACHIN 我猜这里使用的伪随机序列的逻辑与我们用于扩频的逻辑有点不同,不是吗?你建议我使用什么样的过滤器?低通?您的意思是与您的共同相关的互相关吗?
标签: matlab audio watermark steganography audio-processing