这一章在干嘛?

DSP 实验:Cortex-M4 内置 DSP 指令(MAC、SIMD)、CMSIS-DSP 库、FIR 滤波器与 FFT 性能测试。

37.1 DSP 简介与环境搭建

37.2 硬件设计

37.3 程序设计

37.4 下载验证

37.1 DSP 简介与环境搭建

DSP(Digital Signal Processing)指令 = 单周期乘累加(MAC)和 SIMD 操作。

  • Cortex-M4 DSP 扩展:单周期 32×32+64 位 MAC;
  • SIMD:单指令多数据(如 32 位寄存器同时算 2 个 16 位加法)。

原书图 37.1.1:Cortex-M4 DSP 指令示例原书图 37.1.1:Cortex-M4 DSP 指令示例

CMSIS-DSP 库:ARM 官方提供,包含 100+ DSP 函数(FIR/IIR/FFT/Matrix/Statistics 等)。

编译 DSP 代码:MDK 必须选 --cpu Cortex-M4.fp,否则 DSP 指令不生效。

37.2 硬件设计

TFTLCD 显示 FFT 频谱(输入信号由 DAC 输出,ADC 采样)。

37.3 程序设计

37.3.1 启用 DSP

CubeMX → Project Manager → Advanced Settings → 勾选 DSP。

或者 MDK:

  • Target → ARM Compiler → Use FPU = Single Precision
  • Misc Controls:--cpu Cortex-M4.fp

37.3.2 FFT 示例

#include "arm_math.h"

#define N 1024
float32_t input[N], output[N];
arm_rfft_fast_instance_f32 fft;
arm_rfft_fast_init_f32(&fft, N);

// 填充 input → 执行 FFT
arm_rfft_fast_f32(&fft, input, output, 0);

// 计算幅值
float32_t magnitude[N/2];
arm_cmplx_mag_f32(output, magnitude, N/2);

原书图 37.3.2.1:FFT 计算流程原书图 37.3.2.1:FFT 计算流程

37.3.3 FIR 滤波

arm_fir_instance_f32 fir;
float32_t coeff[NUM_TAPS] = {...};
float32_t state[N + NUM_TAPS - 1];
arm_fir_init_f32(&fir, NUM_TAPS, coeff, state, N);
arm_fir_f32(&fir, input, output, N);

原书图 37.3.3.1:FIR 滤波器结构原书图 37.3.3.1:FIR 滤波器结构

原书图 37.3.3.2:CMSIS-DSP 滤波前后波形对比原书图 37.3.3.2:CMSIS-DSP 滤波前后波形对比

37.4 下载验证

DAC 输出 1 kHz 正弦波叠加 5 kHz 噪声 → ADC 采集 → FIR 低通滤除 → LCD 显示滤波前后波形与频谱。

音频/电源/电机控制 都离不开 DSP:Cortex-M4F + FPU + DSP = 三位一体,数字信号处理效率吊打普通单片机。