音频压缩的原理


转自http://forums.dearhoney.idv.tw/viewtopic.php?t=24378


引用:
音讯资料因为其资料内容的特性,以传统的压缩法难达到很高的压缩率,不过我们人耳并没有无限的时间解析度和频率解析度,其实原始的音乐讯号中包含了很多我们听不到的资料,把这些对我们来讲其实无意义的资讯给去掉,这样就可以达到很高的压缩率。这种利用人类 感官知觉的特性作的失真压缩法,就叫做 perceptual coding。
人耳的生理结构,由外耳的耳壳收集外界的声波到达中耳的耳膜产生震动,经由三块小骨连接前庭窗传入内耳,其中由於耳壳的内凹形状,外耳道的长度和宽度.. 等等生理的构造,会对不同频率产生共振升压的效果,尤其是 2~5Khz 的频率,会在这个过程中被放大。人耳听觉频率的范围,大约是 20~20KHz,音量范围则是 130dB SPL,大於 130dB 会产生痛苦的感觉,小於 0dB 则会被当成是静音。如上所述,人耳对 2~5KHz 的频率最敏感,越往高频感觉越不敏锐,音量要超过一定的界限以上查能被我们人耳察觉,这个最低可以听闻的界限,叫做 ATH(absolute threshold of hearing)。内耳的耳蜗有许多绒毛细胞,分别会对不同的频率产生反应,将基底膜淋巴液的波动转换成神经的电流讯号,传达给大脑。也就是说耳蜗的作用就像一个频谱分析仪,把声波转换成不同频率的讯号,每一个特定位置的绒毛细胞会受特定频率的刺激,但是当基底膜传导波动时其邻近周围的绒毛细胞也会受到刺激。这也就是说如果有一个频率的音量很大,在它附近同时有一个比较弱的频率的话,比较弱的频率的声音就会被比较强的声音给遮蔽掉,我们人耳没有办法分办出有另一个比较弱的频率的声音存在。这个遮蔽的作用叫 frquency masking。另外从基底膜受到声音震动到达稳定状态,还有声音结束后完全停止,中间都需要一段时间。所以如果有一个很大声的声音出现,在这个声音开始之前,到这个声音结束之后,有一段时间我们是听不到其他声音的,这种遮蔽效应,我们称为 temporal masking,之前的叫 pre-masking,之后的叫 post-masking。
前面提到耳蜗就像一部频谱分析仪,或者说像一个 band pass filter,会把声音分成许多不同的次频带,每个频带里都有一个中心频率,越往两边遮蔽的效果就越弱,在同一个频带里面的频率会互相影响,我们对他们的感知特性也十分的接近,这种人耳知觉特性的频带,我们称为 critical band。critical band 的宽度并不是都相等的,低频的部分比较窄,高频的部分则比较宽,总共分成 26 个 critical band。
除了人耳的生理结构特性以外,大脑的作用也占了一个很重要的角色。我们都知道音高是由基音决定,而音色是由泛音决定,我们很惊讶的发现,人类的大脑会自动补上基音,即使这个基音并不存在。譬如说电话的频宽只有 300~3200Hz,但是当我们听一个基音在 120Hz 的男性讲电话的时候,我们还是可以听出他的正确的音高,不会把男生听成女生。大脑是如何运用复杂的计算去重建这个不存在的基音,我们目前尚无法得知。

经过长期的实验和观察,我们可将人耳的听觉特性定性,建立一个人耳的听觉模型,叫做 psychoacoustic model。有了这些对人耳知觉特性的了解,我们就可以根据这些理论来压缩音讯资料,把我们听不到的声音去掉。
说是去掉,实际上是怎麼做的呢?
要将无限的连续的类比讯号转变为有限的离散的数位资料,中间必须经过取样和量化的手续。譬如说现在量化的位阶只有 0~8 九个数字,每一个位阶的间隔大小是一格,对一个 4.9 的讯号作量化,得到的数字是 5,和原来 4.9 相差 0.1,这个误差叫做量化噪音。假设我们把量化的位阶减少到 5 个,分别等於原来 0~8 的 0, 2, 4, 6, 8 这几个数字,位阶的间隔大小扩大变成二格,此时再对 4.9 量化,量化的结果是 4,误差扩大到 0.9,也就是说量化的位阶越少,量化的间隔就越大,量化噪音也就越大。
我们做一个实验,把 16bit 的声波档转为 8bit,当场丢掉一半的资讯,档案也就小了一半,最简单的失真压缩不过我们观察频谱发现,减少量化的 bit 数产生的量化噪音,会造成全频带都水平上升一定杂讯,你如果听这个 8bit 的声波档,会发现背景充满沙沙沙的噪音,这就是因为量化误差产生的量化噪音。
那我们会想,这样全频带都减少一定的 bit 数太没有效率,为什麼不把他分成好几个频带(critical band),再根据人耳的心理声学模型的遮蔽效应,对不同频带分配不同的 bit 数,让各个频带产生的量化噪音低於遮蔽效应的曲线以下,这样这些产生的量化噪音我们就听不到,对知觉来说等於是无失真压缩,这样岂不更好?

