把那天偷懶沒寫的部分寫完...
MP3x 的圖形示範說明
壓縮的 wav 檔是
EBU SQAM test tone 27,著名的 pre-echo 殺手 "castanets"
這個 wav 檔有非常多變態的 attack 波形,是各種 encoder 最痛恨的那一種壓縮對象
Lame CBR 128kbps 壓縮,所有參數都是預設值,移動到第 37 個 frame = 第 0.97 秒
畫面
![圖檔](http://home.pchome.com.tw/movie/tsil/pic/MP3x1.png)
最上面那行顯示的是 frame header information,紅色的字體代表 "on"
js 所在的這個欄位會顯示幾種情況: mono, joint-stereo, stereo,代表這個 frame 是以哪一種聲道模式壓縮。如果是 joint-stereo(js),還會顯示是 mid-side stereo,還是 intensity stereo。(ms 和 is 的意義,請參照 LukeLo 大大的「漫談數位音樂」一文)
mdb 代表 main data begin,告訴 decoder 往前移動多少 bytes 才是這個 frame 真正 data 的起始位置。後面兩個數字則是 壓縮這個 frame 的 MDCT 係數所花費的 bit 數/壓縮這個 frame 之前 Bit Resevior 的大小
第一個視窗是原始 PCM 的波形,平常是顯示左或右聲道,上面我切換為顯示 mid-channel,下面是 side-channel
![圖檔](http://home.pchome.com.tw/movie/tsil/pic/MP3x2.png)
最左和最右邊的黃色的線之間包含的是這個 frame 壓縮的 1152 個 sample。中間的黃色的線再把這個 frame 切成兩半,分為兩個 granule,各 576 個 sample。granule0 和 granule1 分別做 MDCT 轉換,對應下面的兩個 MDCT 視窗。可以看到圖中右邊的 granule1 有一個音量急遽上升的 attack 波形,所以 Lame 把這個 granule 再切成三個 short block(多出兩條黃線切成三等分),各 192 個 sample,分別做 MDCT 轉換。
視窗底部的藍色和綠色的線,代表 psy-model FFT window 的長度,分別對應下面的左右兩個 FFT 視窗。前面說 ISO 是用 1024 個 sample 的 FFT window size,Lame 則是用 768 個 sample 的 window size。(這是有原因的,因為 768 個 sample 的長度對於計算一個參數叫做 perceptual entropy 會比較準確。由 perceptual entropy 這個參數 psy-model 可以知道這個波形發生了 attack,告知 MDCT 做 window switch。768 個 sample 的長度較短,越少距離 granule 中心越遠 sample 會被扯進來干擾計算,對於 pe 的計算判斷會較準確。當然有一好沒兩好,FFT window size 越小,頻率的解析度就越不精確,遮蔽計算的效果越差。凡事都是對立需要妥協的,這是不管在那個領域都會成立的真理
![:P](./images/smilies/icon_tongue.gif)
)
第二個視窗是壓縮之後,synthesis filter bank 還原回來的 PCM 波形(播放時候的 PCM 波形)。
下面是 ISO 的 psy-model 壓出來的結果
![圖檔](http://home.pchome.com.tw/movie/tsil/pic/MP3x4.png)
可以看到 ISO 的 psy-model 漏掉了這個 attack,沒有做 MDCT 的 window switch(沒有切成三個短的 short block,看黃色的線)。事實上 ISO 的 psy-model 是慢了一步,在下一個 granule 才換成 short block。(因為 1024 個 FFT window size 的關係?)
所以可以看到右邊的 granule1 大音量開始的前面,波形多出了一堆雜訊,這個就是我們之前常常說的 pre-echo
第三個視窗是 MDCT 的係數,左邊的 MDCT0(start) 代表用的是中介窗 start(從 long block 換到 short block 不是立刻轉換,中間會經過幾中介的 window,照這樣的順序:normal--> start--> short--> end--> normal),右邊則是 MDCT1(short),代表使用 short block。
切換為顯示量化之後的 MDCT 結果
![圖檔](http://home.pchome.com.tw/movie/tsil/pic/MP3x3.png)
第三個視窗是 FFT 的頻譜,各個顏色的意思上次有說過,後面那些數字 pe 是 perceptual entropy,其他的不知道
最後一個視窗是 SFB,scale = Scalefac_scale, preflag = pre-emphasis flag, ggain = global gain
各個 bar 為 Scale factor band,一開始的 scale factor 都是 0,然後有放大的 band 長條圖會變長。
QuickTime 6.0 可以壓 MPEG4 AAC,用的是 Dolby AAC 的引擎(改自目前世界上最頂尖(?)的 FhG professional AAC Codec,速度比較快,音質稍微差一點,類似 MP3Enc 和 FastEnc 的差別)。psy-tel AAC 的開發者 Ivan 用這首 castanets 測試,結果發現 QT6.0 AAC 的 psy-model 會漏掉幾個 attack 沒有切換為 short block(而 FhG 的 AACdemo 2.2、LiquidAudio AAC 則正常)。不過也有人持反論,認為這幾個 attack 相隔距離太近,pre-echo 瑕疵可以利用前一個 attack 的 post-masking 遮蔽掉。也許有興趣的人可以試試看,看看 pre-echo 到底聽不聽得到
![:)](./images/smilies/icon_smile.gif)