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

加速度计振动数据FFT计算无有效峰值问题求助

问题分析与解决方案

你的FFT结果出现随机峰值、无预期特征峰,主要是代码中数据处理的几个问题导致的,以下是具体修正步骤:

1. 修正数据读取逻辑

Excel文件可能包含多列,直接用pd.read_excel得到的是DataFrame,a1.size会统计所有单元格的数量,而非单通道采样点数。你需要提取加速度信号所在的单列数据:

# 读取第一列数据(假设信号在第一列)
a1 = pd.read_excel(excel_file_path).iloc[:, 0]

2. 确保输入信号为一维数组

原代码中如果a1是DataFrame,y = a1.values会得到二维数组,FFT会对每列单独计算,导致频谱异常。修正后a1是Series,用y = a1.to_numpy()可直接得到一维数组。

3. 抑制频谱泄漏(加窗处理)

原始信号若不是严格整周期截断,会产生频谱泄漏,表现为随机峰值。给信号加汉宁窗可有效抑制该问题:

# 加汉宁窗
window = np.hanning(len(y))
y_windowed = y * window
yf = np.abs(fft(y_windowed))

4. 正确归一化FFT幅值

原FFT结果未做归一化,无法反映真实幅值,修正后:

# 归一化单侧频谱幅值
yf_normalized = 2.0 / N * np.abs(yf[:N//2])
xf = scipy.fftpack.fftfreq(N, d=T)[:N//2]

完整修正代码

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

excel_file_path = 'file.xlsx'
# 读取单列振动信号
a1 = pd.read_excel(excel_file_path).iloc[:, 0]

N = len(a1)  # 正确的采样点数
Fs = 100     # 采样率(需与实际采集频率一致)
T = 1.0 / Fs

y = a1.to_numpy()
y = y - np.mean(y)  # 去除直流分量

# 加窗处理抑制频谱泄漏
window = np.hanning(N)
y_windowed = y * window

# 计算FFT并归一化
yf = fft(y_windowed)
yf_normalized = 2.0 / N * np.abs(yf[:N//2])
xf = scipy.fftpack.fftfreq(N, d=T)[:N//2]

# 绘图
fig, ax = plt.subplots()
ax.plot(xf, yf_normalized)
ax.set_xlabel('频率 (Hz)')
ax.set_ylabel('加速度幅值')
plt.show()

额外注意事项

  • 务必确认采样率Fs与加速度计实际采集频率一致,这是频率轴准确的核心前提;
  • 如果信号噪声较大,可先通过低通滤波预处理,再进行FFT分析。

内容的提问来源于stack exchange,提问作者Snehal Shende

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:47:18