pre-echo 的解決方法,其實這一系列的開頭第一篇文章就有提到了。我本來要解釋的是 long block 和 short block 的意思,我說這個牽扯到心理聲學模型的判斷,還有 MDCT window 大小的轉換,目的是為了解決 pre-echo 的問題。經過上面的說明,我想應該很容易猜到解決 pre-echo 的方法就是切換 MDCT window 的大小,遇到 attack 波形的時候換用比較小的 window size,提高時間解析度,避免 pre-echo 的瑕疵擴散。
前面提到 transform coding 是將要壓縮的資料轉換到另一個座標空間,目的是轉換後能以較少的數值記錄原本的資料,或者是能夠依據資料的特性刪除一些比較不重要的部分。但是轉換後會喪失原本空間的一些 information,例如 JPG 圖檔由 pixel domain 轉換到 frequency domain 會喪失空間解析度;MP3 由 time domain 轉換到 frequency domain 會喪失時間解析度,造成後面量化之後的雜訊擴散,這種瑕疵在音訊壓縮裡面稱為 pre-echo。
既然有 pre-echo 當然就有 post-echo。想像有一個波形是大音量之後急遽縮小的波封,量化雜訊也會向後擴散到小音量的區域。那麼為什麼很少聽到有人提及 post-echo 的問題?這是因為 post-echo 的問題不重要,我們聽不到 post-echo 的瑕疵,所以也不必去處理。前面沒有貼圖所以大家可能沒有注意到,pre-masking 和 post-masking 的遮蔽能力不一樣,pre-masking 的時間很短,必須很靠近大音量的部分才能被遮蔽到,而 post-masking 的作用時間很長,在大音量之後很長的一段時間之內都有遮蔽的效果。所以 post-echo 通常會被 post-masking 給遮蔽掉,因此我們不用 care post-echo 的問題。
那麼 MP3 是如何解決 pre-echo 的問題?
MP3 有兩個方法,第一個方法是使用 Bit Reservoir。Bit Reservoir 翻成位元儲存槽,LukeLo 大大在「漫談數位音樂」一文中有說明,請大家看一下。MP3 CBR 壓縮時,當某個 frame(1152 個 sample)不需要那麼多 bit encode 時,剩下的空間可以保留起來,留給後面的 frame 使用,這個功能叫做 Bit Reservoir。可以想像為將剩下的 bit 放到 Bit Reservoir 裡面儲存起來,以備後面不時之需。每個 frame 開頭有紀錄這個 frame 真正資料的起始位置(往前 offset 多少 bit),所以能夠正確的播放。記錄 offset 的位元有一定的大小,所以能 offset 的距離也有限制,Bit Reservoir 的大小也有限制,超過能夠容許的範圍即使有多餘的空間,那個 frame 也必須把剩下的空間填上 0(padding zero bit),所以 Bit Reservoir 還是有其限制。MP3 的 Bit Reservoir 很小,而 AAC 的 Bit Reservoir 則比較大,所以使用的彈性比 MP3 大。不論如何,有 Bit Reservoir 的設計,當遇到 attack 波形的時候,就可以增加量化的 bit 數,給多一點 bit,降低量化噪音,如此便可以減小 pre-echo 的壓縮瑕疵。
第二個辦法就是切換 MDCT 的 window size。遇到 attack 波形的時候,將原來長的 window size,叫做 long block,切成三個短的 window size,叫做 short block。原來的 window size 18 個 sample 除以 3 = 6 加上前一次的 6 個 sample 總共 12 個 sample 送進去做 MDCT 轉換。因為 block 縮短,時間解析度提高,就可以有效的控制 pre-echo。(最後一個 short block 可以利用 pre-masking 的遮蔽曲線。block 縮短,量化雜訊擴散的範圍縮小,雜訊分散的位置(時間)就越接近大音量起始的部分,此時 pre-masking 就可以發揮作用。沒有圖,大家只好用力想像一下 ^^;)
要如何判斷現在是 attack 波形呢?交給前面說明的心理聲學模型來處理。心理聲學模型會保留過去兩個 window 的資料和現在的 window 來作分析,根據頻譜的變化判斷是否發生 attack。如果有 attack,便控制 MDCT 轉換的程式做 window switch。切換的 window 不是立刻切換,中間會經過幾個變形窗,這裡就不詳述了,有一個 EncSpot 圖表中出現的名詞是 mixed block,這個意思是 ISO 容許同一個 granule 中,包含長、短兩種不同的 block。我們知道低頻的頻率解析度很重要,所以 ISO 允許遇到 attack 時,最低頻的兩個 scale factor band 使用 long block,其他的 band 用 short block,這叫做 mixed block。
看 EncSpot 的圖表,你便可以知道這個 encoder 會不會使用 short block 的技巧。沒有用 short block 的 encoder(如 Xing)就會被 EncSpot 的作者歸類到爛 encoder 裡面去。
兩個方法並用,就可以控制 pre-echo 的問題。
各家 encoder 多少都會改良 ISO 的設計,像 FhG 的 encoder,Bit Reservoir 的使用就更有效率,long block 也會使用 Bit Reservoir。(ie. 不止 attack 的時候會使用 Bit Reservoir,代表心理聲學模型的判斷更為複雜)
上面又提到一個名詞,叫做 scale factor band(SFB)。SFB 是 MDCT 轉換完以後,將 MDCT 轉出來的係數,幾個幾個集合起來,分成幾個群組,這每一個群組(也就是一個頻帶)叫做 SFB。分成 SFB 做什麼呢?SFB 很接近人耳特性的 critical band,基本上你可以就將它視為 critical band,包成 SFB 之後再送進去量化,如前所述遮蔽計算會好很多。這些 SFB 為什麼命名為 SFB?因為這些 SFB 頻帶裡的 MDCT 數值,都用同一個 scale factor。那什麼是 scale factor 呢?scale factor 就是科學記號 0.125 x (10^2) 的那個指數 "2"。假設現在 SFB 裡面包含了三個 MDCT 係數: 2.6, 1.3, 0.2,encoder 會找那個最大的係數 2.6,把他改成科學記號表示法,使有效位數的範圍落在正負 1 之間。例如 2.6 = 0.65 x (2^2) 然後再送進去量化,這時候只量化前面的有效位數。解碼的時候反量化之後的數值再乘上這個 scale factor 就可以還原回原本的 MDCT 係數。那為什麼不乾脆就叫它指數就好還要給它取一個新名字叫做 scale factor 呢?因為這個指數的作用,會重新 scale(放大)有效位數的長度,使有效位數的大小剛剛好符合量化所提供的 bit 數。
詳細的原理,必須說明 MP3 的量化過程 ^^;
先說明一下 EncSpot 的圖表裡面另外提到的兩個名詞:
1. Scalefac_scale: scale factor 的底數一般是 2(2^Scalefac,二進位),但是可以換為以根號 2 為底(sqrt(2)^Scalefac)。以 2 為底可以調整較大的範圍,以根號 2 為底可以做較細的微調。Scalefac_scale 為 0 或 1(EncSpot 顯示打勾)代表切換以 2 或根號 2 為底,這個參數是在告訴 decoder 要用那個數字為底數才能還原正確的 MDCT 係數。
2. Scfsi: Scale Factor Selection infomation,這個參數在 MP2 和 MP3 的 Format 裡面意思不一樣,我現在忘記了,沒時間查資料,總之是告訴 decoder 解碼的時候哪幾個 SFB 是用哪幾個 Scale Factor 乘的,正樣才能乘出正確的係數。沒有共用 Scale factor 就不用有這個資訊。
量化的過程:
量化的程式分為內外兩個迴圈。內部的迴圈叫做 bitrate control,它會根據可用的總 bit 數,分配 bit 給各個 SFB,並且控制最後編碼的 bit 總數會小於可用的 bit 數,所以這個迴圈叫做 bitrate control loop。如果編碼的結果超過可用的 bit 數,bitrate control 就會提高一個參數叫做 global gain,提高這個參數會使得需要編碼的有效位數變短,所以需要的 bit 數便會降低,使得編碼後的 bit 數符合可用 bit 數。
外部的迴圈叫做 quality control loop,當內部迴圈 encode 完以後,會將結果送出給外部迴圈,外部迴圈會計算目前內部迴圈編碼完以後所產生的量化噪音,並且和心理聲學模型送來的 SMR(可以容許的量化噪音)做比較。如果有 SFB 目前的量化噪音大於可以允許的量化噪音(代表目前的量化噪音超過遮蔽曲線),程式便會放大(提高)一個參數叫做 Scale factor
放大 Scale factor 會使得需要編碼的有效位數變長,所以需要的 bit 數便會增加,bit 數增加會使得量化噪音減小,直到產生的量化噪音符合可以容許的界限為止。外部迴圈放大 Scale factor 的動作叫做 amplify Scale factor band,放大這個參數以後會重跑一次內部迴圈,重新分配一次 bit。此時 Scale factor 有放大的 SFB 會需要較多的 bit,當然其他的 SFB 就必須減少 bit。因為其他的 SFB 本來的量化噪音是符合容許的,所以我們就開始祈禱經過重新分配以後,bit 數被減少的 SFB 的量化噪音仍然會低於可以允許的界限。如果是,那麼太好了,經過調整以後所有的 SFB 的量化噪音都小於允許的界限,那麼就跳出迴圈,大功\告成。如果不是,經過調整以後還是有 SFB 超過可以允許的量化噪音,那麼就再放大這幾個 SFB 的 Scale factor,重跑一次內部迴圈。重新分配完以後外部迴圈再檢查,還有沒有 SFB 不符規定.....如此週而復始,直到:
1. 所有的 SFB 都小於或等於可以允許的量化噪音\r
2. 所有的 Scale factor 都已經放大到最大值
然後跳出迴圈。
以 2. 的條件跳出來的,代表還有 SFB 的量化噪音超過可以容許的範圍(例如 bitrate 太低,這種情況當然再怎麼調整還是會有 SFB 超過限制),此時就要從剛剛所有的量化結果中,挑一個失真最小的結果來編碼。
例如有兩種情況
1. 僅 SFB 9 (1.9-2.2kHz) 超過界限
2. SFB 0 (0-172Hz) 和 SFB 20 (13-16kHz) 超過界限
Lame 會選 1 來編碼。
ISO reference code 會笨笨的用跳出迴圈之前的最後一個結果來編碼,而最後一個計算的結果通常是最糟的 case
這個量化的過程,與其說是在做 bit allocation(分配 bit),倒不如說是在做 noise allocation(分配 noise),決定 noise 要分配到哪些地方,哪些地方 noise 多一點,哪些地方 noise 少一點。所以你看 MP3 的說明文件,它會把這個過程稱為 noise allocation,而不用一般的說法 bit allocation。
了解 Scale factor 這個參數的作用之後,接下來要解釋為什麼「這個指數的作用,會重新 scale(放大)有效位數的長度,使有效位數的大小剛剛好符合量化所提供的 bit 數」。
假設現在 MDCT 的數值是 9.6,改成 0.6x2^4(讓有效位數介於正負 1 之間),用二進位紀錄有效位數 0.6,最接近的是 .101 數值為 1x2^(-1) + 0x2^(-2) + 1x2^(-3) = 0.625 和原來 0.6 誤差 0.025,需要 3 個 bit 紀錄。現在放大 Scale factor,改成 0.3x2^5,用二進位記錄有效位數 0.3,最接近的是 .0101,數值為 0.3125,和原來誤差 0.0125,和上面相比誤差縮小,而所需的 bit 增加為 4 個。所以提高 scale factor,可以使有效位數剛剛好符合量化增加的 bit 數,或者說可以"用完"增加的 bit 數的所能提高的精確度。
上面的說明只是為了方便了解簡化之後的例子,真正 MP3 壓縮時用的 scale 指數相當複雜,包含了上面提到的 global gain 參數(global gain 越高,所需 bit 越少,品質越糟,和 Scale factor 的作用剛好相反)和 scale factor,還有 pre-emphsis tab 等等的參數混合在一起,才組成真正的 gain 參數。
long block 使用的式子
gain[sfb]
= 2^ [ -.25 * ( global_gain -210 - ifqstep*scalefac[gr][ch].l[sfb] - ifqstep*pretab[sfb]) ]
如上所述調整 Scale factor 能夠有效的運用所有 bit 數的精確度,有助於音質提升。Xing 早期的 encoder 不會使用 Scale factor(Scale factor = 初始值 0),後來才加入 Scale factor 的功能。\r
http://www.xingtech.com/developer/mp3/
看到 EncSpot 顯示有使用 Scale factor(Scalefac > 0 佔百分之幾),代表這個 encoder 不會太笨
但是要注意的是,音質要好,Scale factor > 0 不是必要的,有可能各個 SFB 都沒有超過容許的量化噪音,所以也不需要放大 Scale factor。
說了這麼多,可能還是很難吸收(表達能力太差 >_<)
有興趣的人可以使用一個 tool,叫做 MP3x,其實就是 Lame 這個 encoder 的特別版本。它會在壓縮的時候用圖形的方式表現目前壓縮的狀態....放一張圖好了....
如下圖
![圖檔](http://home.pchome.com.tw/movie/tsil/pic/MP3x.png)
由上而下分別是
原始 PCM 視窗,三條黃線分割的區域,中間黃線的左右兩邊代表 1152 個 sample 分成的兩個 granule,
下面是經壓縮後,再合成(還原,也就是播放時的)波形
再下面是 MDCT window 轉換後的係數,對應上面兩個 granule 的視窗,黃線區分的是不同的 SFB。你可以切換顯示狀態,變成顯示"量化"之後的 MDCT 係數,由圖形變化,你可以看到經量化後產生的誤差。
然後下面是原始 PCM 經 FFT 的分析之後的頻譜,也就是心理聲學模型判斷的部分,每個 bar 代表 critical band。灰色的線是原始波形的頻譜,藍色的線是可允許的 distortion,紅色的線是經過 encode 之後,實際的 distortion。如果你看到紅色的線超過藍色的線,代表有些 SFB 的 distortion 已經超過心理聲學模型所可以容忍的範圍了,你應該要提高 Lame 壓縮的 bitrate。
最後一個視窗是 Scale factor band。
用這個軟體看圖說故事,比較能夠了解 MP3 encoder 內部到底是如何運作的。
以上,應該有很多打錯寫錯的部分,請原諒,我大概永遠都無力更正了 ![:P](./images/smilies/icon_tongue.gif)