2016-12-07 1 views
-1

J'ai des données comme ceci: [1,3,3,....1] ~ 500 nombres.Traitement du signal en Python. Trouver le décalage dans les données de série

Chaque 1 ms, j'en ai un nouveau, mais avec un décalage (5-10 points) + petit bruit.

E.g: 
[1 2 3 4 3 21 4 5...] 
[0 4 3 1 2 3 4 19 7 5 ...] 

Dans ce changement de cas est 3.

Je veux savoir ce changement. Comment puis-je l'obtenir? La manière de Fourier est de ralentir .. Parce que j'ai beaucoup de lignes par seconde. find time shift between two similar waveforms

Y a-t-il des moyens rapides? Ou Peut-être devrais-je utiliser Fourier pour seulement une partie de mes données (car elles se déplacent approximativement comme des entières). Merci beaucoup.

Répondre

0

Si vous savez que le décalage n'est que de quelques échantillons 5-10, vous pouvez utiliser l'autocorrélation pour le trouver. Il devrait être rapide si vous ne le calculez que pour cette petite plage limitée de retards. Si vous le calculez pour tous les décalages possibles, il sera probablement très lent.

Voici un exemple où un algorithme AMDF modifié a été utilisé:

import numpy as np 

def modified_amdf(x1, x2, steps): 
    N = min(len(x1), len(x2)) 
    res = [] 
    for step in steps: 
     sm = 0 
     for n in range(0, N - step): 
      sm += np.abs(x1[n] - x2[n + step]) 
     sm = sm * (1.0/(N - step - 1)) 
     res.append(sm) 
    return res 

#x1 = [1, 2, 3, 4, 3, 21, 4, 5] 
#x2 = [0, 4, 3, 1, 2, 3, 4, 19, 7, 5] 
x1 = np.sin(np.linspace(0, 10*np.pi, 500)) 
x2 = np.r_[[0,0], x1] # add two lag entries 
penalties = modified_amdf(x1, x2, range(5)) 
print "Found lag:", np.argmin(penalties) 

Vous pouvez améliorer la vitesse un peu si vous modifiez les calculs utilisés uniquement numpy, mais cela ne devrait prendre de temps avec seulement 500 échantillons pour quelques décalages.

+0

pouvez-vous donner un exemple pour le calcul? –

+0

Cela a-t-il fonctionné pour vous? –