最近,我一直在尝试禁止MATLAB中基于Echo Hiding的音频水印(隐写术)技术。如W.Bender & D.Gruhl在1996年所描述的,我能够通过单个回波来隐藏和提取数据。此技术有许多改进的版本,例如添加正回波和负回波,backward and forward echostime-spreaded echos等。

当回波很少时,使用倒谱相关来捕获编码信号中回波的峰值并不困难。但是,当我尝试使用伪随机序列强制执行时间扩展的回声隐藏方法时,在回声检测期间对我来说是不可能的,如下所示:

matlab - 检测时间扩散回波-LMLPHP

这是我生成时间扩展回波的方法。这不是数据隐藏进度。我尽可能地缩短它以缩短代码:

[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)上进行了尝试,并进行了许多可能的变化,包括实际倒谱。我已经绘制了所有的试验图,试图找出要达到峰值的位置,但是我没有得到想要的结果。

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

提前致谢。

最佳答案

在单回波隐藏中,在倒频谱域中有一个大的对应于回波的峰值。因此,嵌入的数据可能会被解码
无需任何特殊信息,仅使用倒谱分析即可。但是,在时间扩展回波方法中,存在许多峰值,但很小
倒频谱域中的振幅。因此,仅使用倒谱分析很难检测到嵌入的数据。要解码嵌入的数据,您必须使用在编码过程中使用的原始PN序列对倒频谱域中隐藏的时间扩展回波进行解扩。

07-28 11:31