¿Cómo determino si una señal discreta es periódica o no?


12

Quiero saber cómo puedo determinar si una serie de datos es periódica o no.

Quiero usar la transformación / serie de Fourier. Mis datos se ven aperiódicos

[111100001111000110010101010000101]

o periódico

[11001100110011001100]

y necesito decidir cuál es automáticamente. ¿Qué tipos de análisis o cálculos puedo realizar para determinar si una señal es periódica o no?

Respuestas:


14

Haría una autocorrelación normalizada para determinar la periodicidad. Si es periódico con el período , debería ver picos en cada muestra de P en el resultado. Un resultado normalizado de "1" implica una periodicidad perfecta, "0" no implica ninguna periodicidad en ese período, y los valores intermedios implican una periodicidad imperfecta. Reste la media de la secuencia de datos de la secuencia de datos antes de realizar la autocorrelación porque sesgará los resultados.PP

Los picos tenderán a disminuir a medida que se alejen del centro simplemente porque tienen menos muestras superpuestas. Puede mitigar ese efecto multiplicando los resultados por el inverso del porcentaje de muestras superpuestas.

U(n)=A(n)N|Nn|
U(n)A(n)nN

EDITAR: Este es un ejemplo de cómo saber si las secuencias son periódicas. El siguiente es el código de 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'))

El parámetro "imparcial" de la función xcorr le dice que haga la escala descrita en mi ecuación anterior. Sin embargo, la autocorrelación no está normalizada, por lo que el pico en el centro es de alrededor de 0.25 en lugar de 1. Sin embargo, eso no importa, siempre que tengamos en cuenta que el pico central es la correlación perfecta. Vemos que no hay otros picos correspondientes, excepto en los bordes más exteriores. Esos no importan porque solo hay una muestra superpuesta, por lo que no tiene sentido.

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

Aquí vemos que la secuencia es periódica porque hay múltiples picos de autocorrelación no sesgados con la misma magnitud que el pico central.

Periódico


3
A(n)

1
@PeterK Buen punto.
Jim Clay

Hola Jim, gracias ... Estoy un poco confundido sobre cómo comenzar a programar esto, porque cada vez que busco sobre autocorrelación encuentro fórmulas complejas, realmente no tengo la idea de dónde comenzar y cómo detectar el pico con el período P en el código . Conmigo tengo una lista de valores V [] = {110011001100 ..} ahora cómo ponerlos en fórmulas de autocorrelación y determinar si es periódica o no ... ¿Puede darme un pequeño comienzo fácil ... Muchas gracias
safzam

@safzam Si está usando Matlab o Python (numpy) ya tienen funciones de autocorrelación. Si necesita algo en C / C ++ / Java / lo que sea, intente aquí- dsprelated.com/showmessage/59527/1.php
Jim Clay

Por ejemplo, utilicé las siguientes dos señales s1 y 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') Usé estas cuatro líneas en un código de python Obtuve r1 = [1 2 1 2 4 2 3 6 3 4 8 4 3 6 3 2 4 2 1 2 1] y r2 = [1 0 1 1 2 0 3 2 3 2 6 2 3 2 3 0 2 1 1 0 1] tanto r1 como r2 dan una misma curva de arco iris como forma. ¿Cómo puedo determinar en el código que una señal es peroidc o casi periódica o no periódica, gracias?
safzam

4

La respuesta de Jim me envió a pensar en cómo probar esto estadísticamente. Esto me llevó a la prueba de autocorrelación de Durbin-Watson .

La generalización de la misma es formar:

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

y mi intento de implementar esto en scilab es:

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

Si trazo el resultado para nuestras dos secuencias de ejemplo:

ingrese la descripción de la imagen aquí

Entonces está claro que la segunda secuencia exhibe correlación en rezagos de 4, 8, etc. y anti-correlación en rezagos de 2, 6, etc.

DW(τ)


Gracias por la información. De hecho, estoy haciendo un programa en Python donde obtengo muchas listas de 0s y 1s. Quiero separar series periódicas, aleatorias, de tipo ráfaga. Estoy probando la lógica anterior en python pero la función "xcorr" no está en python, luego usé la función numpy.correlate (lst, lst, mode = 'full'). También las listas contienen alrededor de 70,000 listas de 0s y 1s. Solo quiero determinar si esta lista es periódica o no ... si hay un poco de periodicidad, puedo evitarla. cualquier pista adicional por favor. gracias por adelantado.
safzam
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.