所以我们就把压缩的工作分成两个部分,一个部分将原来的 PCM data 经过 band pass filter 分成好几个 subband 次频带,另一个部分就是心理声学模型,分析频谱,找出遮蔽效应的曲线,然后根据这个曲线,对每个 subband 分别量化,决定分配的 bit 数,让产生的量化噪讯低於遮蔽效应的曲线,使量化的失真不会被人耳听到,这样就大功告成了

然后接下来要说的就是这个最复杂的心理声学模型是怎麼工作的.... ^^;

怎麼讲一讲变成这麼长 ^^;;
都还没进入主题...
我是要解释什麼是 scale factor,这个牵扯到量化的过程,还有 short block 和 long block,这个牵扯到心理声学模型的判断和 MDCT window 大小的转换,主要目的是解决 pre-echo 的问题,结果越讲越多... ><
看的人就忍耐一下吧... -_-;;;

前面说到心理声学模型是如何工作的。ISO MPEG1 Audio 提供了两个心理声学模型,分别是 psychoacoustic model 1 和 2,model 2 比 model 1 要来得复杂,但是判断的效果较好。两个声学模型可以用在任何一个 layer,layer 1~3(MPEG1 layer 3 = MP3)。不过我们通常是将 model 1 用在 MP1 和 MP2,model 2 用在 MP3。不过当然也有例外,譬如说有一个特殊版本的 toolame(压 MP1, MP2 最好的 encoder)就是改用 model 2 的心理声学模型而不用 model 1。
MPEG1 Audio 压缩的时候一边是用一个 polyphase filter bank,将 PCM data 分成好几个"等宽的" subband 等待进一步量化压缩,一边是 psychoacoustic model,使用 512(MP1)或 1024(MP2/MP3)point(取 512/1024 个 sample 计算,或者说 window size=512/1024)的 FFT 转换,将 PCM data 转换到频率域,进行频谱分析。之所以另外使用 FFT 来分析,是因为 FFT 有比较好的频率解析度,计算各个频率的遮蔽效应时会比较精确。然后 psychoacoustic model 会将频率按照 critical band(人耳听觉特性的频带)分为好几组,计算各个 critical band 的遮蔽曲线。在计算遮蔽曲线时,第一件要做的工作是区分哪些频率的声音是 tone,哪些频率的声音是 noise。为什麼要这麼区分呢?因为根据实验发现这两种声音的遮蔽能力不一样,noise 具有比 tone 更强的遮蔽效应。这边会提到两个名词,一个是 TMN(Tone Mask Noise),tone 遮蔽 noise 的能力,单位是 dB,比较弱,另一个是 NMT(Noise Mask Tone),noise 遮蔽 tone 的能力,比较强。这两个名词很眼熟吗?MP+/MPC 就有提供让使用者修改这两个参数的设定。调降这两个参数,会减低 tone 和 noise 的遮蔽能力,整个遮蔽曲线会往下降,可以容忍的量化噪音就比较低,量化噪音必须减少,分配的 bit 数就必须增加,所以 MP+/MPC 调低这两个参数,bitrate 会往上窜升,但是量化杂讯也会随之减少。

