我通过首先使用自相关找到回声信号的参数来实现回声消除器。我的信号有多次延迟。 使用s = xcorr(x,x)后,如何提取s的峰值? max函数给出了s中心的值,findpeaks()给出了最大峰值旁边的峰值,但高于实际延迟峰值。
答案 0 :(得分:1)
简而言之
在平滑版本的自相关上使用带有SORTSTR的findpeaks。
更多的话
这实际上取决于你的信号是多么嘈杂,但快速解决你的问题的方法是首先平滑你的自相关以限制噪声的影响,这可能会在感兴趣的峰值周围引入多个局部最大值。然后,您可以按降序排列峰值。
可以使用并可能合并的其他选项:
或者只是编写自己的代码,这是您最终可能需要做的事情,以使代码完全按照您的意愿执行。
代码:
% Create right portion of autocorrelation of a sinusoid with some noise
% This should lead to peaks of decreasing amplitude around positions 1, 26, 51, 76
% Note: This is a quick example. A more realistic signal would show better peaks.
x=.4*sin(2*pi*(1:N)/N*4)+rand(1,N);
autocorr=xcorr(x);
autocorr=autocorr(N:(2*N-1));
% Smooth out the autocorrelation
autocorrFiltered=filter([1 1 1 1 1],[1],autocorr);
subplot(2,1,1);
plot(autocorr);
xlabel('Autocorrelation')
subplot(2,1,2);
plot(autocorrFiltered);
xlabel('Smoothed autocorrelation')
[peaks,locations]=findpeaks(autocorrFiltered,'SORTSTR','descend');
% Display locations, correcting for the filter offset
locations-3
ans =
2 23 49 73 92
图片中
以下是滤波器和未滤波的自动器并排比较,说明平滑有助于找到峰值的原因。