作者毕业于EE专业,这是一个出于兴趣制作的该专业的毕设项目,仅存档供留存思路。 仅自留以及供学习目的复现使用,无许可协议,禁止商用,无作者书面授权禁止提交至任何平台或作为作业提交。
用一句话来说:这个项目把一块小电路板变成了一台能听声音、分析声音、并把分析结果实时传到网页上的仪器。
想象一下这样一个场景:你对着一个麦克风说话或唱歌,同时在电脑浏览器里打开一个网页,网页上的图表会实时显示你的声音是什么频率、有多响、频谱长什么样——就像一个迷你版的"音频示波器"或者"频谱分析仪",只不过这一切都跑在一块比手掌还小的开发板上。
[你的嘴/声音]
↓
[麦克风模块 MAX9814] ← 把声音振动变成电压信号
↓ 一根导线
[STM32 开发板] ← 项目的大脑,做所有运算
↓ 另一根导线
[ESP8266 Wi-Fi 模块] ← 负责把数据发到网上
↓ Wi-Fi
[互联网上的 MQTT 服务器] ← 消息中转站(类似一个邮局)
↓ 浏览器访问
[网页仪表盘] ← 你在屏幕上看到的图表
| 器件 | 通俗解释 |
|---|---|
| STM32 Nucleo-L476RG | 这个项目的核心大脑,是一块开发板,上面有一颗 ARM 芯片,运行我们写的 C 代码。它的处理器和手机里的 ARM 处理器是同一家公司设计的,但更简单、更省电,专门用于嵌入式应用。 |
| MAX9814 麦克风放大器 | 普通麦克风输出的电压信号非常微弱(毫伏级),直接接电路板根本读不准。MAX9814 会把它放大 60 倍以上,变成 0~3.3V 范围的电压,让开发板的 ADC(模拟转数字)能清楚地读取。它还有自动增益控制功能,声音太大时自动调小增益,防止失真。 |
| ESP8266-01S | 一块极小的 Wi-Fi 模块,里面有完整的 Wi-Fi 和 TCP/IP 功能。我们的开发板通过串口给它发指令,它负责连 Wi-Fi、联网、把数据发到服务器上。 |
| 代码文件 | 语言 | 作用 |
|---|---|---|
Core/Src/main.c |
C 语言 | 全部核心逻辑:采集声音、分析声音、发送数据 |
web/index.html |
HTML + JavaScript | 浏览器里的仪表盘网页 |
声音在这个项目中经历了一条完整的处理流水线,可以理解为一条工厂生产线:
麦克风把声音变成随时间变化的电压(类比成一条起伏的曲线)。开发板上有一个叫做 ADC(模数转换器) 的硬件,以每秒 44055 次的速度(和 CD 音质 44100 Hz 差不多)对这个电压进行"拍照",每张照片记录一个 0~4095 之间的数字(12 位精度)。
类比: ADC 就像一个超高速摄影机,每秒拍 44055 张"电压照片",把连续的声音信号变成一串数字。
拍照完的数字需要存起来再处理。如果让 CPU 亲自去搬,每秒搬 44055 次,CPU 就什么别的事都干不了了。这里用了一个叫 DMA(直接内存访问) 的硬件,它就像一个自动传送带,CPU 不用管,数据自动从 ADC 搬到内存里。
装满 1024 个数据(约 23 毫秒)后,DMA 会发出一个中断信号通知 CPU:"好了,可以处理了!"然后 DMA 继续装下一批数据,CPU 同时处理这一批。这叫双缓冲(Ping-Pong)——两个存储槽轮流使用,保证声音一帧不漏。
这是整个项目最核心的部分,用了三种数学算法:
FFT 是信号处理里最著名的算法。它回答这个问题:这 1024 个声音采样点里,有哪些频率的声音?各自有多强?
通俗类比: 你面前有一锅菜汤,FFT 能告诉你这锅汤里有多少克盐、多少克糖、多少克辣椒——把混合信号分解成各频率成分。
本项目做的是 1024 点 FFT,得到 512 个频点,每个频点间隔约 43 Hz。分析结果叫"频谱",就是网页上那个彩色柱状图。
滤波器的作用是只让特定频率范围内的声音通过,其余的挡住。
类比: 就像水龙头上的过滤器,只让干净的水通过,把杂质挡住。
本项目的低通滤波器截止频率是 4000 Hz,意思是:4 kHz 以下的声音正常通过,4 kHz 以上的高频部分被大幅衰减。这模拟了电话语音的频带(人声主要集中在 300 Hz ~ 3.4 kHz)。
开启滤波器后,你可以在网页的频谱图上明显看到高频部分(蓝色/紫色的柱子)变矮,这就是滤波效果的直观验证。
RMS(均方根)是衡量声音响度的标准方法:
简单来说就是:把所有采样值平方、求平均、再开根号。值越大,声音越响。网页上的进度条就反映这个值。
每秒一次,开发板把分析结果(主频、响度、频谱数据)打包成一段 JSON 文字,通过 ESP8266 发到互联网上一个叫 MQTT 服务器的地方。
类比: MQTT 就像一个消息群组。开发板往"audio_dsp/data"这个群里发消息,网页也加入了这个群,一收到消息就更新图表。
浏览器里的网页用 JavaScript 订阅 MQTT 消息,每收到一条就更新图表。用的是两个流行的 JS 库:
- MQTT.js:负责连接 MQTT 服务器和接收消息
- Chart.js:负责画图表
这个开发板用的 ARM Cortex-M4 处理器有两个特殊硬件:
- FPU(硬件浮点单元):专门做小数乘法,比软件模拟快 10 倍以上
- DSP 指令集(SIMD):一条指令同时处理多个数据
本项目用的 CMSIS-DSP 库(ARM 官方提供)底层正是利用了这两个硬件特性,使得 1024 点 FFT + FIR 滤波的全套计算在不到 5 毫秒内完成,实现了真正的"实时"处理。
如果用没有 FPU 的普通芯片(如 Cortex-M0)做同样的运算,可能需要 50~100 毫秒,根本做不到实时。
DMA + Ping-Pong 双缓冲是嵌入式实时音频处理的经典架构。它保证了在 CPU 做 FFT 运算的同时,声音采集一帧也不会丢,这是系统"实时性"的根本保证。
网上有很多 MQTT 库可以直接用,但本项目选择按照 MQTT 3.1.1 协议规范,手动拼接二进制数据包。这就好像别人用微信发消息,而你自己实现了微信的底层通信协议——技术难度更高,但也充分体现了对协议底层的理解。
从麦克风拾音 → STM32 处理 → ESP8266 发送 → 互联网服务器 → 任何地方的浏览器显示,这是一个完整的物联网(IoT)系统,覆盖了从硬件到嵌入式软件再到云端和前端的完整技术栈。
Q: 为什么选 STM32L476RG,而不是更简单的 Arduino?
A: 因为 L476RG 搭载 ARM Cortex-M4,有硬件 FPU 和 DSP 指令集,能实时处理 44 kHz 的音频信号。Arduino 用的 ATmega328 没有浮点硬件,做 1024 点 FFT 会非常慢,无法满足实时要求。
Q: 为什么采样率选 44055 Hz?
A: 根据奈奎斯特定理,采样率必须大于信号最高频率的两倍。人耳能听到最高约 20 kHz,所以采样率需要超过 40 kHz。44055 Hz 是由硬件定时器(TIM3,ARR=1814)精确计算得出的实际采样率,接近标准 CD 音质的 44100 Hz。
Q: FFT 为什么要加窗(Hanning Window)?
A: 对有限长度信号直接做 FFT,相当于在信号两端突然截断,会产生"频谱泄漏"——一个单频信号在频谱上会"漏出"到相邻频点,看起来像有很多杂散频率。加 Hanning 窗能把信号两端平滑到零,大幅减少频谱泄漏,使频谱分析更准确。
Q: FIR 和 IIR 滤波器有什么区别?为什么选 FIR?
A: FIR(有限冲激响应)滤波器的系数是固定的有限个,具有线性相位特性(各频率分量的延迟完全一致),不会导致声音失真。IIR 有反馈结构,效率更高,但有相位非线性问题且理论上可能不稳定。对于音频质量要求较高的场景,FIR 更合适。
Q: 怎么验证 DSP 算法是否正确?
A: 项目内置了软件正弦波振荡器(1 kHz),可以生成已知频率的测试信号代替麦克风输入。运行后 FFT 应在约 1001 Hz 处显示单一峰值,RMS 应为 0.707(= 1/√2,这是单位正弦波的理论 RMS 值)。这种自测方法无需外部仪器,直接在代码层面验证算法正确性。
Q: MQTT 是什么,为什么选它?
A: MQTT(消息队列遥测传输)是一种专为 IoT 设计的轻量级消息协议。它比 HTTP 的数据包小得多,且采用"发布/订阅"模式(设备发布消息到 Broker,浏览器订阅 Broker 获取消息),非常适合资源受限的嵌入式设备与云端通信。
Q: 这个系统和"远程医疗辅助诊断"有什么关系?
A: 心音、肺音、语音等医学音频信号的频谱特征(主频、谐波分布)是辅助诊断的重要依据。本系统实现了音频的实时频谱分析和远程数据传输,理论上可以把采集端部署在患者侧,医生通过 Web 仪表盘远程查看音频频谱特征,这正是项目背景中"远程辅助医疗诊断"场景的技术基础。
| 类别 | 具体技术 |
|---|---|
| 硬件平台 | STM32 Nucleo-L476RG(ARM Cortex-M4 @ 80 MHz) |
| 嵌入式框架 | STM32 HAL 库,STM32CubeMX 图形化配置 |
| DSP 库 | ARM CMSIS-DSP(官方 DSP 加速库) |
| DSP 算法 | 实数 FFT(1024 点)、FIR 低通滤波(29 阶)、RMS 计算 |
| 通信协议 | MQTT 3.1.1(手动实现),AT 指令集(ESP8266 控制) |
| IoT 基础设施 | HiveMQ 公共 MQTT Broker |
| 前端技术 | HTML5 / CSS3 / JavaScript |
| 前端库 | MQTT.js(MQTT WebSocket 客户端)、Chart.js v4(图表) |
| 开发工具 | STM32CubeIDE、VS Code + Live Server 插件 |
| 编程语言 | C(固件)、JavaScript(Web 端) |