MPEG AUDIO音频处理的基本知识(整理)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zymill/article/details/78901001

    音频数据因为其內容的特性,以传统的压缩方法很难达到很高的压缩率,不过我们人耳并没有无限的时间解析度和频率解析度,其实原始的音频信号中包含了很多我们听不到的内容。把这些对我们来说其实无意义的内容去掉,这样就可以达到很高的压缩率。这种利用人类感官知觉的特性的失真压缩法,就叫做perceptual coding。
    人耳的生理结构,由外耳的耳殼收集外界的声波到达中耳的耳膜产生震动,经由三块小骨连接前庭窗传入内耳,其中由于耳殼的內凹形状,外耳道的长度和宽度..等等生理的构造,会对不同频率产生共振升压的效果,尤其是2~5KHz的频率,会在这个过程中被放大。人耳的听觉频率范围,大约是20Hz~20KHz,音量范围则是130dB SPL, 大于130dB会产生痛苦的感觉,小于0dB则被当成是静音。如上所述,人耳对2~5KHz 的频率最敏感,越往高频感觉越不敏锐,音量要超过一定的界限以上不能被人耳察觉,这个最低可以听闻的界限,叫做ATH(absolute threshold of hearing)。内耳的耳蜗有许多绒毛细胞,分别会对不同的频率产生反应,将基底膜淋巴液的波动转换成神经的电流信号,传达给大脑。也就是说耳蜗的作用就像一个频谱分析仪,把声波转换成不同频率的信号,每一个特定位置的绒毛细胞会受到特定频率的刺激,但是当基底膜传导波动时其临近周围的阿绒毛细胞也会受到刺激。这也就是说如果有一个频率的音量很大,在它附近同时有一个比较弱的频率的话,比较弱的频率的声音就会被比较强的声音给遮蔽掉。我们人耳没有办法分辨出有一个比较弱的频率的声音存在。这个遮蔽的作用叫做frequency 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数,让产生的量化噪音低于遮蔽效应的曲线,使量化的失真不会被人耳听到,这样就大功告成了。

    前面说到心理声学模型是如何工作的ISO MPEG1 Audio提供了两个心理声学模型,分别是psychoacoustic model 1 和2,model2比 model 1 要复杂,但是判断的效果更好。两个模型可以用在任何一个layer, layer1~3(MPEG1 Layer 3即使素称MP3). 不过我们通常是将model1用于MP1和MP2,model2用于MP3。当然也有例外,譬如说一个特殊版本的toolame(压缩 MP1, MP2最好的encoder)就是采用model2而不是model1。

    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 的能力,比较强。对这两个参数的调整会调整tone和noise的遮蔽能力,整个遮蔽曲线会受到影响。一般,降低这两个参数,会使整个遮蔽曲线下降,可以容忍的量化噪音就比较低,量化噪音必须减少,分配的bit数就必须增加,所以bitrate会增大,但是量化杂音也会随之减少。

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

    前面提过,MPEG1 Audio在分成好几个subband 准备做量化的时候,用的是等宽的filter bank,这和我们人耳的critical band不同。因为低频部分的一个subband可能包含好几个critical band。到了高频的时候,可能好几个subband包含 在一个critical band里面。这样心理声学模型计算出来的各个critical band 的 SMR 要怎么给呢?

    model1 是取subband 涵盖的范围中,最小的SMR。这么做在低频的时候,会将好几个critical band的SMR取其最小的一个给subband,因为subband包含了好几个critical band,如果用这几个critical band中最大的SMR,将会有部分频率的遮蔽效应会估计错误,所以为了妥协,只好取最小的。高频的时候则是好几个subband共用一个SMR。model1有一个致命伤,就是高频的时候,一个criticalband横跨好几个subband,以这个中央代表的noise频率计算出来的SMR,就无法适用在每个subband里面。(距离中央越远的就越不正确。)

    model2 低频的时候取最小的SMR,和model1 一样,高频的时候则是取critical band好几个SMR的平均值给subband。 model2不采用集中式的noise,而是用tone index的方式来计算tone和noise的遮蔽效应,所以在高频的时候会比model1精确。


    接下来介绍MDCT 和 Quantization(量化)。

    将PCM data 分成好几个subband等待心理声学模型的判断,做进一步的量化压缩,这种压缩方法叫做subband coding。这个filter用的是polyphase filter bank,将PCM data分成32个等宽的subband。这个polyphase filter bank有几个缺点:
