2009年9月9日 星期三

DRC麻煩之一...音量

DRC處理有個大麻煩,filter後音量會改變,
為避免overflow,所以先轉成floating point處理,
再轉回integer給DAC,這又為了避免損失解析度,必須盡量放大音量,也就是normalize。

播放時,若是採取real time filtering(例如用foobar),這就會有麻煩,
處理後的最高音量會出現在哪個點?這並不知道,必須處理後才知道,
也就是,無法normalize...只能定個音量...
那,這音量該怎麼定?

有個做法是先用white noise當訊號源處理,也就是用最糟糕的狀況,
取處理前後的peak差,做為音量衰減值。

這手法,在絕大多數狀況下應該不會導致輸出clipping,
但,解析度會損失多少?

以我的房間的filter而言,white noise處理後的peak為原本的3.36倍。
而音樂呢?取二個極端類型,看peak,
月光小夜曲是0.912,下港人在台北市是1.652,full scale 是1.0。
倘若衰減3.36倍,那就成了0.271與0.491,這就損失2 bits與1 bit。
這顯然不是最好的方法...

另一個方式,預先filter後儲存。
這招所存下來的檔案,只能用在一個空間,
要是要轉到iPod上,或是在另一個房間聽,那就不行...

再一招,先filter整首,找出peak,據以設定衰減量。
這又分成二招,其一,先處理完,先記錄,要用時再找出來;這不適於on the fly形式,例如塞張CD進去play。
其二,on the fly先處理再播放;這得要速度夠快,以我的MacBookPro CPU Intel Core2Duo 2.53GHz,硬碟5400rpm,處理4:30的曲子,大概3秒多。
倘若加上streaming out到DAC的buffer,以Airport Express而言,大概是5秒,合計為8秒,長了點...應該壓在5秒內為宜...

然而這招其實會有麻煩,
一般聽音樂是整張album聽,mastering過程會仔細的調整,讓整張album的音量不會有明顯的差異,
上述的針對個別曲目normalze,就會導致音量忽大忽小,原本動態小的曲子音量變大...

要解決這個,似乎只有先行處理記錄下整張album的衰減值,每次play時據以調整...
on the fly時,或許可以在play第一首時,先處理其他曲子,由第二首起依據所得值調整;
不完美,還算可用。
或許也可以在CD塞進去時,先處理,約耗40秒,便能計算完畢,
這應該還可以再optimize成更快。

沒有留言:

張貼留言