БПФ в Python - неверные данные? - PullRequest
0 голосов
/ 24 января 2020

на моем Raspberry PI 4 у меня есть файл xlsx, который я сканирую с помощью: df = pd.read_excel('') Это набор данных датчика давления с 146651 строками x 1 столбцом. Я хочу выполнить fft для этого набора данных, но если я построю fft, я получу кривую, точно такую ​​же, что и для сигнала времени (перемещенного по оси X ???). Так в чем же проблема?

import numpy as np
import matplotlib.pyplot as plt
from scipy import fftpack
import pandas as pd


# Import csv file
df = pd.read_excel('/home/pi/Downloads/test_11.12.19_500_neuHz.xlsx', skiprows=1)


print(df)

sig_fft = fftpack.fft(df)
power = np.abs(sig_fft)
print (power)
sample_freq = fftpack.fftfreq(df.size, 0.02)
plt.figure(figsize=(6,5))
plt.plot(sample_freq, power)


plt.show()

график

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Теперь я выполняю БПФ по-другому. Но как я могу масштабировать частоту и ось величины.

import numpy as np
import matplotlib.pyplot as plt
import scipy
from scipy.fftpack import fft
import pandas as pd
import math
from tkinter import filedialog
from tkinter import *

#choose csv file
root = Tk()
root.filename = filedialog.askopenfilename ( initialdir = "/home/pi", title = "Datei auswählen", filetypes = (("Comma Seperated Values (CSV)", "*.csv"), ("Alle Dateien", "*.*")) )


# Import csv file
df = pd.read_csv(root.filename, delimiter = ';')
#convert Voltage to Bar
df_echt = df/0.01
#preparation for fft
df_neu = df.as_matrix()
time = df_neu[:,0]
voltage = df_neu[:,0]/df_neu[:,0].max()
df_tr = df_neu.T

#fft
amplitude = np.fft.rfft (voltage)
freq = np.fft.rfftfreq(len(time),np.diff(time)[0])

#plot time signal and fft
plt.plot( np.absolute(amplitude), lw = 0.5)
plt.figure (2)
plt.plot (df_echt)
plt.legend (df)
plt.show()

БПФ график

Так как мне масштабировать оси?

0 голосов
/ 24 января 2020

Ваши входные данные должны быть в одной строке. В настоящее время ваше БПФ применяется ко всем строкам по отдельности, что означает, что выход для любой данной строки является средним для сигнала отдельной ячейки, поэтому ваш вывод такой же, как ваш вход.

#data is one column
df = pd.DataFrame([4,5,4])
df
fft = fftpack.fft(df)
fft
# output = input => wrong

#data as one row
df = pd.DataFrame({'0':[4],'1':[5],'2':[4]})
df
fft = fftpack.fft(df)
fft
# right
...