树莓派 Pico 实时声音可视化

基于树莓派 Pico 的声音可视化转换

Cherry

喜欢

3524
浏览
0
喜欢

> 更多图片

项目状态:已完成
开放度:公开
所属分类:电子
发布时间:2023-09-11
最近更新:2023-10-23

详细说明

本期教程将会通过使用一块带有外置数字麦克风和 TFT LCD 显示屏的树莓派 Pico 开发板制作一个实时音频光谱图可视化器。有了它,你就可以将你周围环境的实时声音可视化表现出来!下图是该工具运行时的预览图。

这里使用到了 Adafruit PDM MENS 扩展板(使用方法)。我们还会使用一些常见的数字信号处理(DSP)技术,直接在树莓派 Pico 上处理数字音频数据而不仅通过 USB 线将数字音频数据传输到 PC 端。通过使用 DSP 技术,将转换后的音频信号在带有 Micro SD 卡扩展板的 Adafruit 2.0 的 320x240 彩色 IPS TFT 显示屏上实时显示。

链接表


文件库

audio-spectrogram-example-for-pico-main.zip
[339518 Bytes at 2023-10-20, 62 次下载]



教程

组件清单
  • 树莓派 Pico × 1
  • Adafruit PDM MEMS 麦克风扩展板 × 1
  • 带有 micro SD 卡扩展板的 320x240 彩色 IPS TFT 显示屏 × 1
  • 全尺寸无焊面包板 × 1
  • 公对公跳线 × 20
  • 烙铁 × 1
  • 焊丝 × 若干

什么是音频频谱图?

音频频谱图被用于将由振幅表示的实时音频信号可视化为实时音频信号的频率的格式。

在下图中,左侧显示的是原始音频信号,右侧显示的则是音频信号的频谱图。

通过频谱图中的颜色强度,你可以看出音频信号的振幅与其频率之间是存在直接关联性的。

有关用于创建音频频谱图的 DSP 技术的更详细概述,可查阅"Fixed-point DSP for Data Scientists" deep dive guide on Towards Data Science

频谱图也用于基于机器学习(ML)的音频系统中,将音频信号转换为一张频谱图,以便使用计算机视觉技术对音频信号中的 2D“图像表示”进行界定。这在现实生活中例子有音频或语音识别、关键词识别。

示意图

代码

代码文件在这里可以下载:
https://make.quwj.com/project/471

制作途径

若想创建频谱图并将其实时在 LCD 屏幕上显示,请按照下面的步骤操作。

1、使用数字麦克风收集 N 个音频样本。
2、将汉宁窗 (Hanning window)应用在收集到的音频样本中。
3、使用上一步的输入运行快速傅里叶变换 (RFFT)。
4、计算 RFFT 的幅度。
5、将每个 RFFT 幅度映射一个颜色值以显示在 LCD 显示器上。
6、在 LCD 上显示新行。
7、滚动到新行并重复。

如果我们选择 256 的 RFFT 大小,我们将有 128 个可用的幅度输出并显示在屏幕上,因为这小于显示器每行的 240像素,所以我们可以显示每行两次,以最大化这块屏幕的视觉可视性。

为了实现更快的视觉响应,我们可以一次从麦克风中采集 64 个新的音频样本(而不是等待那 256 个新音频样本),并将它们与先前最新的 192 个(256-64)样本在每个循环中相结合。在 16 kHz的采样率下,我们将有 64/16000秒来执行所有计算并更新显示。这样一来,每一次迭代就只需4毫秒了。

我们将使用 Pico 专属麦克风库 microphone-library-for-pico 从数字麦克风捕获数据。
Arm 的 CMSIS-DSP 库 将被用于实时处理音频数据。

CMSIS-DSP 针对 Arm Cortex-M 处理器 进行了优化,包括基于 Raspberry Pi Pico 的RP2040 微控制器(MCU)的 Arm Cortex-M0+。Pico 的 ST7789 库将用于驱动 ST7789 TFT 显示器的输出。

硬件设置

将公头焊接在你的树莓派 Pico 板,Adafruit PDM MEMS 麦克风扩展板和带有 micro SD 卡扩展板的 2 英寸320x240 彩色 IPS TFT 显示器上,以便将它们插入面包板中。有关将 GPIO 引脚焊接至树莓派 Pico。

待两者被焊接好后,请将它们放置在试验板上,并按下图所示设置接线。

布线设置的表格图

+---------+-------------------+     +---------+-------------------+
| PDM Mic | Raspberry Pi Pico |     | ST7789  | Raspberry Pi Pico |
|---------+-------------------|     |---------+-------------------|
|    3V   |        3V3        |     |   VIN   |        3V3        |
|---------+-------------------|     |---------+-------------------|
|    GND  |        GND        |     |   GND   |        GND        |
|---------+-------------------|     |---------+-------------------|
|    SEL  |        GND        |     |   SCK   |      GPIO18       |
|---------+-------------------|     |---------+-------------------|
|    DAT  |       GPIO2       |     |   MOSI  |      GPIO19       |
|---------+-------------------|     |---------+-------------------|
|    CLK  |       GPIO3       |     |   CS    |      GPIO17       |
+---------+-------------------+     |---------+-------------------|
                                    |   RST   |      GPIO21       |
                                    |---------+-------------------|
                                    |   D/C   |      GPIO20       |
                                    +---------+-------------------+

完成后,你的面包板应该是这样的。

设置 Pico SDK 开发环境

首先需要使用 Raspberry Pi 的 Pico SDK 和所需的工具链设置你的电脑。参考:
https://datasheets.raspberrypi.org/pico/getting-started-with-pico.pdf

本指南的第 2.1 节可以被用于所有的操作系统。下面是各系统的专属操作章节。

  • Linux:2.2章节

  • macOS:9.1章节

  • Windows:9.2章节

获取和编译 Pico-audio-spectrogram 应用

确保 PICO SDK 环境变量已设置。

export PICO_SDK_PATH=/path/to/pico-sdk

在终端窗口中克隆git存储库并更改目录

cd ~/ 
git clone --recurse-submodules https://github.com/ArmDeveloperEcosystem/audio-spectrogram-example-for-pico.git
cd audio-spectrogram-example-for-pico

创建生成目录并将目录更改为:

mkdir build
cd build

运行camake和make并进行编译:

cmake .. -DPICO_BOARD=pico
make

按住主板上的 BOOTSEL 按钮,同时使用 USB 电缆将主板插入你的电脑中。

将 audio_spectrogram.uf2 文件复制到已安装的树莓派 Pico 引导的 ROM 磁盘:

cp -a audio_spectrogram.uf2 /Volumes/RPI-RP2/.

测试一下

你现在可以试着发出一些声音,比如说几个不同的单词,并在频谱图上看看会显示出什么。

以下是发出“yes”一词在显示屏上的显示的样式。

同样的,这是发出“no”一词在显示屏上显示的样式

“ESC-50:环境声音分类数据集”中的各种声音示例如下图所示:

总结

本指南介绍了如何使用一个带有外部数字麦克风和带 TFT LCD 的 Raspberry Pi Pico 板制作实时音频频谱图可视化工具。开始时,本项目使用了 Pico 专属麦克风库 使麦克风一次捕获64个音频样本,之后又使用 Arm 的 CMSIS-DSP 库 将音频样本转换为频谱图。

最后使用 Pico 的 ST7789 库一次一行的显示在 TFT LCD显示屏上。

你可以在项目的文件库中下载到本项目的代码:
https://make.quwj.com/project/471