基于np.fft.fft()的旋转扭矩数据有害振动FFT分析问题求助
测试装置DFT分析问题
正在对测试装置的数据集做DFT分析,设备轻微不对中导致扭矩传感器产生振动,需要滤除该振动,目前先尝试识别频率峰值。当前X轴频率范围是0~约15Hz,对应采样率(约30Hz)的Nyquist频率。
遇到两个问题:
- FFT图像(第3张图)异常,呈现重叠曲线而非实函数形态;
- 约0Hz处出现峰值,无法理解成因:机器运行转速约240RPM,预期在4Hz或其约数频率处出现周期性不对中导致的峰值。
相关代码
import numpy as np import matplotlib.pyplot as plt import pandas as pd #Import csv file: df = pd.read_csv('FFT_data_sample_csv.csv') N = len(df['Torque(nM) A']) #Number of samples sample_duration = df['Time(s)'].iloc[-1] - df['Time(s)'].iloc[0] #Last sample time - first sample time freq = N/sample_duration #Frequency is ~31 hz T = 1/freq #Period (based on sampling) X = np.fft.fft(df['Torque(nM) A']) X_mag = np.abs(X) / N #normalized magnitude by number of samples freqPlot = np.fft.fftfreq(N, d=T) fig, [ax1, ax2, ax3] = plt.subplots(nrows=3, ncols=1, figsize=(8, 8)) ax1.plot(df["Time(s)"], df["Torque(nM) A"]) ax1.set_title('Torque (nm) vs. Time (s)') ax1.set_xlabel('Time (s)') ax1.set_ylabel('Torque (nm)') ax2.plot(df['Time(s)'], df['RPM A']) ax2.set_title('RPM ') ax2.set_xlabel('Time (s)') ax2.set_ylabel('RPM') ax3.plot(freqPlot, X_mag) ax3.set_title('FFT Frequency') ax3.set_xlabel('Frequency') ax3.set_ylabel('Magnitude') plt.subplots_adjust(top=.94, hspace=.4, bottom=.07) plt.show()
测试图像

解决思路
1. FFT图像重叠修复
np.fft.fftfreq返回的频率包含正负值,实信号的FFT正负频率幅度对称,直接全量绘制就会出现左右重叠的曲线。只需截取正频率部分绘图即可:
# 筛选正频率索引 positive_idx = freqPlot >= 0 # 只绘制正频率对应的幅度 ax3.plot(freqPlot[positive_idx], X_mag[positive_idx])
另外,为了让幅度值更贴合物理意义,实信号的正频率(除0Hz和Nyquist频率)幅度需要翻倍,修正代码如下:
X_mag = np.abs(X) / N # 对正频率区间(除0Hz)幅度翻倍 X_mag[1:N//2] *= 2
2. 0Hz峰值成因与消除
0Hz峰值对应信号的直流分量,也就是扭矩信号的平均值,成因可能是传感器零点偏移、设备静态负载等。要消除这个峰值,只需先对信号做去直流处理:
# 减去信号平均值,去除直流分量 torque_data = df['Torque(nM) A'] - df['Torque(nM) A'].mean() X = np.fft.fft(torque_data)
关于4Hz预期峰值的排查
如果预期的4Hz峰值没出现,建议做以下检查:
- 查看RPM曲线,确认转速是否稳定在240RPM左右,转速波动会导致峰值分散;
- 检查采样时长,FFT频率分辨率为
1/采样时长,时长过短会导致分辨率不足,峰值难以识别。
内容的提问来源于stack exchange,提问作者ramonyc
相关产品推荐
相关产品推荐

