开始前适用开发板:ESP32-S3 Korvo · 开发框架:ESP-IDF
适用开发板:Korvo S3 · 工程
03.development.audio_fft· targetesp32s3
前置:I2S Codec
学习时长:约 25 分钟 · 难度:★★★☆☆
学习目标
完成本节后,你将能够:
- 理解 FFT(快速傅里叶变换)将时域音频转频域的基本原理
- 掌握 ESP-DSP 库的 FFT + Mel 滤波 + PCEN 处理链路
- 学会在 LVGL Canvas 上实时绘制频谱动画
- 了解 9 种频谱可视化风格的切换方式
1. 这个例子在干嘛
麦克风采集音频 → ESP-DSP 做 FFT → Mel 滤波 → PCEN 归一化 → 屏幕实时绘制 9 种频谱动画风格。按 GPIO35 可切换风格。
生活类比:音乐播放器上跟着节奏跳动的频谱柱状图——你现在可以自己做一个。
┌────────┐ 模拟 ┌──────────┐ I2S ┌──────────┐ FFT ┌──────────┐
│ 麦克风 │────────→│ ES7210 │────────→│ ESP32-S3 │────────→│ 频谱数据 │
│ │ 音频信号 │ ADC 采集 │ PCM │ ESP-DSP │ 频域 │ │
└────────┘ └──────────┘ └──────────┘ │ │
↓
┌──────────┐
│ LVGL │
│ Canvas │
│ 9种动画 │
└──────────┘
2. 信号处理链路详解
PCM 音频(16bit, 16kHz)
↓
加窗(Hann Window)— 减少频谱泄漏
↓
FFT(1024 点)— 时域 → 频域,得到 512 个频率分量
↓
|幅值|² — 计算功率谱
↓
Mel 滤波器组 — 模拟人耳对不同频率的敏感度
↓
对数压缩 — log(power),压缩动态范围
↓
PCEN 归一化 — 自适应噪声抑制
↓
频谱柱状图数据(N 个柱子的高度)
↓
LVGL Canvas 绘制
为什么需要 Mel 滤波
人耳对低频(100~1000Hz 语音区)更敏感,对高频区分能力弱。Mel 滤波器按照人耳特性将 512 个频率分量压缩为少量的"频带",让频谱显示更符合听觉感受。
3. 编译烧录
cd Korvo_Firmware\03.development.audio_fft
idf.py set-target esp32s3
idf.py build flash monitor
4. 使用步骤
- 烧录后自动开始显示频谱动画
- 对着麦克风说话或播放音乐 → 观察频谱跳动
- 按 GPIO35(板载按键)切换频谱风格
- 安静环境 → 频谱接近底部(仅底噪)
5. 9 种频谱风格
包括经典柱状图、镜像对称、渐变色、波形线、粒子效果等。每种风格对同样的频谱数据有不同的视觉呈现,通过按键循环切换。
6. 运行现象
| 环境 | 频谱表现 |
|---|---|
| 安静 | 柱子很矮,底噪水平 |
| 说话 | 中低频(前几个柱子)跳动 |
| 音乐 | 全频段活跃跳动 |
| 拍手 | 瞬间全频爆满后衰减 |
7. 常见问题与排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 频谱不动 | 麦克风无信号 | 检查 ES7210 初始化;跑 board_test |
| 全满不变 | FFT 增益过高 | 调整增益参数 |
| 全空不变 | ADC 增益太低 | 增大 ES7210 增益 |
| 按钮无反应 | GPIO35 硬件 | 确认按键焊接 |
| 画面闪烁 | LVGL Canvas 刷新问题 | 检查双缓冲配置 |
8. 动手改造建议
- 节拍检测:监测低频能量突变 → 识别音乐节拍(BPM)
- WS2812 联动:频谱数据 → 控制 LED 灯带颜色和亮度
- Wi-Fi 推送:频谱数据通过 WebSocket 发送到手机实时显示
- 语音活动检测(VAD):根据频谱判断是否有人说话
- 更大 FFT:改为 2048/4096 点,频率分辨率更高
9. 知识延伸
- FFT 基础:将 N 个时域采样转换为 N/2 个频率分量,计算复杂度 O(N·logN)
- 窗函数:不加窗 → 频谱泄漏严重;Hann 窗是音频分析最常用的窗函数
- PCEN(Per-Channel Energy Normalization):自适应归一化,能抑制稳态噪声,增强瞬态信号
- ESP-DSP 库:乐鑫官方 DSP 库,包含 FFT、FIR/IIR 滤波器、矩阵运算等,针对 ESP32 做了 SIMD 优化
10. 下一步
| 方向 | 推荐例程 | 说明 |
|---|---|---|
| 产品级频谱 | Spectrum Box | 更精美的版本 |
| 录音播放 | Audio Record Play | 音频闭环 |
| MP3 播放 | MP3 Player | 配合频谱 |
| P4C5 对比 | P4C5 Audio FFT | MIPI 大屏版 |
酷世DIY · Kevincoooool