mbed向けRice-Golombロスレスオーディオプレーヤのステレオ化
mbedの話題に戻ります。ロスレスオーディオです。
まずここまでの粗筋です
- LPCM信号から差分PCM(DPCM)を生成し、DPCMをRice-Golomb符号化圧縮・伸張を行うPC上で動作するエンコーダ・デコーダプログラムを作成
- 圧縮率を確認し、圧縮が行われている事を確認
- mbedに(デコード処理のみ)ポーティング
- デコード結果をmbed(LPC1768)内蔵のDACに出力し、音声信号にデコードされている事を確認
前回LPC1768の内蔵DACでデコード動作確認を行いましたが、10bitの出力ではせっかくのロスレス16bitオーディオの意味が無いので16bit出力が可能な外付けDACを用意したいと思います。使用DACはローム製BU9480Fを使用しました。
選定理由はこんな感じ
- I2Sと違い複雑な設定をしなくてすむ(ほぼSPI通信と同じ手法が使え、mbedライブラリもSPIは用意されている)
- 手に入りやすい(秋葉原の鈴商さんで200円)
- 手ハンダしやすい
- 8pin ICで配線も楽
I2S DACと比較して不利な点もあります。
- LPC1768はI2Sインターフェースがあるのに無理矢理SPIを使っていて効率は良く無いかも
- LPC1768には8ワードのI2S用FIFOがあり、割り込み回数の低減を図っているが、SPIには無い
- I2SインターフェースにはDMAもある
このように割り込みオーバヘッドが大きいことからBU9480Fでの高サンプリング周波数での駆動は難しいと思われます。今回は簡単に作る事を目的としたので、上記の3項目は犠牲になってしまいました。
BU9480Fとmbedの配線は以下のようにしました。かっこ内はそれぞれの(ピン番号)
(BU9480F) | | (mbed) (5)LRCLK | -> | (p14) (6)SDAT | -> | (p11)mosi (7)BCLK | -> | (p13)sck
DAC出力段にはZobelフィルタとアンプが必要になります。
PC用エンコーダ・デコーダのソースはこちらからDLをお願い致します。(要コンパイル)
コンパイル方法はUnix系のターミナルから
$ gcc rice_golomb.c -o rice_golomb
とするだけです。詳細は以前の記事を参照。16bit,ステレオのwavファイル(サンプリング周波数24.000kHz)を用意し、test.wavにリネームし、rice_golombの実行ファイルと同じフォルダにコピー。
$ ./rice_golomb
しばらく待つと、test.rgm(エンコードファイル)とdecode.wav(再デコードファイル)が生成されます。test.rgmがmbedロスレスオーディオプレーヤで再生できる形式です。SDに保存します。
mbed用デコーダはこちらからDL出来ます。(要ログイン)
リセットボタン押下後、ステレオで再生が始まれば大成功。