Como determino se um sinal discreto é periódico ou não?


12

Quero saber como posso determinar se uma série de dados é periódica ou não.

Eu quero usar a transformação / série de Fourier. Meus dados parecem aperiódicos

[111100001111000110010101010000101]

ou periódico

[11001100110011001100]

e preciso decidir qual é automaticamente. Que tipos de análises ou cálculos posso executar para determinar se um sinal é periódico ou não?

Respostas:


14

PP

Os picos tendem a diminuir quanto mais afastados do centro eles ficam, simplesmente por terem menos amostras sobrepostas. Você pode atenuar esse efeito multiplicando os resultados pelo inverso da porcentagem de amostras sobrepostas.

você(n)=UMA(n)N|N-n|
você(n)UMA(n)nN

EDIT: Este é um exemplo de como saber se as seqüências são periódicas. A seguir está o código do 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'))

O parâmetro "imparcial" para a função xcorr diz para ele fazer o dimensionamento descrito na minha equação acima. Porém, a correlação automática não é normalizada, razão pela qual o pico no centro é de cerca de 0,25 em vez de 1. Isso não importa, desde que tenhamos em mente que o pico central é a correlação perfeita. Vemos que não há outros picos correspondentes, exceto nas bordas mais externas. Isso não importa, porque existe apenas uma amostra sobreposta, o que não é significativo.

Não periódico

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

Aqui, vemos que a sequência é periódica, porque existem vários picos de autocorrelação imparciais, com a mesma magnitude que o pico central.

Periódico


3
UMA(n)

1
@PeterK Bom ponto.
Jim Clay

Ei Jim, obrigado .. Estou um pouco confuso sobre como começar a programar isso, porque sempre que procuro autocorrelação, encontro fórmulas complexas, na verdade não entendo por onde começar e como detectar o pico com o período P no código . Comigo, tenho uma lista de valores V [] = {110011001100 ..} agora como colocá-los em fórmulas de autocorrelação e determinar se é periódico ou não ... Você pode me dar um começo fácil ... Muito obrigado
Safzam

@safzam Se você estiver usando Matlab ou Python (numpy), eles já possuem funções de autocorrelação. Se você precisa de algo em C / C ++ / Java / whatever, em seguida, tentar aqui- dsprelated.com/showmessage/59527/1.php
Jim Clay

Por exemplo, usei os seguintes dois sinais s1 e 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') Eu usei essas quatro linhas em um código python. Eu obtive r1 = [1 2 1 2 4 2 3 6 3 4 8 4 3 6 3 2 4 2 1 2 1] er r2 = [1 0 1 1 2 0 3 2 3 2 6 2 3 2 3 0 2 1 1 0 1] ambos R1 e R2 dá uma mesma curva do arco-íris como forma .. Como se pode determinar no código que é um sinal peroidc ou graças quase periódicas ou não periódicas em tudo,
safzam

4

A resposta de Jim me levou a pensar em como testar isso estatisticamente. Isso me levou ao teste de autocorrelação de Durbin-Watson .

A generalização disso é formar:

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

e minha tentativa de implementar isso no 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(τ)τ

Se eu plotar o resultado para nossas duas sequências de exemplo:

insira a descrição da imagem aqui

Então fica claro que a segunda sequência exibe correlação com defasagens de 4, 8 etc. e anti-correlação com defasagens de 2, 6 etc.

DW(τ)


obrigado por esta informação. De fato, estou criando um programa em python, onde recebo muitas listas de 0s e 1s. Quero separar séries periódicas, aleatórias e de tipo burst. Estou tentando a lógica acima em python, mas a função "xcorr" não está em python, então usei a função numpy.correlate (lst, lst, mode = 'full'). Além disso, as listas contêm uma lista redonda de 70.000 de 0s e 1s. Eu só quero determinar se essa lista é periódica ou não ... se houver um pouco de periodicidade, posso evitá-la. qualquer outra dica plz. desde já, obrigado.
Safzam
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.