You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对含时间与振幅的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 02:23:19