回答:
ここにあなたが必要なことをする試みがあります scilab.
上のプロットは、私が合成したいくつかのデータを示しています。2番目のプロットは、生データの自己相関を示しています(自己相関の中央ピーク付近を拡大表示しています)。赤い円は、このfind_peaks
関数を使用して検出されたピークを示しています。
最後のプロットは、すべてのピーク位置の違いを示しています。これは期間の見積もりになります。基礎となる期間が整数のサンプルになることが保証されていないため、おそらくこれらの値の平均を見つける必要があります。
この場合、「真の」期間は1/f0 = 11.191996
であり、を取得diffs = diff(peaks);
してからがmean(diffs(10:173))
得られ11.195122
ます。
以下のコード。
N = 1000;
f0 = 0.0893495634;
phi = rand(1,1,'uniform')*2*%pi;
sigma = 0.5;
x = sin(2*%pi*[0:N-1]*f0 + phi) + sigma*rand(1,N,'normal');
XC = xcorr(x);
clf
subplot(311)
plot(x);
subplot(312)
plot(XC);
peaks=peak_detect(XC,0);
plot(peaks,XC(peaks),'ro')
a = get('current_axes');
a.data_bounds=[950 1050 -500 800];
subplot(313)
plot(diff(peaks));
信号にウィンドウ関数を適用しているようです(自己相関プロットはウィンドウのようです)!
その作業を行うには、信号をフレーム化された一定のデータに分割するか、重複しないかを決め、自己相関関数を適用します。
最後にピーク位置を見つけて、期間を見つけたことを祝福します!