Comment déterminer si un signal discret est périodique ou non?

12

Je veux savoir comment déterminer si une série de données est périodique ou non.

Je veux utiliser la transformée / série de Fourier. Mes données sont soit apériodiques

[111100001111000110010101010000101]

ou périodique

[11001100110011001100]

et j'ai besoin de décider lequel c'est automatiquement. Quels types d'analyses ou de calculs puis-je effectuer pour déterminer si un signal est périodique ou non?

safzam
la source

Réponses:

14

Je ferais une autocorrélation normalisée pour déterminer la périodicité. S'il est périodique avec la période vous devriez voir des pics à chaque échantillon dans le résultat. Un résultat normalisé de "1" implique une périodicité parfaite, "0" n'implique aucune périodicité du tout à cette période et les valeurs intermédiaires impliquent une périodicité imparfaite. Soustrayez la moyenne de la séquence de données de la séquence de données avant d'effectuer l'autocorrélation, car cela faussera les résultats.PP

Les pics auront tendance à diminuer plus loin du centre qu'ils obtiennent simplement parce qu'ils ont moins d'échantillons qui se chevauchent. Vous pouvez atténuer cet effet en multipliant les résultats par l'inverse du pourcentage d'échantillons qui se chevauchent.

U(n)=A(n)N|Nn|
où est l'autocorrélation non biaisée, est l'autocorrélation normalisée, est l'offset et est le nombre d'échantillons dans la séquence de données dont vous vérifiez la périodicité.U(n)A(n)nN

EDIT: Ceci est un exemple de la façon de savoir si les séquences sont périodiques. Voici le code 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'))

Le paramètre "non biaisé" de la fonction xcorr lui dit de faire la mise à l'échelle décrite dans mon équation ci-dessus. L'autocorrélation n'est pas normalisée, cependant, c'est pourquoi le pic au centre est d'environ 0,25 au lieu de 1. Cela n'a pas d'importance, cependant, tant que nous gardons à l'esprit que le pic central est une corrélation parfaite. Nous voyons qu'il n'y a pas d'autres pics correspondants sauf aux bords les plus externes. Cela n'a pas d'importance car il n'y a qu'un seul échantillon qui se chevauchent, ce n'est donc pas significatif.

Non périodique

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

Ici, nous voyons que la séquence est périodique car il existe plusieurs pics d'autocorrélation non biaisés de même ampleur que le pic central.

Périodique

Jim Clay
la source
3
A(n)
1
@PeterK Bon point.
Jim Clay
Hé Jim, merci ... Je ne sais pas trop comment commencer à programmer cela, car partout où je recherche sur l'autocorrélation, je trouve des formules complexes, je ne sais pas vraiment par où commencer et comment détecter le pic avec la période P dans le code . Avec moi, j'ai une liste de valeurs V [] = {110011001100 ..} maintenant comment les mettre dans des formules d'autocorrélation et déterminer si c'est périodique ou non ... Pouvez-vous s'il vous plaît me donner un petit départ facile ... Merci beaucoup
safzam du
@safzam Si vous utilisez Matlab ou Python (numpy), ils ont déjà des fonctions d'autocorrélation. Si vous avez besoin de quelque chose en C / C ++ / Java / quoi que ce soit, essayez ici
Jim Clay
Par exemple, j'ai utilisé les deux signaux suivants s1 et 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') J'ai utilisé ces quatre lignes dans un code python. J'ai eu r1 = [1 2 1 2 4 2 3 6 3 4 8 4 3 6 3 2 4 2 1 2 1] et r2 = [1 0 1 1 2 0 3 2 3 2 6 2 3 2 3 0 2 1 1 0 1] les deux r1 et r2 donnent une même courbe en arc-en-ciel comme la forme .. Comment puis-je déterminer dans le code qu'un signal est peroidc ou presque périodique ou pas périodique du tout, merci
safzam
4

La réponse de Jim m'a envoyé réfléchir à la façon de tester cela statistiquement. Cela m'a conduit au test d'autocorrélation Durbin-Watson .

La généralisation de celui-ci consiste à former:

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

et ma tentative d'implémenter cela dans scilab est:

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

W(τ)τ

Si je trace le résultat de nos deux exemples de séquences:

entrez la description de l'image ici

Ensuite, il est clair que la deuxième séquence présente une corrélation à des retards de 4, 8, etc. et une anti-corrélation à des retards de 2, 6, etc.

W(τ)

Peter K.
la source
Merci pour cette information. En fait, je fais un programme en python où j'obtiens beaucoup de listes de 0 et de 1. Je veux séparer des séries de rafales périodiques, aléatoires. J'essaie la logique ci-dessus en python mais la fonction "xcorr" n'est pas en python, alors j'ai utilisé la fonction numpy.correlate (lst, lst, mode = 'full'). De plus, les listes contiennent environ 70 000 listes de 0 et de 1 .. Je veux juste déterminer si cette liste est périodique ou non ... s'il y a un peu de périodicité, je peux l'éviter. tout autre indice plz. Merci d'avance.
safzam