2025寒假练 - 用CrowPanel与LVGL设计电脑音频频谱波形显示
该项目使用了CrowPanel,实现了电脑音频频谱波形显示的设计,它的主要功能为:将电脑的录音或音频变成频谱显示。
标签
嵌入式系统
开发板
2025寒假在家一起练
CrowPanel
henry
更新2025-03-17
37

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 关键技术点


  1. 数据采集层

- PC端实时音频采集

- TCP网络传输

- 采样率8kHz,8位采样

  1. 信号处理层

- ESP-DSP库FFT实现

- 128点FFT分析

- 频谱数据映射与均值计算


算法是这里处理的核心内容,流程图如下:


  1. 显示控制层

- LVGL图形库

- 双缓冲显示技术

- 多任务协调机制


3. 核心软件流程与关键代码


3.1 音频数据处理流程



3.2 关键代码解析


  1. FFT处理核心代码


static void calculate_fft(const int8_t* input) {

    // 应用窗函数并转换为浮点

    for (int i = 0; i < FFT_N; i++) {

        fft_input[* 2] = input[i] * fft_window[i];

        fft_input[* 2 + 1] = 0;

    }

    // FFT计算

    dsps_fft2r_fc32(fft_input, FFT_N);

    dsps_bit_rev_fc32(fft_input, FFT_N);

}



  1. 显示更新机制


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[* step + j];
        }
        avg /= step;
        // 映射到显示范围
        int32_t magnitude = (int32_t)avg;
    }
}



  1. 电脑作为服务器发送数据

功能流程:

主要代码:

  1. 音频处理


def audio_callback(self, indata, frames, time, status):
    # 1. 单声道转换
    # 2. 重采样到8kHz
    # 3. 8bit量化
    # 4. 分块发送


  1. 音频文件循环播放


def process_file(self):
    while self.is_running:
        # 1. 读取音频文件
        # 2. 格式转换
        # 3. 播放并发送
        # 4. 循环重复



  1. 接口


python loopback.py [选项]
选项:
--host      指定服务器IP
--port      指定端口
--list-devices  列出可用设备
--file      指定音频文件
--no-loop   禁用循环播放



用到的关键技术点:

  1. 音频处理优化

- 使用 NumPy 进行高效数组操作

- 使用 SciPy 进行高质量重采样

- 使用缓冲区管理避免数据丢失

  1. 实时性保证

- 低延迟音频捕获

- 高效数据处理

- 实时网络传输

  1. 错误处理

- 设备断开恢复

- 网络异常处理

- 资源正确释放


4. 功能展示


4.1 显示模式


  1. 双视图模式

- 上方显示波形图

- 下方显示频谱图

- 实时更新,波形50ms刷新,频谱500ms刷新

  1. 单波形模式

- 全屏显示波形图

- 显示100个采样点

- 支持10秒数据滚动显示

  1. 单频谱模式

- 全屏显示频谱图

- 显示50个频率分量

- 频谱范围0-300的映射显示


4.2 特点说明


- 支持实时音频采集和显示

- 波形和频谱同步更新

- 按键切换显示模式

- 采用数据压缩和平均算法优化显示效果

- 支持WiFi远程数据传输

- 具有抗抖动和防止数据竞争的保护机制


5. 项目中遇到的难题和解决方法


本项目用c sdk完成,跑起来了官方的c语言例子,但已经有些过时,所以重新参考较新的sdk,尝试各种demo来完成目标。整体难度也是有点高的,对音频的解析处理也是学习理解完成。

遇到问题最主要的就是一步一步来,跑通每个例子再综合起来完成这个项目。


6. 心得体会


很有趣的活动,首次接触HMI,开发板也很有价值,有许多想法还未实现,比如通过这个开发板与博联的灯进行控制,实现电竞房的光特效等等~,希望之后有时间能够继续完善项目,将这个板子发挥最大的价值。

附件下载
audio_wave.zip
源码文件
tcp_server.bin
可执行文件
loopback.py
电脑端源文件
团队介绍
个人
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号