概述
声音是模拟的连续信号,而计算机只能离散的存储。为了使得计算机具备音频的能力,必须支持连续音频信号的离散化描述,而PCM(脉冲编码调制)具备这个能力。
为了将音频信号数字化,主要会做这三件事,分别是采样、量化和编码。
采样
所谓采样就是在时间轴上对信号进行数字化。根据奎斯特定理,按比声音最高频率高两倍以上的频率对声音进行采样(AD转换),对于高质量的音频信号,人耳能够听到的范围为10Hz~20kHz,所以一般的采样率为44.1kHz,就是说1秒会采样44100次。
量化
量化是指在幅度轴上对信号进行数字化。
编码
编码就是按照一定格式记录采样和量化后的数据,比如顺序存储或压缩存储等。
PCM脉冲编码调制(Pulse Code Modulation)
脉冲编码调制就是把一个时间连续,取值连续的模拟信号变换成时间离散,取值离散的数字信号后在信道中传输。脉冲编码调制就是对模拟信号先抽样,再对样值幅度量化,编码的过程。我们通常说的音频裸数据格式就是脉冲编码调制(PCM)数据。
PCM基础概念
1. 声道
录制和播放时,音频信号的数量。
2.采样率
每秒从连续信号中提取并组成离散信号的采样个数,单位是赫兹(Hz)。
3.采样深度
量化的二进制位数,常为16位。
4.码率
音频流每秒的大小,单位常用bps;一个采样率为44.1KHz,采样大小为16bit,双声道的PCM编码的文件,码率为 44.1K×16×2 =1411.2 Kbps。
PCM数据操作
了解完PCM的相关概念后,再来看看PCM相关的数据操作。
1.PCM混合
重采样,对位相加,溢出处理。
2.单声道变立体声
增加声道,复制数据。
3.立体声变单声道
减少声道,声道混合或只取其一。
4.音量调整和静
改变量化值,对数优化,清零静音。
5.播放速率调整;
快放:相邻位合并,缩减长度。
慢放:长度增加,量化值不变。
PCM数据的操作,就是直接操作音频流数据,比如一个简单的音量变大操作:
int16_t *curData = (int16_t *)ioData->mBuffers[0].mData;
int size = ioData->mBuffers[0].mDataByteSize;
// 音量操作
for (int pos = 0; pos < size; pos += 2, ++curData) {
int data = *curData;
{ // 音量调整
data = data * 2;
// 溢出
if (data > 32767) {
data = 32767;
}
else if (data < -32768) {
data = -32768;
}
}
*curData = data;
}