最近,我一直在尝试禁止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)
上进行了尝试,并进行了许多可能的变化,包括实际倒谱。我已经绘制了所有的试验图,试图找出要达到峰值的位置,但是我没有得到想要的结果。我希望有人对同一 Realm 也感兴趣。
提前致谢。
最佳答案
在单回波隐藏中,在倒频谱域中有一个大的对应于回波的峰值。因此,嵌入的数据可能会被解码
无需任何特殊信息,仅使用倒谱分析即可。但是,在时间扩展回波方法中,存在许多峰值,但很小
倒频谱域中的振幅。因此,仅使用倒谱分析很难检测到嵌入的数据。要解码嵌入的数据,您必须使用在编码过程中使用的原始PN序列对倒频谱域中隐藏的时间扩展回波进行解扩。