離散信号が周期的かどうかを判断するにはどうすればよいですか?


12

一連のデータが定期的かどうかを判断する方法を知りたい。

フーリエ変換/シリーズを使用したい。データが非周期的に見える

[111100001111000110010101010000101]

または定期的に

[11001100110011001100]

そして、それが自動的にどちらであるかを決定する必要があります。信号が周期的かどうかを判断するために、どのような種類の分析または計算を実行できますか?

回答:


14

正規化された自己相関を実行して、周期性を判断します。周期周期的である場合、結果のサンプルごとにピークが表示されます。「1」の正規化結果は完全な周期性を意味し、「0」はその周期で周期性がまったくないことを意味し、その間の値は不完全な周期性を意味します。結果にバイアスをかけるため、自己相関を実行する前にデータシーケンスからデータシーケンスの平均値を減算します。PP

重なり合うサンプルが少ないため、ピークは中心から離れるほど小さくなる傾向があります。結果に、オーバーラップするサンプルの割合の逆数を掛けることで、その影響を緩和できます。

Un

うんn=AnN|Nn|
ここで、はバイアスのない自己相関、は正規化された自己相関、はオフセット、周期性を確認するデータシーケンスのサンプル数です。うんnAnnN

編集:これは、シーケンスが周期的であるかどうかを確認する方法の例です。以下はMatlabコードです。

s1 = [1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 0 1 0 1];
s1n = s1 - mean(s1);
plot(xcorr(s1n, 'unbiased'))

xcorr関数の「バイアスなし」パラメータは、上記の式で説明したスケーリングを行うように指示します。ただし、自己相関は正規化されていないため、中心のピークが1ではなく0.25になっているのはこのためです。ただし、中心ピークが完全な相関であることを念頭に置く限り、これは重要ではありません。最も外側のエッジを除いて、対応するピークは他にないことがわかります。重複するサンプルは1つしかないため、これらは重要ではありません。したがって、それは意味がありません。

非周期的

s2 = [1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0];
s2n = s2 - mean(s2);
plot(xcorr(s2n, 'unbiased'))

ここでは、中心ピークと同じ大きさの複数の不偏自己相関ピークがあるため、シーケンスが周期的であることがわかります。

定期的


3
An

1
@PeterK良い点。
ジム・クレイ

ちょっとジム、ありがとう..私はこれをプログラミングする方法を少し混乱しています。なぜなら、自己相関について検索するときはどこでも複雑な式を見つけますが、コードの期間Pでどこから始めてピークを検出するのか本当に分かりません。私と一緒に値のリストV [] = {110011001100 ..}を自己相関式に入れ、その周期的かどうかを判断する方法があります...少し簡単に始めてください...ありがとうございました
safzam

@safzam MatlabまたはPython(numpy)を使用している場合、それらはすでに自己相関関数を持っています。あなたはC / C ++ / Javaで何かが必要な場合は/何でも、その後、here-てみdsprelated.com/showmessage/59527/1.php
ジム・クレイ

たとえば、次の2つの信号s1とs2を使用しました。s1= [1、1、0、1、1、0、1、1、0、1、1] s2 = [1、0、1、1、1、1、0 、1、0、0、0、1] r1 = numpy.correlate(s1、s1、mode = 'full')r2 = numpy.correlate(s2、s2、mode = 'full')これらの4行をPythonコード。r1 = [1 2 1 2 4 2 3 6 3 4 8 4 3 6 3 2 4 2 1 2 1]およびr2 = [1 0 1 1 2 0 3 2 3 2 6 2 3 2 3 0 2 1 1 0 1] R1およびR2の両方が形状のような同じ虹曲線を与える..どのように私は1つの信号がperoidc又は全く周期ほぼ周期的またはでないことをコードで決定することができ、感謝
safzam

4

ジムの答えは、これを統計的にテストする方法について考えるように私を送った。これは私をダービン・ワトソン自己相関テストに導きました。

それの一般化は以下を形成することです:

DWτ=n=τN1[うんnうんnτ]2n=0N1うんn2

scilabでこれを実装する私の試みは次のとおりです。

// http://en.wikipedia.org/wiki/Durbin%E2%80%93Watson_statistic
s1 = [1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 0 1 0 1];
s1n = s1 - mean(s1);
xs1 = xcorr(s1n,"unbiased");
N1 = length(xs1);

s2 = [1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0];
s2n = s2 - mean(s2);
xs2 = xcorr(s2n,"unbiased");
N2 = length(xs2);

dwstat1 = [];
dwstat2 = [];

for lag = 1:15,

    dxs1 = xs1((lag+1):N1) - xs1(1:(N1-lag));
    dxs2 = xs2((lag+1):N2) - xs2(1:(N2-lag));


    dwstat1 = [dwstat1 sum(dxs1.^2) / sum(xs1.^2)];
    dwstat2 = [dwstat2 sum(dxs2.^2) / sum(xs2.^2)];

end;

DWττ

2つのサンプルシーケンスの結果をプロットする場合:

ここに画像の説明を入力してください

次に、2番目のシーケンスが4、8などのラグで相関を示し、2、6などのラグで反相関を示すことは明らかです。

DWτ


この情報をありがとう。実際、Pythonでプログラムを作成していて、0と1のリストがたくさんあります。定期的、ランダム、バースト型のシリーズを分離したい。上記のロジックをPythonで試していますが、「xcorr」関数はPythonにありません。次に、numpy.correlate(lst、lst、mode = 'full')関数を使用しました。また、リストには0と1の70,000ラウンドのリストが含まれています。このリストが周期的であるかどうかを判断したいだけです。少し周期性がない場合は回避できます。それ以上のヒントplz。前もって感謝します。
サフザム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.