[英]Detection of time-spreaded echos
我最近一直試圖在MATLAB中實現基於Echo Hiding的音頻水印(隱寫術)技術。 我能夠通過單個回聲來隱藏和提取數據,正如W.Bender和D.Gruhl在1996年描述的那樣 。這種技術的許多改進版本,例如添加正反回聲, 后向和前向回聲 , 時間傳播回聲等
當只有很少的回聲時,使用倒譜相關來捕獲編碼信號中的回聲峰值並不困難。 但是,當我嘗試使用如下所示的偽隨機序列實現時間擴散回聲隱藏方法時,在檢測回聲期間我變得不可能:
這是我生成時間擴散回聲的方法。 這不是數據隱藏進度。 我盡可能地剪斷了它以縮短我的代碼:
[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)
和許多可能的變化(包括真正的倒譜xcorr(ifft(log(fft(signal))), pr)
上嘗試過它。 我已經繪制了所有的試驗,試圖看到我會在哪里找到一個高峰,但我沒有得到任何結果。
我希望有人也對同一領域感興趣。
提前致謝。
n單回波隱藏,在倒譜域中存在對應於回波的大單峰。 因此,僅使用倒譜分析可以在沒有任何特殊信息的情況下解碼嵌入數據。 然而,在時間擴散回波方法中,在倒譜域中存在許多具有非常小幅度的峰值。 因此,僅使用倒譜分析幾乎檢測不到嵌入數據。 要對嵌入數據進行解碼,您必須使用編碼過程中使用的原始PN序列對隱藏在倒譜域中的時間擴散回波進行解擴。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.