我会尝试更具体一点:我有几个信号的时间历史,它们具有几乎所有相同的行为(正弦波),但都在不同的时间点开始。如何自动检测初始时间延迟并将其删除,以便所有正弦波在同一时刻开始?
问问题
2472 次
2 回答
2
如果您有两个信号 x 和 y,每个信号都是 anx 1 矩阵,其中 y 是 x 的移位版本:
[c,lags] = xcorr(x,y); % c is the correlation, should have a clear peak
s = lags(c==max(c)); % s is the shift you need
y2 = circshift(y,s); % y2 should now overlap x
(仅用于演示目的 - 我不建议您对实际数据进行 circshift)。在这种情况下,您正在寻找的偏移与 x 和 y 的长度相比,理想情况下应该相对较小。很大程度上取决于噪声水平和偏移的性质。
于 2013-08-01T09:57:44.673 回答
0
以下在低噪声条件和快速采样下工作得很好,并且可能取决于您对准确性的要求。它使用一个简单的阈值,因此当事情变得嘈杂时会变得不准确。调整thresh
为高于噪声的低值。
Nwav = 3;
Np = 100;
tmax = 50;
A = 1000;
Nz = Np/5;
%%%%%%%%%%%%%%
thresh = A/50;
%%%%%%%%%%%%%%
% generate some waveforms
t = [0:tmax/(Np-1):tmax].';
w = rand(1,Nwav);
offs = round(rand(1,Nwav)*100);
sig = [A*sin(t(1:end-Nz)*w) ; zeros(Nz,Nwav)] + randn(Np,Nwav);
for ii=1:Nwav
sig(:,ii) = circshift(sig(:,ii),round(rand()*Nz));
end
figure, plot(t,sig)
hold on, plot(t,repmat(thresh,length(t),1),'k--')
% use the threshold and align the waveforms
for ii=1:Nwav
[ir ic] = find(sig(:,ii)>thresh,1)
sig(:,ii) = circshift(sig(:,ii),-ir+1);
end
figure, plot(t,sig)
hold on, plot(t,repmat(thresh,length(t),1),'k--')
有改进的空间(噪声过滤,斜率检测),但这应该让你开始。
我还建议您查看波形处理工具箱,例如在 matlab 中央。
于 2013-08-01T09:49:59.483 回答