1. 项目介绍
本次参与的是[2025寒假在家一起练](https://www.eetree.cn/activity/118)的平台5 - CrowPanel ESP32 Display 4.3英寸HMI开发板的任务2:音频信号播放及分析。
完整的完成了任务要求:
1. PC上通过自带Micphone采集输入的音频信号,再通过WiFi传输到4.3英寸显示终端
2. 显示终端对接收到的音频信号做频谱分析,在屏幕上可以显示:
- 音频信号波形
- 音频信号的频谱
- 信号的参数 - 幅度值、频率范围
- 可以通过界面来选择只显示波形、只显示频谱、二者都显示
关于要求一,使用python实现了多样的收音策略,如果系统有回环录音,那么传递的数据将是电脑播放的声音,其次如果有麦克风则采集麦克风的声音,如果都没有,则将传递进来的音频文件作为声音来源进行播放,这样的好处就是有多个声音来源(主要是我这里的电脑主机没麦克风>.<)
总的来说,本项目是一个基于ESP32-S3的实时音频频谱显示系统,能够通过TCP网络接收音频数据,进行FFT频谱分析,并在LCD显示屏上实时显示音频波形和频谱。系统支持多种显示模式切换,包括波形图、频谱图以及双视图模式。
2. 方案框架和设计思路
2.1 硬件组成
- ESP32-S3微控制器
- 4.3寸RGB LCD显示屏
- GPIO按键(用于视图切换)
2.2 软件架构
整体的流程设计是如此:
2.3 关键技术点
- 数据采集层
- PC端实时音频采集
- TCP网络传输
- 采样率8kHz,8位采样
- 信号处理层
- ESP-DSP库FFT实现
- 128点FFT分析
- 频谱数据映射与均值计算
算法是这里处理的核心内容,流程图如下:
- 显示控制层
- LVGL图形库
- 双缓冲显示技术
- 多任务协调机制
3. 核心软件流程与关键代码
3.1 音频数据处理流程
3.2 关键代码解析
- FFT处理核心代码
static void calculate_fft(const int8_t* input) {
// 应用窗函数并转换为浮点
for (int i = 0; i < FFT_N; i++) {
fft_input[i * 2] = input[i] * fft_window[i];
fft_input[i * 2 + 1] = 0;
}
// FFT计算
dsps_fft2r_fc32(fft_input, FFT_N);
dsps_bit_rev_fc32(fft_input, FFT_N);
}
- 显示更新机制
static void spectrum_timer_cb(lv_timer_t * timer) {
// 频谱数据压缩和均值计算
for(int i = 0; i < SPECTRUM_POINTS; i++) {
float avg = 0;
for(int j = 0; j < step; j++) {
avg += g_spectrum_data[i * step + j];
}
avg /= step;
// 映射到显示范围
int32_t magnitude = (int32_t)avg;
}
}
- 电脑作为服务器发送数据
功能流程:
主要代码:
- 音频处理
def audio_callback(self, indata, frames, time, status):
# 1. 单声道转换
# 2. 重采样到8kHz
# 3. 8bit量化
# 4. 分块发送
- 音频文件循环播放
def process_file(self):
while self.is_running:
# 1. 读取音频文件
# 2. 格式转换
# 3. 播放并发送
# 4. 循环重复
- 接口
python loopback.py [选项]
选项:
--host 指定服务器IP
--port 指定端口
--list-devices 列出可用设备
--file 指定音频文件
--no-loop 禁用循环播放
用到的关键技术点:
- 音频处理优化
- 使用 NumPy 进行高效数组操作
- 使用 SciPy 进行高质量重采样
- 使用缓冲区管理避免数据丢失
- 实时性保证
- 低延迟音频捕获
- 高效数据处理
- 实时网络传输
- 错误处理
- 设备断开恢复
- 网络异常处理
- 资源正确释放
4. 功能展示
4.1 显示模式
- 双视图模式
- 上方显示波形图
- 下方显示频谱图
- 实时更新,波形50ms刷新,频谱500ms刷新
- 单波形模式
- 全屏显示波形图
- 显示100个采样点
- 支持10秒数据滚动显示
- 单频谱模式
- 全屏显示频谱图
- 显示50个频率分量
- 频谱范围0-300的映射显示
4.2 特点说明
- 支持实时音频采集和显示
- 波形和频谱同步更新
- 按键切换显示模式
- 采用数据压缩和平均算法优化显示效果
- 支持WiFi远程数据传输
- 具有抗抖动和防止数据竞争的保护机制
5. 项目中遇到的难题和解决方法
本项目用c sdk完成,跑起来了官方的c语言例子,但已经有些过时,所以重新参考较新的sdk,尝试各种demo来完成目标。整体难度也是有点高的,对音频的解析处理也是学习理解完成。
遇到问题最主要的就是一步一步来,跑通每个例子再综合起来完成这个项目。
6. 心得体会
很有趣的活动,首次接触HMI,开发板也很有价值,有许多想法还未实现,比如通过这个开发板与博联的灯进行控制,实现电竞房的光特效等等~,希望之后有时间能够继续完善项目,将这个板子发挥最大的价值。