这一章在干嘛?
DSP 实验:Cortex-M4 内置 DSP 指令(MAC、SIMD)、CMSIS-DSP 库、FIR 滤波器与 FFT 性能测试。
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 指令示例
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.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.2:CMSIS-DSP 滤波前后波形对比
37.4 下载验证
DAC 输出 1 kHz 正弦波叠加 5 kHz 噪声 → ADC 采集 → FIR 低通滤除 → LCD 显示滤波前后波形与频谱。
音频/电源/电机控制 都离不开 DSP:Cortex-M4F + FPU + DSP = 三位一体,数字信号处理效率吊打普通单片机。
Cortex-M4 DSP 指令能做什么?
单周期 MAC、SIMD、饱和运算。
CMSIS-DSP 库提供什么?
FFT/FIR/IIR/Matrix/Statistics 等函数。
使用 DSP 需要编译选项吗?
需要
--cpu Cortex-M4.fp。