Wie bestimme ich, ob ein diskretes Signal periodisch ist oder nicht?

12

Ich möchte wissen, wie ich feststellen kann, ob eine Reihe von Daten periodisch ist oder nicht.

Ich möchte Fourier-Transformation / Serie verwenden. Meine Daten sehen entweder aperiodisch aus

[111100001111000110010101010000101]

oder periodisch

[11001100110011001100]

und ich muss entscheiden, welches es automatisch ist. Welche Arten von Analysen oder Berechnungen kann ich durchführen, um festzustellen, ob ein Signal periodisch ist oder nicht?

Safzam
quelle

Antworten:

14

Ich würde eine normalisierte Autokorrelation durchführen , um die Periodizität zu bestimmen. Wenn es mit der Periode periodisch ist , sollten Sie Peaks bei jedem P- Abtastwert im Ergebnis sehen. Ein normalisiertes Ergebnis von "1" impliziert eine perfekte Periodizität, "0" impliziert in dieser Periode überhaupt keine Periodizität, und Werte dazwischen implizieren eine unvollständige Periodizität. Subtrahieren Sie den Mittelwert der Datensequenz von der Datensequenz, bevor Sie die Autokorrelation durchführen, da dies die Ergebnisse verzerrt.PP

Die Peaks neigen dazu, sich zu verringern, je weiter sie vom Zentrum entfernt sind, weil sie weniger überlappende Samples haben. Sie können diesen Effekt abschwächen, indem Sie die Ergebnisse mit dem Kehrwert des Prozentsatzes überlappender Stichproben multiplizieren.

Dabei istU(n)die nicht vorgespannte Autokorrelation,A(n)die normalisierte Autokorrelation,nder Versatz undNdie Anzahl der Abtastwerte in der Datensequenz, die Sie auf Periodizität prüfen.

U(n)=EIN(n)N|N-n|
U(n)EIN(n)nN

EDIT: Dies ist ein Beispiel, um festzustellen, ob die Sequenzen periodisch sind. Das Folgende ist Matlab-Code.

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'))

Der "unverzerrte" Parameter für die xcorr-Funktion weist sie an, die in meiner obigen Gleichung beschriebene Skalierung durchzuführen. Die Autokorrelation ist jedoch nicht normalisiert, weshalb der Peak im Zentrum bei 0,25 statt bei 1 liegt. Das spielt jedoch keine Rolle, solange wir bedenken, dass der Center-Peak eine perfekte Korrelation ist. Wir sehen, dass es keine anderen entsprechenden Peaks außer an den äußersten Rändern gibt. Diese spielen keine Rolle, da sich nur eine Stichprobe überlappt, was nicht aussagekräftig ist.

Nicht periodisch

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'))

Hier sehen wir, dass die Sequenz periodisch ist, weil es mehrere unverzerrte Autokorrelationspeaks mit der gleichen Größe wie der mittlere Peak gibt.

Periodisch

Jim Clay
quelle
3
+1: Möglicherweise möchten Sie auch die Daten vor dem Bilden von A korrigieren (EIN(n)
1
@ PeterK Guter Punkt.
Jim Clay
Hey Jim, danke. Ich bin ein bisschen verwirrt, wie ich damit anfangen soll, denn wo immer ich nach Autokorrelation suche, finde ich komplexe Formeln. Ich habe nicht wirklich die Idee, wo ich anfangen soll und wie man Spitzen mit Punkt P im Code erkennt . Bei mir habe ich eine Liste von Werten V [] = {110011001100 ..}, wie man sie in Autokorrelationsformeln einsetzt und feststellt, ob sie periodisch sind oder nicht ... Können Sie mir bitte einen leichten Einstieg geben ... Vielen Dank
Safzam
@safzam Wenn Sie Matlab oder Python (numpy) verwenden, verfügen diese bereits über Autokorrelationsfunktionen. Wenn Sie etwas in C / C ++ / Java / whatever benötigen, versuchen Sie es hier
Jim Clay
Zum Beispiel habe ich folgende zwei Signale s1 und s2 verwendet: s1 = [1, 1, 0, 1, 1, 0, 1, 0, 1, 1] s2 = [1, 0, 1, 1, 1, 0 , 1, 0, 0, 0, 1] r1 = numpy.correlate (s1, s1, mode = 'full') r2 = numpy.correlate (s2, s2, mode = 'full') Ich habe diese vier Zeilen in a verwendet Python-Code. Ich habe r1 = [1 2 1 2 4 2 3 6 3 4 8 4 3 6 3 2 4 2 1 2 1] und r2 = [1 0 1 1 2 0 3 2 3 2 6 2 3 3 0 2 1 1 0 1] sowohl r1 als auch r2 ergeben die gleiche Regenbogenkurve wie die Form. Wie kann ich im Code feststellen, dass ein Signal peroidisch oder nahezu periodisch oder überhaupt nicht periodisch ist?
safzam
4

Jims Antwort ließ mich darüber nachdenken, wie ich das statistisch testen könnte. Dies führte mich zum Durbin-Watson-Autokorrelationstest .

Die Verallgemeinerung davon ist zu bilden:

DW(τ)=n=τN-1[U(n)-U(n-τ)]2n=0N-1U(n)2

und mein versuch dies in scilab umzusetzen ist:

// 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(τ)τ

Wenn ich das Ergebnis für unsere beiden Beispielsequenzen zeichne:

Bildbeschreibung hier eingeben

Dann ist es klar, dass die zweite Sequenz eine Korrelation bei Verzögerungen von 4, 8 usw. und eine Antikorrelation bei Verzögerungen von 2, 6 usw. aufweist.

DW(τ)

Peter K.
quelle
Danke für diese Info. Infact Ich mache ein Programm in Python, in dem ich eine Menge Listen mit Nullen und Einsen bekomme. Ich möchte periodische, zufällige Serien vom Burst-Typ trennen. Ich versuche die obige Logik in Python, aber "xcorr" -Funktion ist nicht in Python, dann habe ich numpy.correlate (lst, lst, mode = 'full') -Funktion verwendet. Außerdem enthält die Liste rund 70.000 Listen mit Nullen und Einsen. Ich möchte nur feststellen, ob diese Liste periodisch ist oder nicht. Wenn es eine kleine Un-Periodizität gibt, kann ich sie vermeiden. jeder weitere Hinweis bitte. Danke im Voraus.
Safzam