DRC處理有個大麻煩,filter後音量會改變,
為避免overflow,所以先轉成floating point處理,
再轉回integer給DAC,這又為了避免損失解析度,必須盡量放大音量,也就是normalize。
播放時,若是採取real time filtering(例如用foobar),這就會有麻煩,
處理後的最高音量會出現在哪個點?這並不知道,必須處理後才知道,
也就是,無法normalize...只能定個音量...
那,這音量該怎麼定?
取處理前後的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成更快。
沒有留言:
張貼留言