在判断哪些声音是 tone,哪些声音是 noise,model 1 和 model 2 采用不同的方法。model 1 是寻找区域范围内,音量最大的频率,把这个频率当作 tone,因为 tone 通常是一定的区域范围内音量最大的。其他剩下的部分就当成是 noise,加起来以一个单一的频率代表。
model 2 的作法则不是去区分 tone 和 non-tone(noise),而是给每个频率一个 tone index,由 0~1,index 数字越大,代表这个频率越像 tone,根据这个 index 的比例大小,分别计算他们的遮蔽影响力,这样是不是更精确呢。那要怎麼判断某个频率有多像 tone 呢? model 2 是用 predict 的方法。predict 的意思是以现在的状态,去预测下一个状态是什麼。在这里 model 2 会储存过去的两个分析过的 window 频谱,根据频谱的变化,来判断哪些频率有多像 tone。因为 tone 的声音会具有可预测性,前后的变化会有高度的关联性,不会随机的杂乱跳动。根据前后的频谱变化,model 2 更可以准确的分办出 tone 和 noise。

找出 tone 和 noise 以后,接著把不重要没有意义的 tone/noise 去掉,譬如说两个 tone 靠近,一强一弱,或是低於 ATH 绝对听觉极限以下的 tone/noise,都可以把他去掉。然后计算剩下来的 tone/noise 的遮蔽效应,求出每个 critical band 的遮蔽曲线,最后在合并这些曲线,找出全体的遮蔽曲线。
实际上 psychoacoustic model 会计算一个数值,然后把这个数值传给量化阶段的程式,让量化阶段的程式知道这个频带可以允许的量化噪音是多少,该分配多少的 bit 数。这个传给量化程式的参数叫做 SMR(Signal to Mask Ratio)。
很眼熟的名词对不对
SMR=SNR-NMR
MP+/MPC/Lame 可以让你自行设定 minimum SMR 的底线是多少。
前面提过,MPEG1 Audio 在分成好几个 subband 准备做量化的时候,用的是"等宽"的 filter bank,这和我们人耳特性的 critical band 不同,由下图可以看出,低频的部分一个 subband,包含了好几个 critical band。到了高频的时候,好几个 subband 包含在一个 critical band 里面。这样心理声学模型计算出来的各个 critical band 的 SMR 要怎麼给呢?
model 1 是取 subband 涵盖的范围中,最小的 SMR。这麼做在低频的时候,会将好几个 critical band 的 SMR 取其最小的一个给 subband,因为 subband 包含了好几个 critical band,如果用这几个 critical band 中最大的 SMR,将会有部分频率的遮蔽效应会估计错误,所以为了妥协,只好取最小的。高频的时候则是好几个 subband 共用一个 SMR。model 1 有一个致命伤,就是高频的时候,前面我们说过 model 1 每个 critical band 的 noise 是以一个总和集中的频率代表,现在这个 critical band 横跨好几个 subband,以这个中央代表的 noise 频率计算出来的 SMR,就无法适用在每个 subband 里面。(距离中央越远的就越不正确)
model 2 低频的时候取最小的 SMR,和 model 1 一样,高频的时候则是取 critical band 好几个 SMR 的平均值给 subband。model 2 不用集中式的 noise,而是用 tone index 的方式来计算 tone 和 noise 的遮蔽效应,所以在高频的时候会比 model 1 精确。

好了,心理声学模型不能再讲下去了,头晕了... @_@

图... 有机会再补 ^^;

终於进入主题了:MDCT 和 Quantization(量化)。
前面提到我们将 PCM data 分成好几个 subband 等待心理声学模型的判断,做进一步的量化压缩,这种压缩法我们叫做 subband coding。这个 filter 我们用的是 polyphase filter bank,将 PCM data 分成 32 个等宽的 subband。这个 ployphase filter bank 有几个缺点:
1. 它是有失真的 filter,也就是说,还没有做会失真的量化步骤,经过 filtering 以后的 subsample 立刻将它还原回 PCM data,结果就已经和原来不一样了。不过这个失真很小(小於 0.07dB)所以对品质不会有太大的伤害。
2. 它是等宽的频带,不符合人耳听觉特性的 critical band,对后续量化阶段的处理不利
3. 它的截止点平缓,所以当输入频率很靠近截止点的时候,相邻的两个 subband 会发生 aliasing(或者说 overlap,.....请看图...有机会再补....-_-;;)

