1

我会尝试更具体一点:我有几个信号的时间历史,它们具有几乎所有相同的行为(正弦波),但都在不同的时间点开始。如何自动检测初始时间延迟并将其删除,以便所有正弦波在同一时刻开始?

4

2 回答 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 回答