如何在加速度计数据中使用 fft 来转换频谱功率?

问题描述 投票:0回答:1

我使用加速度计放置了一个组件的振动,然后生成了一个带有加速度的数据框,即具有以下列的数据框:accX、accY 和 accZ。它是时间上的变量,即时间序列。

我的想法是使用fast transform furrier将这个变量的域(时间(s))变换到频域(Hz)。为此,我一直在研究如何做到这一点,最常用的方法之一是 numpy 库中的 fft。但是,我不能把它带到我的身边。


我一直在努力:

# Apply the FFT function to each column
fft_result_X = np.fft.fft(accX)
fft_result_Y = np.fft.fft(accY)
fft_result_Z = np.fft.fft(accZ)

# Calculate the magnitude of the power spectrum of each column
power_spectrum_X = np.abs(fft_result_X) ** 2
power_spectrum_Y = np.abs(fft_result_Y) ** 2
power_spectrum_Z = np.abs(fft_result_Z) ** 2

# Frequencies corresponding to the spectrum
frequencies = np.fft.fftfreq(len(accX), 1/62.5)

但是,放大 accY 功率谱图,在我眼中有一个奇怪的行为,请参阅:

我也一直在用:

data = dado['accX'].values
ps = np.abs(np.fft.fft(data))**2

time_step = 1 / 62.5 # sampling frequency
freqs = np.fft.fftfreq(data.size, time_step)
idx = np.argsort(freqs)

plt.plot(freqs[idx], ps[idx])
plt.show()

python fft frequency
1个回答
0
投票

numpy.fft.fft()
将返回两个共轭对。你想要使用的是
numpy.fft.rfft()
numpy.fft.rfftfreq()
也一样。此外,您可能还应该规范化您的结果。有关我制作的类似示例,请参见下面的内容。

from datetime import datetime as dt
start=dt.now()

import numpy as np
import pandas as pd
from scipy.fft import rfft, rfftfreq  
import matplotlib.pyplot as plt


data_filepath = "Lab 3 Data.xlsx"
df = pd.read_excel(data_filepath)

V1 = np.array(list(df["Voltage Data 1"]))
V2 = np.array(list(df["Voltage Data 2"]))
V3 = np.array(list(df["Voltage Data 3"]))

V1_fft = (abs(rfft(V1) / V1.size))[0:601]
V2_fft = (abs(rfft(V2) / V2.size))[0:601]
V3_fft = (abs(rfft(V3) / V3.size))[0:601]

t1 = np.linspace(0, V1.size / 1200, V1.size)
t2 = np.linspace(0, V2.size / 1200, V2.size)
t3 = np.linspace(0, V3.size / 1200, V3.size)

f1 = rfftfreq(1200, 1 / 1200)
f2 = rfftfreq(1200, 1 / 1200)
f3 = rfftfreq(1200, 1 / 1200)

fig1, ax1 = plt.subplots(3, 1, figsize = (6.5, 6), dpi = 80)

ax1[0].plot(t1, V1, color = "blue", alpha = 0.5, label = "Data Set 1")
ax1[0].axvspan(4, 4.2, color = "blue", alpha = 0.2, label = "Data Set 1 Limits")

ax1[1].plot(t2, V2, color = "red", alpha = 0.5, label = "Data Set 2")
ax1[1].axvspan(1.8, 2, color = "red", alpha = 0.1, label = "Data Set 2 Limits")

ax1[2].plot(t3, V3, color = "green", alpha = 0.5, label = "Data Set 3")

fig1.suptitle("Figure 1: Voltage over Time Comparison,\n Selected Fourier Transform Data Limits")

plt.setp(ax1[1], xlabel= "Time (s)")
plt.setp(ax1[:], ylabel = "Voltage (V)")

fig2, ax2 = plt.subplots(3, 1, figsize = (6.5, 6), dpi = 80)
ax2[0].plot(f1, V1_fft)
ax2[1].plot(f2, V2_fft)
ax2[2].plot(f3, V3_fft)


print("Runtime: {0}".format(dt.now()-start))
plt.show()
© www.soinside.com 2019 - 2024. All rights reserved.