对含时间与振幅的CSV数据集执行FFT无有效结果,求排查
FFT频谱图无有效数据排查求助
我有一个CSV数据集,包含行号、时间(秒)、振幅、相位等列,总时长111.760秒,采样率25Hz,共2793个样本,振幅被缩放了10倍。为分析数据的周期性,我对时间与振幅列执行FFT,但运行代码后得到的频谱图无有效数据,希望有FFT经验的专业人士帮忙排查问题。
代码片段
# FFT N = 2793 # Number of samples fs = 25.0 # frequency of signal T = 1 / fs Ny = fs / 2.0 # Nyquist freq # create an array that corresponds to the values in the signal yf = fft(y) # perform the fft on the signal xf = np.linspace(0.0, Ny, N // 2) # create new x-axis: frequency # plot results plt.plot(xf, 2.0 / N * np.abs(yf[:N // 2])) plt.grid(True) plt.show()
数据示例
0 0.00 -190.919 0.0698 0 0 1 NaN 0 1 0.04 -190.814 0.1397 40 0 1 NaN 0 2 0.08 -190.769 0.2094 80 0 1 NaN 0 ... ... ... ... ... ... ... ... ... 2793 111.72 -184.862 0.8796 111720 0 1 NaN 0
结果图说明
频谱图整体趋近于零,无明显峰值或有效周期性特征,无法反映数据的频率成分。
可能的问题及排查方案
- 未去除直流分量:你的振幅数据整体在-190左右,存在较大直流偏移,FFT后直流分量会占据大部分能量,掩盖其他频率信号。需先对数据去直流:
y = y - np.mean(y)。 - 频率轴计算错误:
np.linspace生成的频率点与FFT实际频率点不匹配,建议用np.fft.fftfreq生成准确的频率轴:xf = np.fft.fftfreq(N, T)[:N//2]。 - 振幅未还原:你提到振幅被缩放10倍,FFT前需先还原原始振幅:
y = y / 10,否则幅值范围异常会导致频谱显示失效。 - 数据读取错误:确认
y确实是振幅列数据,未读错行号、时间等其他列,检查y的数值范围是否符合预期。 - FFT函数调用错误:确保使用的是numpy的FFT函数,即
np.fft.fft(y),避免调用其他库的同名函数导致结果异常。
修正后的示例代码
import numpy as np import matplotlib.pyplot as plt # 假设y是从CSV读取的振幅列数据 # 1. 还原缩放10倍的振幅 y = y / 10 # 2. 去除直流分量 y_processed = y - np.mean(y) N = len(y_processed) # 用实际数据长度,避免硬编码 fs = 25.0 T = 1 / fs # 执行FFT yf = np.fft.fft(y_processed) # 生成正确的频率轴 xf = np.fft.fftfreq(N, T)[:N//2] # 计算幅值谱(单侧) amplitude_spectrum = 2.0 / N * np.abs(yf[:N//2]) # 绘制频谱图 plt.plot(xf, amplitude_spectrum) plt.xlabel('频率 (Hz)') plt.ylabel('幅值') plt.grid(True) plt.show()
内容的提问来源于stack exchange,提问作者bigCelle
相关产品推荐
相关产品推荐

