🎧 数字音频-基础
本文件涵盖音频信号采集、播放、处理、PCM格式、FFT关系等嵌入式音频开发入门知识。
1. 声音是如何采集的
声音采集流程:
[模拟声音波形] ↓ 麦克风(模拟信号) ↓ ADC(模数转换) ↓ 数字采样数据(PCM) ↓ MCU/DSP读取,保存为数组
- 麦克风:将声音转为电压信号(模拟)
- ADC:模数转换,将电压变为数字(一般为 int16)
- 采样率:如 16kHz 表示每秒采样 16000 次
- 数组存储:每个采样点保存在
int16_t
类型数组中(通常在DMA)
示例:
int16_t audio_buffer[16000]; // 采集1秒音频(采样率16kHz)
2. 音频播放与解码
音频播放不仅仅是“输出数组”,通常涉及格式解码。
播放流程:
[音频文件(MP3/AAC/WAV)]
↓ 解码器(如 libmad, minimp3)
↓ PCM 音频样本(数组)
↓ DSP处理(可选:EQ/混响)
↓ DAC(数模转换)
↓ 扬声器
- MP3、AAC 是压缩格式,无法直接播放
- 解码器 将其解码成 PCM 格式
- 解码后才可进行播放或 DSP 加工
3. PCM 是什么
PCM(Pulse Code Modulation)脉冲编码调制:
- 是最原始的数字音频格式
- 每个采样点是一个离散数值,代表当前声音波形的幅度
- 常见位深:8-bit、16-bit、24-bit、32-bit(float)
PCM 是音频领域的通用语言:
- 所有音频格式解码后都变成 PCM
- 所有音频播放、音效处理、语音识别等都依赖 PCM
4. PCM 与数组的关系
单声道 PCM 16-bit 示例:
int16_t pcm_buffer[1024]; // 每个样本是一个采样点
双声道 PCM 16-bit 示例(交错存储):
int16_t pcm_buffer[2048]; // L R L R L R ...
也有可能使用 float
存储(-1.0 ~ +1.0):
float pcm_buffer[1024];
PCM 数据一般存储方式:
方式 | 说明 |
---|---|
静态数组 | 最基础的形式,适合初学和静态音频 |
DMA Buffer | 嵌入式系统常用,用于持续采样或播放 |
环形缓冲区 | 支持连续流式处理 |
帧封装结构 | 每帧封装 N 个采样点,提高可读性 |
5. 声音加工的流程
加工一般发生在 PCM 上(采集后 or 播放前):
场景 | 加工方向 | 常见操作 |
---|---|---|
录音后处理 | 采集端 | 降噪、回声消除、FFT分析、EQ等 |
播放前处理 | 输出端 | 混响、均衡器、压限器等 |
离线文件处理 | 文件处理 | 解码、分析、特效、保存等 |
处理模块统一基于 PCM 数组做运算,典型的就是:
void apply_filter(int16_t *pcm, size_t len);
void do_fft(float *pcm_float, size_t len);
6. 采集与播放的完整通路
📥 录音链路:
麦克风(模拟) → ADC(模数转换) → 数组(PCM) → DSP处理
📤 播放链路:
音频文件(压缩) → 解码(MP3→PCM) → DSP处理 → DAC → 扬声器
无论输入或输出,所有的音频处理都是在 PCM 阶段进行。
7. 附:常见 DSP 应用模块
模块 | 功能概述 |
---|---|
FFT频谱分析 | 频域能量分布分析(频谱图、语音识别前处理) |
均衡器 EQ | 调整不同频段的增益(低音、高音) |
回声消除 AEC | 去除通话中扬声器回传的延迟信号 |
噪声抑制 NS | 降低背景噪声干扰,提高语音清晰度 |
啸叫抑制 | 防止麦克风+扬声器造成的反馈尖叫声 |
语音激活检测 VAD | 判断音频中是否有语音出现 |
📌 结论:
- PCM 是所有音频解码后的统一格式,核心是一个数组
- 声音处理(采集、播放、降噪等)全部基于 PCM 实现
- 你理解 PCM、采样、解码和数组的关系后,就掌握了音频处理的基本盘