Skip to main content

🎧 数字音频-基础

本文件涵盖音频信号采集、播放、处理、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、采样、解码和数组的关系后,就掌握了音频处理的基本盘