MP1 一个 frame 384 个 sample,MP2 和 MP3 用 1152 个 sample,而且 MP3 会将 polyphase filter bank 切出来的 32 个 subband 的 sample,再用 MDCT 转换,进一步划分成更细的频带,提高对频率的解析度。这个将原本资料转换到另一个空间之后再进行压缩的方法,我们称为 transform coding。因为MP3 混合了 subband filterbank 和 MDCT,所以我们把 MP3 的这个 filtering 的过程称为 Hybird Filterbank。
MDCT 之后,可以运用 butterfly 的计算,消除 polyphase filter bank 产生的 aliasing。
不过成也 MDCT 败也 MDCT,经过这个 MDCT 转换之后,资料会完全丧失时间的资讯。什麼是丧失时间资讯?我们回头来说 FFT。
做 FFT 计算的时候,window size 越大(取进来计算的 sample 越多),对频率的分解能越强,频率的计算越精确。但是这些 PCM data 的 sample 是照时间排列的,对 44.1KHz 的 PCM 一次取 32768 个 sample 进来计算,如果不用 overlap,则你的频率解析度(ie. spectral line resolution)是 1.346Hz,而时间解析度只有 1sec * 32768/44100 = 743.04msec,你看不到小於 735.61msec 的频率变化的过程。频率解析度和时间解析度两个量无法同时求得精确的值,时间越精确(取进来计算的 sample 越少),频率解析就越差,频率越精确(取进来计算的 sample 越多),时间解析就越差。
MP3 经由 polyphase filter bank 之后转 MDCT 的过程如下
1. 1152 个 PCM sample 分成两个部分,各 576 个 sample,称为一个 granule。
2. 这 576 个 sample 送进 polyphase filter bank,输出 32 sample(按频率顺序)x 18 组(按时间排序)
3. 重排为 18 个 sample(按时间排序)x 32 组(按频率排序)
4. 每一组中的 18 个 sample 为时间顺序,加上前面一次转换的 18 个 sample,总共 36 个 sample 送进去做 MDCT 转换(所以 MDCT window 有 50% 的 overlap 重叠)
5. 转出来为 18 个 sepctral line(按频率排序)x 32 组(按频率排序)

好复杂吗? ^^;
总之 MDCT 转换完以后,时间资讯就不见了(每一个都是 spectral line,都是频率资讯,不过频率资讯更细了)。
丢掉时间资讯会有什麼影响呢?
假设现在转换的这一块声音区块前面是很微弱的声音,到后面突然出现音量急遽升高的情形,譬如说鼓手突然开始打鼓,这种波形我们称为「attack」:突然拉起的波形。遇到这种情况心理声学模型会很笨的认为这个区块里面有很强的 masker,可以提供很高的遮蔽曲线,所以可以允许较大的量化失真,因此量化的步骤就会给比较少的 bit。MDCT 一次转换就是取 576 个 sample,这个 block 的长度,同时也就是时间的长度,所以一次死就死全部的 block,量化失真产生的 noise 会扩散到整个 block 的长度范围(也就是时间范围),所以前面声音很微弱的区段,也会发生这些量化噪音,想当然尔,原来微弱的音量根本无法遮蔽掉这些量化噪音,如果后面大音量区段的 pre-masking 前遮蔽曲线也不够遮蔽这些 noise,我们就会听到这些量化噪音了,那麼心理声学模型也就破功了。
这种压缩瑕疵叫做 pre-echo。

这个道理类似 JPEG 图档的压缩瑕疵,JPEG 一次转换是拿 8x8 的区块去做 DCT 转换,遇到区块内包含锐利的边缘、线条(有很多的高频成分)的时候,经过 DCT 转换,高频的量化失真会扩散到整个 8x8 的像素区块,所以我们常常看到 JPEG 或 MPEG 档案画面上锐利线条的周围(譬如说文字的周围)会有那种斑斑点点,破碎的压缩瑕疵,这就是因为一次死死全部,整个区块都完蛋的关系。

MP+/MPC 因为不用 transform coding,不做 MDCT 转换,所以他的 pre-echo 的问题比较小,观察 MPC 压出来的波形,几乎看不到 pre-echo 的压缩瑕疵。
一个相反的例子,MPEG2 AAC/MPEG4 AAC 完全不用 subband filterbank,直接做 MDCT 转换(前置有一个 gain-control),不过 AAC 有一套对付 pre-echo 的 tool(或者叫 module)叫做 TNS,可以用来解决 pre-echo 的问题。

这个,越扯越远,写不完了 ><
解决 pre-echo 的方法下次继续....

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值