上篇打通了ADXL357的4000Hz高速采样,本篇在此基础上引入ARM-CMSIS-DSP库,在STM32上就地跑1024点实数FFT,让单片机变成一台“实时频谱分析仪”。
一、FFT处理链路:
采样率Fs=4000Hz,N=1024,频率分辨率Δf=4000/1024≈3.9Hz/bin
Z轴加速度数据->去均值(DC Removal) → 汉宁窗加窗-> arm_rfft_fast_f32实数FFT → arm_cmplx_mag_f32计算幅值->输出511个频点幅值(3.9~1996Hz )
在这里加汉宁窗是为了抑制频谱泄漏,不加窗时如果信号频率不恰好落在bin中心,能量会泄漏到邻近多个bin,导致谱峰变宽、旁瓣抬高 。
汉宁窗以牺牲3dB幅值精度为代价换取干净的频谱形态,特别适合多频成分场景。
主要代码:
二、正常运转频谱:
电机由TB6612驱动,霍尔编码器PID闭环,目标转速100RPM(输出轴)。减速比1:28,电机本体约2800RPM,对应基频46.67Hz。然后我写了一个Python脚本解析串口数据并且绘制4张子图:所有帧叠加(看帧间一致性)、平均值+谐波标注、0~300Hz放大、Min/Max包络。
可以看出频谱非常干净:46.7Hz处有一根醒目的峰(电机1X转频),幅值稳定在0.007g左右。93.4Hz(2X)和140Hz(3X)处可见微弱谐波。曲线基本重叠、包络窄,FFT输出非常稳定。 但是除了整数倍谐波,在113~137Hz区间还有一个额外的峰值,113÷46.67=2.42,并非整数倍。查阅资料后确认这是齿轮啮合频率,因为减速箱内某级齿轮的齿与齿周期性碰撞产生的振动。不同帧之间这个峰值高度略有波动,符合齿轮啮合的随机性特征。这不是故障信号
三、堵转对比:
用手按住输出轴模拟堵转。频谱变化剧烈:
1X转频幅值从0.007g飙升至0.020g(3倍)全频段最大峰值从0.030g飙升至0.149g(5倍)
高频区域(500Hz以上)噪声底整体抬高,长出大量毛刺
原本只在1X/3X集中的能量,散布到了整个频 段
四、开发心 得:
跑通FFT之后最大的感受:CMSIS-DSP把FFT的门槛降到了极低,只需要arm_rfft_fast_f32一行调用,1024点FFT在STM上瞬间完成。



