Come posso determinare se un segnale discreto è periodico o no?


12

Voglio sapere come posso determinare se una serie di dati è periodica o meno.

Voglio usare la trasformata / serie di Fourier. I miei dati sembrano aperiodici

[111100001111000110010101010000101]

o periodico

[11001100110011001100]

e devo decidere quale è automaticamente. Quali tipi di analisi o calcoli posso eseguire per determinare se un segnale è periodico o no?

Risposte:


14

Farei un'autocorrelazione normalizzata per determinare la periodicità. Se è periodico con il periodo , nel risultato dovresti vedere picchi su ogni campioneUn risultato normalizzato di "1" implica una periodicità perfetta, "0" non implica alcuna periodicità in quel periodo e valori tra la periodicità implicita imperfetta. Sottrarre la media della sequenza di dati dalla sequenza di dati prima di eseguire l'autocorrelazione perché distorcerà i risultati.PPP

Le cime tenderanno a diminuire quanto più lontano dal centro ottengono semplicemente a causa del minor numero di campioni sovrapposti. È possibile mitigare tale effetto moltiplicando i risultati per l'inverso della percentuale di campioni sovrapposti.

U(n)A(n)nN

U(n)=A(n)N|Nn|
dove è l'autocorrelazione non distorta, è l'autocorrelazione normalizzata, è l'offset e è il numero di campioni nella sequenza di dati che si sta verificando per periodicità.U(n)A(n)nN

EDIT: questo è un esempio di come dire se le sequenze sono periodiche. Di seguito è riportato il codice 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'))

Il parametro "imparziale" per la funzione xcorr gli dice di fare il ridimensionamento descritto nella mia equazione sopra. L'auto-correlazione non è normalizzata, tuttavia, motivo per cui il picco al centro è di circa 0,25 invece di 1. Ciò non importa, purché si tenga presente che il picco centrale è una correlazione perfetta. Vediamo che non ci sono altri picchi corrispondenti se non ai bordi più esterni. Quelli non contano perché c'è solo un campione sovrapposto, quindi non è significativo.

Non periodico

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

Qui vediamo che la sequenza è periodica perché ci sono più picchi di autocorrelazione imparziali con la stessa grandezza del picco centrale.

periodico


3
+1: Potresti anche voler correggere i dati prima di formare , altrimenti qualsiasi offset DC potrebbe ostacolare la ricerca dei picchi periodici. A(n)
Peter K.

1
@PeterK Un buon punto.
Jim Clay,

Ehi Jim, grazie ... Sono un po 'confuso su come iniziare a programmare questo, perché dovunque cerco di autocorrelazione trovo formule complesse, non ho davvero idea da dove iniziare e come rilevare il picco con il periodo P nel codice . Con me ho un elenco di valori V [] = {110011001100 ..} ora come inserirli nelle formule di autocorrelazione e determinare se periodicamente o no ... Puoi per favore darmi un piccolo inizio facile ... Grazie mille
safzam,

@safzam Se stai usando Matlab o Python (numpy) hanno già funzioni di autocorrelazione. Se hai bisogno di qualcosa in C / C ++ / Java / qualunque cosa, allora prova qui- dsprelated.com/showmessage/59527/1.php
Jim Clay

Ad esempio ho usato i seguenti due segnali s1 ans 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.correlate (s1, s1, mode = 'full') r2 = numpy.correlate (s2, s2, mode = 'full') Ho usato queste quattro righe in un codice Python. Ho r1 = [1 2 1 2 4 2 3 6 3 4 8 4 3 6 3 2 4 2 1 2 1] e r2 = [1 0 1 1 2 0 3 2 3 2 6 2 3 2 3 0 2 1 1 0 1] sia r1 che r2 danno la stessa curva arcobaleno come forma .. Come posso determinare nel codice che un segnale è peroidc o quasi periodico o per niente periodico, grazie
safzam

4

La risposta di Jim mi ha mandato a pensare a come testarlo statisticamente. Questo mi ha portato al test di autocorrelazione di Durbin-Watson .

La sua generalizzazione è di formare:

DW(τ)=n=τN1[U(n)U(nτ)]2n=0N1U(n)2

e il mio tentativo di implementarlo in 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;

Il risultato è che se è vicino a zero o vicino a 4 per un dato valore di , allora c'è una periodicità (autocorrelazione) lì.τDW(τ)τ

Se tracciamo il risultato per le nostre due sequenze di esempio:

inserisci qui la descrizione dell'immagine

Quindi è chiaro che la seconda sequenza mostra correlazione a ritardi di 4, 8, ecc. E anti-correlazione a ritardi di 2, 6, ecc.

Ciò di cui non sono ancora sicuro è come dire che è "vicino a" 0 o 4. Scorrerò un po 'più avanti e vedrò cosa mi viene in mente.DW(τ)


grazie per questa informazione Infatti sto realizzando un programma in Python in cui ottengo molti elenchi di 0 e 1. Voglio separare il tipo periodico, casuale, a raffica di serie. Sto provando la logica sopra in Python ma la funzione "xcorr" non è in Python, quindi ho usato la funzione numpy.correlate (lst, lst, mode = 'full'). Inoltre le liste contengono circa 70.000 liste di 0 e 1 .. Voglio solo determinare se questa lista è periodica o no ... se c'è un po 'di periodicità posso evitarlo. qualsiasi ulteriore suggerimento per favore. Grazie in anticipo.
safzam,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.