1)它是有失真的filter,也就是说还没有开始量化,经过filtering以后的subsample立刻将它还原回PCM data,结果就已经和原来不一样了。不过这个失真很小(大概小于0.07dB)所以对品质不会有太大的伤害。
2)它是等宽的频带,不符合人耳听觉特性的critical band,对后续的量化处理不利。
3)它的截止点平缓,所以当输入频率很靠近截止点的时候,相邻的两个subband会发生aliasing效应(混淆效应)。

    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变换之后,数据会完全丧失时间信息。什么是时间信息呢?回过头来说FFT,在做FFT时,windowsize越大(取进来的计算的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(按频率顺序)×18组(按时间顺序)
    3. 重排为18个 sample(按时间顺序)× 32组(按频率顺序)
    4. 每一组中的18各sample为时间顺序,加上前面一次转换的18个sample,总共36个sample送进去做MDCT变换(所以MDCT window 有50%重叠)
    5. 转出来为18个sepctral line(按频率顺序) x 32组(按频率顺序)

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

    既然有 pre-echo 当然就有post-echo。想像有一个波形是大音量之后急剧缩小的波峰。量化杂音也会向后扩散到小音量区域。那么为什么很少听到有人提及post-echo的问题呢?则是因为post-echo问题不重要,我们听不到post-echo瑕疵,所以可以不比去处理。则是因为pre-masking 和 post-masking 的遮蔽能力不一样,pre-masking的时间很短,必须很靠近大音量的部分才能被遮蔽到,而post-masking的作用时间很长,在大音量之后很长的一段时间之内都有遮蔽的效果。所以post-echo通常会被post-masking给遮蔽掉,因此我们不用关注post-echo问题。

    那么MP3是如何解决pre-echo的问题呢?MP3有两个方法:
    第一个方法是使用bit reservoir。自适应bit分配,使得遇到attack波形时,多分配bit,从而降低量化噪音,如此便可以减少pre-echo的影响。
    第二个方法切换MDCT window的大小。遇到attack波形的时候采用比较小的window size,提高时间解析度,避免pre-echo的瑕疵扩散。例如遇到attack波形时,原来的window size叫做long block,切成三个短的window size叫做short block。 原来的size 18个 sample除以3 得6加上前一次6个sample 总共12个sample送去做MDCT变换。因为并咯出口缩短,时间解析度提高,就可以有效控制pre-echo。(最后一个short block可以利用pre-masking的遮蔽曲线。block缩短,量化杂音扩散范围缩小,杂音分散的位置(时间)就越接近大音量起始部分,此时pre-masking就可以发挥作用。)

    下面又提到一個名词,叫做 scale factor band(SFB)。SFB 是 MDCT 变换以后,将MDCT变换系数,几个几个集合起来,分成几个群组,这每一个群组叫做SFB。分成SFB做什么呢?SFB很接近人耳特性的critical band,基本上你可以就将它视为critical band,包成SFB之后再送进去量化,如前所述遮蔽计算会好很多。这些SFB频带里的MDCT数值,都用同一个scale factor。什么是scale factor呢?scale factor就是科学计数0.125*(10^2)的那个指数“2”。假设现在SFB中包含三个MDCT系数:2.6, 1.3, 0.2, encoder会造那个最大的系数2.6把它改成科学记数法表示为2,使得有效位数的范围落在[-1,1]区域中,即2.6 = 0.65*(2^2),然后再送进去量化;这时候只量化前面的有效数字65。解码时,反量化之后的数值再乘上这个scale factor就可以还原回原来的MDCT系数。

    具体的量化原理
    量化的步骤分为内外两个循环。
    内部的循环叫做bitrate control,它会根据可用的总bite数,分配bit给各个SFB,并且控制最后编码的bit总数小于可用的bit数,所以这个循环称为bitrate control loop。如果编码的结果导致超过可用的bit数,bitrate control就会提高一个参数global gain,提高该参数会使得需要编码的有效位数变短,所以需要的比特殊就会减少,使得编码后的bit总数符合可用的bit数。
    外部的循环叫做quality control loop,当内部循环encode完以后,会将结果送出给外部循环,外部循环会计算目前内部循环编码完后所产生的量化噪音,并且和心理声学模型送来的SMR(可以容许的量化照应)做比较。如果有SFB目前的量化噪音大于可以允许的量化噪音(代表目前的量化噪音超过遮蔽曲线), 程序便会提高Scale factor,提高scale factor会使得需要编码的有效位数变长,所以需要的bit数便会增加,bit数增加使得量化误差减少。直到产生的量化噪音符合可以容许的界限为止。外部循环放大Scale factor的叫做 amplify Scale factor band,放大这个参数,重新执行一次内部循环。如此周而复始直到1)所有的SFB都小于或等于可以允许的量化噪音。2)所有的Scale factor都已经放大到最大值。以2的条件跳出来的,代表还有SFB的量化噪音超过可以容许的范围。
    量化过程与其说是在做bit allocation,倒不如说是在做noise allocation,决定noise要分配到哪些地方,哪些地方noise多一点,哪些地方少一点。

    了解scale factor这个参数的作用之后,接下来要解释为什么这个参数提高会使有效位数的大小刚刚好符合量化所提供的bit数。
例如假设现在MDCT系数是9.6,改成0.6*(2^4),显然有效数字是0.6,最接近的用二进制记录的为(0.101)=1*2^(-1)+1*2^(-3) = 0.625 此时误差是0.025。现在提高Scale factor,改成 0.3*(2^5); 显然有效数字是0.3,最接近的用二进制记录的为(0.0101) 转为十进制为0.3125,误差是0.0125。显然误差减少了,但是bit数增加了1位。

    真正的MP3压缩时所用的scale指数相当复杂。包含了上面提到的global gain(该参数越高,所需bit越少,品质越糟,和Scale factor正好相反)和scale factor,还有 pre-emphsis tab等等。
long block 使用的式子 
gain[sfb][i] = 2^ [ -.25 * ( global_gain -210 - ifqstep*scalefac[gr][ch].l[sfb] - ifqstep*pretab[sfb]) ]

猜你喜欢

转载自blog.csdn.net/zymill/article/details/78901001
今日推荐