2017-11-24 2 views
0

Willst du dominante Frequenz, sekundäre dominante Frequenz von X, Y, Z Beschleunigungsmesser Daten in flachen CSV-Dateien (Millionen Zeilen +) z.Rolling Window, Dominante Frequenz Numpy Beschleunigungsmesser Daten

data

Ich versuche scipy obwohl bewusst numpy zu verwenden - entweder tun würde. Ich habe mein X-, Y-, Z- und SMV-Format (single magnitude vector) konvertiert und möchte die Fourier-Transformation anwenden und dann die Frequenzen mit fftfreq berechnen - das Bit, das mich besiegt, ist das n- und das Zeitfenster. Ich habe meine Sample-Raten, die Hertz, und die Größe des Roll Fenster I bei (10 Datenzeilen) aussehen wollen, aber nicht ganz sicher, wie dies unten an Skript anwenden:

#The three-dimension data collected (X,Y,Z) were transformed into a 
#single-dimensional Signal Magnitude Vector SMV (aka The Resultant) 
#SMV = x2 + Y2 + Z2 

X2 = X['X']*X['X'] 
Y2 = X['Y']*X['Y'] 
Z2 = X['Z']*X['Z'] 

#print X['X'].head(2) #Confirmed worked 
#print X2.head(2) #Confirmed worked 

combine = [X2,Y2,Z2, Y] 
parent = pd.concat(combine, axis=1) 
parent['ADD'] = parent.sum(axis=1) #Sum X2,Y2,Z2 
sqr = np.sqrt(parent['ADD']) #Square Root of Sum Above 
sqr.name = 'SMV' 

combine2 = [sqr, Y] #Reduce Dataset to SMV and Class 
parent2 = pd.concat(combine2, axis=1) 
print parent2.head(4) 

"************************* Begin Fourier ****************************" 

from scipy import fftpack 

X = fftpack.fft(sqr) 
f_s = 80 #80 Hertz 
samp = 1024 #samples per segment divided by 12.8 secs signal length 
n = X.size 
timestep = 10 
freqs = fftpack.fftfreq(n, d=timestep) 

Antwort

0

Zunächst müssen Sie laden Ihre Daten in ein numpy Array (sorry ich Ihren Ansatz nicht ganz folgen):

def load_data(): 
    csvlist = [] 
    times = [] 
    with open('freq.csv') as f: 
     csvfile = csv.reader(f, delimiter=',') 
     for i, row in enumerate(csvfile): 
      timestamp = datetime.datetime.strptime(row[0],"%Y-%m-%d %H:%M:%S.%f") 
     times.append(timestamp) 
     csvlist.append(row[1:]) 
    timestep = times[1]-times[0] 
    csvarr = numpy.array(csvlist, dtype=numpy.float32) 
    return timestep, csvarr 

Die gut einen besseren Weg, dies zu tun sein kann? Dann müssen Sie die Größen berechnen:

rms = numpy.sqrt(numpy.sum(data**2, axis=1)) 

Und dann die Fourier-Analyse:

def fourier(timestep, data): 
    N = len(data)//2 
    freq = fftpack.fftfreq(len(data), d=timestep)[:N] 
    fft = fftpack.fft(data)[:N] 
    amp = numpy.abs(fft)/N 
    order = numpy.argsort(amp)[::-1] 
    return freq[order] 

die Rückkehr von dieser ist eine Liste von Frequenzen in der Reihenfolge ihrer Bedeutung abnimmt.

Verwandte Themen