読者です 読者をやめる 読者になる 読者になる

Lynx-EyEDの電音鍵盤 新館

広帯域制御屋の駄文とか

mbed向けRice-Golombロスレスオーディオプレーヤのステレオ化

mbed ARM lossless

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出来ます。(要ログイン)
リセットボタン押下後、ステレオで再生が始まれば大成功。
f:id:Lynx-EyED:20100911201539j:image:left