2012年5月20日 星期日

電腦訊源

我的器材非常單純,Sennheiser CX300 + Thankpad T410,跑 Windows 7 Professional 設定 192KHz 24bit 輸出, foobar v1.1.1 + SoX Up-sampler (foobar plugin)。

聽人聲我的木耳沒有感受到太大的差異。聽大動態大編制的音樂,各樂器聲部之間的分離度好很多,低頻的延伸性、彈性也好一點。


除了分享我覺得軟體效果很好,真正想要分享的是一些個人對於學理上的認識。

只要修過 DSP 的人應該都知道,在取樣頻率遠高於訊號頻率的時候,降頻就簡單的把東西隔著丟掉,升頻就是 sinc filter。不幸的是 sinc filter 是個 non-casual 處理,也就是說現在的運號會受到未來訊號的影響。在數位的世界裡如果運算速度不是問題,那大可以來回多跑幾次,總會愈來愈接近,但是也會因為運算次數的增加導致運算誤差的累積,造成底噪的上升。

這個網站可以看到 1KHz tone test  經過運算之後底噪的變化。不過 DAC 理論告訴我們,1bit = 6.02 dB 的動態範圍,所以 24bit = 144.48 + 1.761 = 146.2 dB,那些比最強訊號低 150dB 的底噪,我們可以完全不管。

上面這個連結是 Logitech SqueezeBox Touch 的測試資料,圖三可以看到 24bit 訊號的底噪大約是在 -140 dB 左右。不過圖二告訴我們另外一件事情,這台機器的解析度其實只有 17bit 左右。

數位升頻的另外一個挑戰是 192KHz 並不是 44.1KHz 的整數倍,假設是 13/3 倍好了,那最基本的實現方式就是升頻 13 倍再降頻 3倍,首先 13/3 並不等於 192/44.1 ,那已經是個近似,加上這樣的升降頻會花費大量的運算資源,所以我也同意升頻運算最好是事先算好直接播放,如果音效卡/DAC 支援  44.1kHz x 4 = 176.4KHz 輸出更好!

而在實際運用上, Jitter 跟 Power 也是兩個要考慮的問題,前者決定 DAC 輸出訊號的時間穩定性,後者決定「實際電路」是否真的有 146.2 dB 的動態範圍,尤其會大量切換電流的數位信號很容易透過電源電路竄進放大電路裡。前者可以透過 PLL 來改善,這篇文章有實際的例子,後者則很多人相信多級 LC 濾波線性電路有最佳的性能,當然線路規劃、電路設計也都有很重要的影響。


另外一個問題,如果人耳只聽的到 20Hz - 20kHz 的訊號,也許 24 bit 會帶來更大的動態範圍,,但是為什麼我們需要升頻?

第一,你的DAC 使用的濾波電路夠不夠好。所有 DAC 的輸出依然是 Sample-and-hold,在時間訊號上充滿了很多銳利的角,我相信這些高頻訊號雖然我們無法直接聽到他的「音高」,但是會造成不耐聽。大多數的放大器都是強調在 20-20KHz 裏面的平坦,從沒標明對於高頻訊號的衰減,因此要把這些不舒服的高頻清理掉都要靠 DAC 輸出端由 OP 組成的濾波電路跟你的喇叭。如果經過升頻,這些東西其實佔的總能量會下降,提高聽感上的舒適性。

第二,人耳其實還是可以「感覺到」時間訊號。傳統的理論告訴我們,人耳對於 50ms 以內的聲音只有聽到頻率(音高),而無法聽到絕對的時間起點。這就是為什麼處理音樂訊號的時候「相位」不是太重要的理論基礎。依照我以前把便宜耳機直接接上訊號產生器聽的經驗,20KHz 的弦波我是聽不到,不過 20kHz 的方波反而有聽到一些東西,近代的一些實驗也顯示,人耳其實可以感受到依些  50ms 以內的時間變化的。也因此像 SoX 之類的處理軟體,也有 linear phase 的選項。

最後,電腦播放音樂的問題還是在於作業系統。當代所有作業系統都是多工的,CPU 一邊要注意滑鼠的移動、螢幕的更新,還要幫你運算音樂輸出。這其中我們能做的只有把音樂播放軟體的 Priority 提高、減少常駐軟體,增加 Buffer,以此來將 Latency 控制在合理的範圍。


一切都還是在取捨的功夫,如果你跟我一樣是耳機接電腦,明顯的不會有什麼 OP 濾波器,那升頻應該是個好選擇。如果你有外接獨立 DAC、高級耳機,你的系統本來就把不需要的高頻處理的很好了,那搞不好升頻對於 Latency 的影響還會讓聲音變差。