1. PCM(脉冲编码调制)
- 定义:
PCM(Pulse Code Modulation)是未经压缩的原始音频数据格式,直接记录声音的数字化采样值。
核心参数:
采样率(如16kHz):每秒采集声音的次数
位深度(如16bit):每个采样点的精度
声道数(单声道/立体声) - 示例:
一段16bit单声道PCM数据的二进制表示:
0x01A3 0xFF2B 0x7F00 …(每个值对应一个采样点)
2. WAV(波形音频文件格式)
- 定义:
WAV是微软开发的容器格式,用于存储音频数据。 - 特点:
包含文件头(描述音频参数) + 音频数据(通常为PCM)
支持多种编码格式(但最常用PCM)
未压缩时文件较大
WAV文件结构:
[RIFF头] [fmt子块] [data子块]
│ │ └── 实际音频数据(PCM)
│ └── 采样率、位深等参数
└── 文件总大小标识
3. PCM与WAV的关系
特性 | PCM | WAV |
---|---|---|
本质 | 原始音频数据流 | 带元数据的文件容器 |
文件头 | 无 | 包含格式描述(44字节头部) |
文件大小 | 仅音频数据大小 | 头部+音频数据(比PCM大44字节)) |
播放兼容性 | 需手动指定参数 | 可直接被播放器识别) |
- 转换关系:
PCM数据 + WAV头信息 → 生成WAV文件
WAV文件 - WAV头信息 → 得到原始PCM数据
4. 在嵌入式系统中的关键点
假设通过网络模块调用百度语音合成的API时返回的WAV数据处理:
需跳过前44字节的WAV头,提取后续PCM数据
从头中解析采样率、位深(用于配置I2S时钟)
- 示例:WAV头解析(关键字段)
typedef struct {
uint32_t sampleRate; // 如16000
uint16_t bitsPerSample; // 如16
uint16_t numChannels; // 如1(单声道)
} WAV_Header;
如果需要使用片上IIS外设及MAX98357模块播放:
在解析WAV数据后,直接通过I2S发送解析出的PCM数据(无需头信息)
需确保I2S配置与PCM参数匹配:
- STM32的I2S配置示例(16kHz, 16bit, 单声道)
hi2s2.Init.AudioFreq = I2S_AUDIOFREQ_16K;
hi2s2.Init.DataFormat = I2S_DATAFORMAT_16B;
调试技巧:
用Audacity等工具验证PCM数据:
文件 → 导入 → 原始数据 → 选择格式(16bit PCM,单声道)
5. 总结
PCM是"裸数据",WAV是"带说明书的盒子"
在嵌入式音频开发中:
WAV用于传输和识别 → PCM用于实际播放