昨日清晨,進行了個耗時五個鐘的大工程。
早兩星期,睼過有關 CD、音量、音量競賽 (loudness war)、動態範圍 (dynamic range) 的資料。再看自己的音樂庫,細看峰值計 (peak meter) 與音量計 (VU meter),不禁倒抽一口氣。就如我一星期前所講,原來這麼多年來,自己都在買垃圾。
問題還是那個問題,太大聲。之前都講過,數碼音效的訊號,絕對無可能超過 0 dBFS。但所有樣本 (sample) 都低於 0 dBFS,是否就代表轉換出來的訊號一定低於 96 dB?答案原來係「否」。由於採樣係數碼化過程,中間一定有資料流失。如果採樣點不在波峰或波谷,只在附近的話,把這些樣本推到 0 dBFS,經 DAC 出來的訊號,就會超過 96 dB。重點:當實際訊號達 +3 dBFS,大多數 DAC 的轉換會有超過 10% 偏差,而且偏差會持續一段時間。+3 dBFS 不難達到的,尤其加入泛音時 (對於音樂,即任何時候)。
另一個問題,都係關於音量,就係我聽歌太雜食,乜歌都有,結果就係,乜音量嘅歌都有。在電腦上,我有 foobar2000 的 ReplayGain 功能,控制音量於統一水平,可惜,DAP 上無 ReplayGain。所以聽歌時,經常要大輻調較音量。可以怎樣做?答案:修改音效檔的音量。
但,恁又帶來另一個問題… ReplayGain 標準定於 89 dB (約 -14 dBFS),我有歌比此音量低,約在 86 dB (-16 dBFS)。即係話,套用 ReplayGain 之時,會調音此段音樂的音量,可能會令原本無事的音樂衝過 0 dBFS。雖然 ReplayGain 有防 clipping 的功能,但如此即係限制音量,會減少動態,我不願見到。解決方法?Pre-amp。將 ReplayGained 後的音量再降低 6 dB,去到 83 dB (-20 dBFS),然後關掉防 clipping。雖然如此還是有 clipping 的危險,但有 20 dB (安全計其實只有 16 dB) headroom 畀你,你都可以 clip,恁抵畀你 clip 啦。83 dB 不是亂選的,這是電影業界的標準音量。可能你已經估到,那些要我降 6dB 的音樂是來自電影的。
不過降低 6 dB,等於放棄 16 bit 中的1 bit,雖然明知不會聽到,但心仍有不甘。為此,我有兩個「對策」:一,升頻 (up-sampling);二,提升位元數 + dithering,但係後來發現 S9 只支援 16 bit FLAC,恁就得返第一個方法。真係可惜,foobar2000 內可是以六十四位元的浮點數 (float64) 來運算的,不能善用運算結果,真係可惜……本來想過,升頻時做 dithering 好不好?但又好似有尐多餘,所以最後都係放棄。
經過測試,由 44.1 kHz 先升到 192 kHz,再降到可播放的 48 Hz,與 44.1 kHz 直接升到 48 kHz 比較,一首五分鐘的音樂有七十七個樣本相異 (升頻後一秒有四萬八千個樣本)。雖然明知不會聽出分別,但還是先升到 192 kHz。升頻的演算法夠高明的話,希望可以改善一些 clipping。好在 foobar2000 係先做 ReplayGain 後再做升頻,否則就要分兩次進行,因為 real-time resampler 對 peak 是很敏感的 (即係話,超過 0 dBFS 就會有偏差)。
然後,以 Pentium 4 3.0 GHz (533 MHz FSB) 的運算能力,經過慢長的五個鐘,我的 9.8 GiB 音樂庫,就統一音量了。順帶一提,平均以五倍速運算,算快定慢?自行判斷。音樂當然有留低正本,改音量可是不能逆轉的,等同破壞性壓縮。
有趣的是,轉換出來的音樂,儘管採樣率提升了,FLAC 壓縮後的位元率還是下降了,差異還有一成之大,頗為驚人。
Recent Comments