1. 程式人生 > >MPEG AUDIO音訊處理的基本知識(整理)

MPEG AUDIO音訊處理的基本知識(整理)

    音訊資料因為其內容的特性,以傳統的壓縮方法很難達到很高的壓縮率,不過我們人耳並沒有無限的時間解析度和頻率解析度,其實原始的音訊訊號中包含了很多我們聽不到的內容。把這些對我們來說其實無意義的內容去掉,這樣就可以達到很高的壓縮率。這種利用人類感官知覺的特性的失真壓縮法,就叫做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]) ]