检测时间传播的回声

时间:2017-03-10 00:33:31

标签: matlab audio watermark steganography audio-processing

我最近一直试图在MATLAB中实现基于Echo Hiding 的音频水印(隐写术)技术。我可以通过W.Bender & D.Gruhl在1996年描述的单回波隐藏和提取数据。这种技术的许多改进版本,例如添加正反回,backward and forward echos,{{3}等等。

当只有很少的回声时,使用倒谱相关来捕获编码信号中的回声峰值并不困难。但是,当我尝试使用如下所示的伪随机序列实现时间扩散回声隐藏方法时,我在检测回声时变得不可能:

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

创建echo内核时我做错了吗?我使用类似的内核而不使用伪随机序列来获得带有以下代码的sigle echo,并且它运行良好:

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)上尝试了它,并且有许多可能的变化,包括真正的倒谱。我已经绘制了所有的试验,试图看看我会在哪里找到一个高峰,但我没有按照我的意愿得到结果。

我希望有人也对同一领域感兴趣。

提前致谢。

1 个答案:

答案 0 :(得分:0)

n单回波隐藏,在倒谱域中存在对应于回波的大单峰。因此,可以解码嵌入数据 没有任何特殊信息只使用倒谱分析。然而,在时间扩散回波方法中,存在很多非常小的峰值 倒谱域中的振幅。因此,仅使用倒谱分析几乎检测不到嵌入数据。要对嵌入数据进行解码,您必须使用编码过程中使用的原始PN序列对隐藏在倒谱域中的时间扩散回波进行解扩。