音频编码基本原理1
音频信号的冗余信息
数字音频信号如果不加压缩地直接进行传送,将会占用极大的带宽。例如,一套双声道数字音频若取样频率为 44.1KHz,每样值按 16bit 量化,则其码率为:
2 x 44.1 kHz x 16 bit = 1.411 Mbit/s
如此大的带宽将给信号的传输和处理都带来许多困难,因此必须采取音频压缩技术对音频数据进行处理,才能有效地传输音频数据。
数字音频压缩编码在保证信号在听觉方面不产生失真的前提下,对音频数据信号进行尽可能大的压缩。数字音频压缩编码采取去除声音信号中冗余成分的方法来实现。所谓冗余成分指的是音频中不能被人耳感知到的信号,它们对确定声音的音色,音调等信息没有任何的帮助。
冗余信号包含人耳听觉范围外的音频信号以及被掩蔽掉的音频信号等。例如,人耳所能察觉的声音信号的频率范围为 20Hz~20KHz,除此之外的其它频率人耳无法察觉,都可视为冗余信号。此外,根据人耳听觉的生理和心理声学现象,当一个强音信号与一个弱音信号同时存在时,弱音信号将被强音信号所掩蔽而听不见,这样弱音信号就可以视为冗余信号而不用传送。这就是人耳听觉的掩蔽效应,主要表现在频谱掩蔽效应和时域掩蔽效应。
静音阈值曲线
只在安静环境下,人耳在各个频率能听到声音的最低阈值。
频谱掩蔽效应
一个频率的声音能量小于某个阈值之后,人耳就会听不到,这个阈值称为最小可闻阈。当有另外能量较大的声音出现的时候,该声音频率附近的阈值会提高很多,即所谓的掩蔽效应。如图所示:
由图中我们可以看出人耳对 2KHz~5KHz 的声音最敏感,而对频率太低或太高的声音信号都很迟钝,当有一个频率为 0.2K Hz、强度为 60dB 的声音出现时,其附近的阈值提高了很多。由图中我们可以看出在 0.1KHz 以下、1KHz 以上的部分,由于离 0.2KHz 强信号较远,不受 0.2KHz 强信号影响,阈值不受影响;而在 0.1KHz~1KHz 范围,由于 0.2KHz 强音的出现,阈值有较大的提升,人耳在此范围所能感觉到的最小声音强度大幅提升。如果 0.1KHz~1KHz 范围内的声音信号的强度在被提升的阈值曲线之下,由于它被 0.2KHz 强音信号所掩蔽,那么此时我们人耳只能听到 0.2KHz 的强音信号而根本听不见其它弱信号,这些与 0.2KHz 强音信号同时存在的弱音信号就可视为冗余信号而不必传送。
时域掩蔽效应
当强音信号和弱音信号同时出现时,还存在时域掩蔽效应。即两者发生时间很接近的时候,也会发生掩蔽效应。时域掩蔽过程曲线如图所示,分为前掩蔽、同时掩蔽和后掩蔽三部分。
由图我们可以看出,时域掩蔽效应可以分成三种:前掩蔽,同时掩蔽,后掩蔽。前掩蔽是指人耳在听到强信号之前的短暂时间内,已经存在的弱信号会被掩蔽而听不到。同时掩蔽是指当强信号与弱信号同时存在时,弱信号会被强信号所掩蔽而听不到。后掩蔽是指当强信号消失后,需经过较长的一段时间才能重新听见弱信号,称为后掩蔽。这些被掩蔽的弱信号即可视为冗余信号。
压缩编码方法
当前数字音频编码领域存在着不同的编码方案和实现方式,但基本的编码思路大同小异,如图所示。
对每一个音频声道中的音频采样信号,首先都要将它们映射到频域中,这种时域到频域的映射可通过子带滤波器实现。每个声道中的音频采样块首先要根据心理声学模型来计算掩蔽门限值,然后由计算出的掩蔽门限值决定从公共比特池中分配给该声道的不同频率域中多少比特数,接着进行量化以及编码工作,最后将控制参数及辅助数据加入数据之中,产生编码后的数据流。
音频采样
真实世界中的声音都是连续的,因为声音是模拟信号。但是在计算机中存储的信息都是数字信号。所以在将声音存储到计算机之前,就必须要进行声音的数字化,转换成计算机能够存储的形式。
模拟信号转换为数字信号,一种比较通用的方法就是进行等间隔采样。根据奈奎斯特定理,采样频率至少为信号频率的 2 倍,才能无失真的保存原有的音频信号。因此采样频率的高低决定了数字信号的保真度,自然是越高越好。比如,一个周期为 1ms 的正弦信号,采两个点和采 100 个点的信号在还原成模拟信号的时候,肯定是采 100 个点信号的还原效果更好。
音频量化
量化就是把经过采样得到的瞬时值将其幅度离散,即用一组规定的电平,把瞬时采样值用最接近的电平值来表示。所谓的音频量化,就是用二进制数据来表示电平的大小。一般采用 8 位(256 级)或者 16 位(65536 级)的数据来表示。
常见的量化器有:均匀量化器,对数量化器,非均匀量化器。量化过程追求的目标是:最小化量化误差,并尽量减低量化器的复杂度(这二者本身就是一个矛盾)。
- 均匀量化器:最简单,性能最差,仅适应于电话语音。
- 对数量化器:比均匀量化器复杂,也容易实现,性能比均匀量化器好。
- Non-uniform 量化器:根据信号的分布情况,来设计量化器。信号密集的地方进行细致的量化,稀疏的地方进行粗略量化。
语音 / 音频编码算法
语音 / 音频编码算法主要有以下 6 种:
- 波形编码
波形编码是最简单也是应用最早的语音编码方法。最基本的一种就是 PCM 编码,如 G.711 建议中的 A 律或 μ 律。APCM、DPCM 和 ADPCM 也属于波形编码的范畴,使用这些技术的标准有 G.721、G.726、G.727 等。波形编码具有实施简单、性能优良的特点,不足是编码带宽往往很难再进一步下降。 - 预测编码
语音信号是非平稳信号,但在短时间段内(一般是30ms)具有平稳信号的特点,因而对语音信号幅度进行预测编码是一种很自然的做法。最简单的预测是相邻两个样点间求差分,编码差分信号,如G.721。但更广为应用的是语音信号的线性预测编码(LPC)。几乎所有的基于语音信号产生的全极点模型的参数编码器都要用到 LPC, 如 G.728、G.729、G.723.1。 - 参数编码
参数编码建立在人类语音产生的全极点模型的理论上,参数编码器传输的编码参数也就是全极点模型的参数——基频、线谱对、增益。对语音来说,参数编码器的编码效率最高,但对音频信号,参数编码器就不太合适。典型的参数编码器有 LPC- 10、LPC-10E,另外,G.729、G.723.1 以及 CELP(FS- 1016)等码激励线性预测声码器都离不开参数编码。 - 变换编码
一般认为变换编码在语音信号中作用不是很大,但在音频信号中它却是主要的压缩方法。比如,MPEG 伴音压缩算法(含著名的 MP3) 用到 FFT、MDCT 变换,AC-3 杜比立体声也用到 MDCT,G.722.1 建议中采用的 MLT 变换。在近年来出现的低速率语音编码算法中,STC(正弦变换编码)和 WI(波形插值)占有重要的位置,小波变换和 Gabor 变换在其中就有用武之地。 - 子带编码
子带编码一般是同波形编码结合使用,如 G.722 使用的是 SB-ADPCM 技术。但子带的划分更多是对频域系数的划分(这可以更好地利用低频带比高频带感觉更重要的特点),故子带编码中,往往先要应用某种变换方法得到频域系数,在 G.722.1 中使用 MLT 变换,系数划分为 16 个子带;MPEG 伴音中用 FFT 或 MDCT 变换,划分的子带多达 32 个。 - 统计编码
统计编码在图像编码中大量应用,但在语音编码中出于对编码器整体性能的考虑(变长编码易引起误码扩散),很少使用。对存在统计冗余的信号来说,统计编码确实可以大大提高编码的效率,所以,近年来出现的音频编码算法中,统计编码又重新得到了重视。MPEG 伴音和 G.722.1 建议中采纳了哈夫曼变长编码。
常见音频压缩格式对比
音频压缩格式 | 后缀名 | 算法 | 采样率 | 比特率 | 有损 | 延迟 | Windows开发库 | OS支持 |
---|---|---|---|---|---|---|---|---|
AAC | .aac, .m4a | MDCT, 混合SBC | 8 – 192 kHz | 8 – 529 kbit/s | 是 | 20 – 405 ms | FFmpeg, MF | Windows, iOS, Android, Linux, etc. |
AC3 | .ac3 | MDCT | 32, 44.1, 48 kHz | 32 – 640 kbit/s | 是 | 40.6 ms | FFmpeg | Windows, iOS, Linux, etc. |
MP3 | .mp3 | MDCT, 混合SBC | 8 - 48 kHz | 8 - 320 kbit/s | 是 | >100 ms | DShow, FFmpeg, MF | Windows, iOS, Android, Linux, etc. |
Musepack | .mpc, .mp+ | SBC | 32 - 48 kHz | 3 – 1300 kbit/s | 是 | ? | FFmpeg | Windows, Linux, etc. |
RealAudio | .ra | MDCT | 各异 | 各异 | 是 | 各异 | FFmpeg | Windows, Linux, etc. |
Vorbis (Ogg) | .ogg | MDCT | 1 Hz - 200 kHz | 可变 | 是 | >100 ms | FFmpeg | Windows, Android, Linux, etc. |
WMA | .wma | MDCT | 8 - 96 kHz | 4 – 768 kbit/s | 是 | >100 ms | DShow, MF | Windows, Android, Linux, etc. |
OPUS | .opus | LP, MDCT | 8 - 48 kHz | 6 – 510 kbit/s | 是 | 5 – 66.5 ms | FFmpeg | Windows, iOS, Android, Linux, etc. |
ALAC | .m4a | 无损 | 1 – 384 kHz | 可变 | 否 | ? | FFmpeg, MF | Windows, iOS, Linux, etc. |
FLAC | .flac | 无损 | 1 – 655 kHz | 可变 | 否 | ? | FFmpeg, MF | Windows, iOS, Android, Linux, etc. |
MDCT:改进的离散余弦变换
SBC:子带编码
LP: 线性预测
DShow: DirectShow
MF: Media Foundation
更多音频格式对比请参考 Wiki
– EOF –