Jak ustalić, czy sygnał dyskretny ma charakter okresowy, czy nie?

12

Chcę wiedzieć, jak mogę ustalić, czy seria danych jest okresowa, czy nie.

Chcę użyć transformacji / serii Fouriera. Moje dane wyglądają na nieokresowe

[111100001111000110010101010000101]

lub okresowe

[11001100110011001100]

i muszę zdecydować, który jest automatycznie. Jakie analizy lub obliczenia mogę wykonać, aby ustalić, czy sygnał ma charakter okresowy?

safzam
źródło

Odpowiedzi:

14

Zrobiłbym znormalizowaną autokorelację, aby określić okresowość. Jeśli jest to okresowe z okresem , w wyniku powinny pojawić się piki przy każdej próbce P. Znormalizowany wynik „1” oznacza doskonałą okresowość, „0” w ogóle nie oznacza okresowości w tym okresie, a wartości pomiędzy oznaczają niedoskonałą okresowość. Przed wykonaniem autokorelacji odejmij średnią sekwencji danych od sekwencji danych, ponieważ spowoduje to odchylenie wyników.P.P.

Szczyty będą miały tendencję do zmniejszania się w miarę oddalania się od centrum, po prostu z powodu mniejszej liczby nakładających się próbek. Możesz złagodzić ten efekt, mnożąc wyniki przez odwrotność procentu nakładających się próbek.

gdzieU(n)to nie tendencyjna autokorelacja,A(n)to znormalizowana autokorelacja,nto przesunięcie, aNto liczba próbek w sekwencji danych, które sprawdzamy pod kątem okresowości.

U(n)=ZA(n)N.|N.-n|
U(n)ZA(n)nN.

EDYCJA: Jest to przykład tego, jak stwierdzić, czy sekwencje są okresowe. Poniżej znajduje się kod 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'))

Parametr „bezstronny” funkcji xcorr nakazuje wykonanie skalowania opisanego w moim równaniu powyżej. Autokorelacja nie jest jednak znormalizowana, dlatego szczyt w środku wynosi około 0,25 zamiast 1. Nie ma to jednak znaczenia, o ile pamiętamy, że środkowy pik jest idealną korelacją. Widzimy, że nie ma innych odpowiadających pików poza skrajnymi krawędziami. Nie mają one znaczenia, ponieważ nakłada się tylko jedna próbka, więc nie ma to znaczenia.

Nieokresowe

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

Widzimy tutaj, że sekwencja jest okresowa, ponieważ istnieje wiele niezależnych pików autokorelacji o tej samej wielkości co środkowy pik.

Okresowy

Jim Clay
źródło
3
ZA(n)
1
@PeterK Dobra uwaga.
Jim Clay
Hej Jim, dzięki .. Jestem trochę zdezorientowany, jak rozpocząć programowanie, ponieważ gdziekolwiek szukam autokorelacji, znajduję złożone formuły, tak naprawdę nie mam pojęcia, od czego zacząć i jak wykryć szczyt z kropką P w kodzie . Ze mną mam listę wartości V [] = {110011001100 ..} teraz, jak umieścić je we wzorach autokorelacji i określić, czy warto okresowo czy nie ... Czy możesz dać mi trochę łatwy start ... Dziękuję bardzo
safzam
@safzam Jeśli używasz Matlaba lub Pythona (numpy), mają one już funkcje autokorelacji. Jeśli potrzebujesz czegoś w C / C ++ / Java / cokolwiek, spróbuj tutaj
Jim Clay
Na przykład użyłem następujących dwóch sygnałów s1 i s2: s1 = [1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1] s2 = [1, 0, 1, 1, 1, 0 , 1, 0, 0, 0, 1] r1 = numpy.corelate (s1, s1, mode = 'full') r2 = numpy.correlate (s2, s2, mode = 'full') Użyłem tych czterech wierszy w kod python. Mam r1 = [1 2 1 2 4 2 3 6 3 4 8 4 3 6 3 2 4 2 1 2 1] i r2 = [1 0 1 1 2 0 3 2 3 2 6 2 3 2 3 0 2 1 1 0 1] zarówno r1, jak i r2 dają ten sam kształt krzywej tęczy. Jak mogę określić w kodzie, że jeden sygnał jest peroidalny lub prawie okresowy lub wcale nieokresowy, dzięki
safzam
4

Odpowiedź Jima skłoniła mnie do zastanowienia się, jak przetestować to statystycznie. Doprowadziło mnie to do testu autokorelacji Durbina-Watsona .

Uogólnienie polega na utworzeniu:

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

a moja próba zaimplementowania tego w scilab to:

// 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;

reW.(τ)τ

Jeśli wykreślę wynik dla naszych dwóch przykładowych sekwencji:

wprowadź opis zdjęcia tutaj

Wtedy jasne jest, że druga sekwencja wykazuje korelację przy opóźnieniach 4, 8 itd. I anty-korelację przy opóźnieniach 2, 6 itd.

reW.(τ)

Peter K.
źródło
dziękuję za tę informację. W rzeczywistości tworzę program w języku Python, w którym mam dużo list zer i jedynek. Chcę oddzielić okresowe, losowe, rozerwane serie. Próbuję powyższej logiki w Pythonie, ale funkcja „xcorr” nie jest w Pythonie, a następnie użyłem funkcji numpy.correlate (lst, lst, mode = 'full'). Również listy zawierają okrągłe 70 000 list zer i jedynek. Chcę tylko ustalić, czy ta lista jest okresowa, czy nie ... jeśli jest trochę nieokreśloności, mogę jej uniknąć. wszelkie dalsze wskazówki plz. z góry dziękuję.
safzam