私はより具体的にしようとします: 私はほとんどすべて同じ動作 (正弦波) を持つ信号のいくつかの時間履歴を持っていますが、すべて異なる時点で開始します。すべての正弦波が同時に開始するように、初期タイムラグを自動的に検出して削除するにはどうすればよいですか?
質問する
2472 次
2 に答える
2
x と y の 2 つの信号があり、それぞれが x 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
(デモ目的のみ - 実際のデータを循環シフトすることはお勧めしません)。この場合に探しているシフトは、理想的には、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 central の波形処理ツールボックスを調べることもお勧めします。
于 2013-08-01T09:49:59.483 に答える