2013年12月25日 星期三

MPD 加上 SoX 升頻

RaspyFi 主打 bit perfect,檔案是什麼格式就直接丟給 DAC 處理,中間沒有經過任何加味。但是對於擁有 96KHz/192kHz DAC,而且又懶得轉檔升頻、認為即時升頻運算是可以接受的人,其實幾個簡單的指令就可以讓 Raspberry Pi 做這樣的運算。我在這紀錄了我自己嚐試的經過,以及最終我所使用的方法。

  • 方法一:使用內建的 Secret Rabbit Code
  • 使用方法很簡單,只要在 /etc/mpd.conf 加上下面這行就可以了。

    這是一個頗有名氣的 resampler,那個數字的設定可以參考 MPD 說明書,但是寬頻的 0 和 1 這兩個設定在 Pi 上都跑不動,會發生音樂格放的現象。使用頻寬只有 80% 的演算法,我認為不如不要用,放棄。

  • 方法二:透過我之前自己 compile 好支援 pipe 的 MPD,外掛 sox 
  • 在我的《用 Raspberry Pi 聽音樂》紀錄了我如何設定並編譯支援 pipe 的 MPD,現在只要安裝上 sox (sudo apt-get install sox),就能使用這個威力強大的效果器!最主要的優點是可以加上 dithering 來讓 quantization noise 變得聽起來比較不明顯,這在只支援 16bit 輸出的音效卡上,理論上是個重要的設定,不過我還沒有仔細的試聽比較就是了。

    我在 /etc/mpd.conf 加上如下的設定:
    主要的內容都是在指定輸出輸出的格式,注意 raw 後面有一個 "-" 不要漏掉了,後面的 sample rate 和 bit 數就根據使用的 ADC 設定。 在我的 Raspberry Pi 上,這樣的設定勉強跑的動,CPU rate 會上到 80%,這時候只要用網頁開 RaspyFi 就會讓他掛點,不過用 gnome music player client 或是 Android/iPhone App 影響都比較小。這部份也許可以透過超頻改善,不過我沒有繼續往這方面嚐試就是了。
    嚴格講,這樣的 dithering 還是不能在 16bit 音效卡上使用軟體調整音量的。RaspyFi 的軟體音量調整是交給 ALSA 負責,一旦用軟體把音量調小,好不容易加上去的 dithering 都會被砍掉。理想上應該要使用 hardware mixer,並在 sox 指令中加上 "gain -20" 來降低音量 (以 20dB 為例) ,這樣的另外一個好處是 dither 和 resampling 都需要 digital headroom,這樣的調整方式也可以避免這些音效處理反而造成失真。

  • 方法三:指定 MPD 使用 soxr
  •  MPD 說明書 裏面我注意到其實有個 soxr 的選項,不過 RaspyFi 預設並沒有安裝這個 library,因此我們要自己手動編譯安裝。首先下載原始碼並丟上去 Pi,執行以下指令:


    最後的 /etc/mpd.conf 的修改則如下:
     

在我的系統上第三個方法的 CPU 使用量大約在 30% 左右,我很滿意這樣的結果。至於同樣的 DAC 跑在 44.1KHz 和 96kHz 的差異,我這樣的木耳就直接放棄用耳朵比較了,學理上只要 headroom 夠,這些處理可以讓不夠完美的類比輸出濾波器,也能產生優秀的聲音。MPD 內部是用 32bit 運算,只要最後輸出的時候處理正確,應該不會有 clipping 的問題,這部份有待進一步的資料收集。