加速度计振动数据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
相关产品推荐
相关产品推荐

