マイコン工作実験日記

Microcontroller を用いての工作、実験記録

MP3デコーダ

2009-05-16 18:03:29 | MP3プレーヤ
ついついカメラの方に手が出てしまったので、今度はLPC2388の方でも少しまとまった作業を。。。

MMcodec01を実際に使うに先立って、MP3デコーダ・ソフト部分を用意しておく必要があります。デコーダ・ソフトとしてはATMELのAPノート等の作例に倣って、HelixのMP3デコーダを使うことにしました。このデコーダは、整数演算だけで済むコードも用意されているうえに、ARM用への最適化作業も施されており、ARM用のアセンブラコードも含まれているようです。APノートの作例を参考に必用なコードをダウンロードしてコンパイル。ダミーのmalloc/freeルーチンを用意してやる程度の移植作業で、TOPPERS/JSP上で動くデコーダを用意することができました。

次は再生に使うMP3データの用意です。適当なCDからWMP(Windows Media Player)を使って1曲取り込み。フォーマットとして mp3, ビットレートとして192Kを明示的に指定して取り込んでみました。192Kの再生ができれば、実用的なのではないかと。こうして用意したMP3データをSDカードに入れて、LPC2388で読ませればいいのですが、まだSDカードのハードは作成してありません。すでにインターフェース6月号でChaNさんがSDカードのためのハード/ソフトの解説記事を書かれていますので、このとおりのものを作成すれば良いでしょう。しかし、わたしがいま興味があるのはMP3のデコーダやI2Sの動作確認の方なので、とりあえずSDカードの準備は省略。LPC2388のフラッシュが512KBとデカイことをいいことに、MP3データはフラッシュ内に保持させて実験を進めることにします。

いくらフラッシュがデカイとはいえ、MB単位の曲データをすべてフラッシュ内に保持することはできません。Linuxのheadコマンドを使って、最初の400KBだけを無理やり切り出して使うことにします。
$ head --bytes 400k sample.mp3 > test.mp3

こうして切り出したファイルにも、必要なヘッダ情報は含まれているようで、Windows上では普通のMP3ファイルに見えますし、再生することもできました。400KBでおよそ16秒相当になっています。こうして用意したデータをダンプして、const unsigned char[ ] の配列に格納することで、フラッシュの領域にもっていきます。

曲データも用意できたので、こいつをMP3デコーダに喰わせてダミー再生する実験を実施してみました。つまり、MP3のデコードはするものの、その結果生成されるPCMデータは再生することなく、読み捨てるだけというプログラムです。以下、その実行の様子です。



  • 曲データの最初の方にはID3タグが含まれているらしく、デコーダは最初の4352バイトを読み飛ばしています。
  • 実際の曲データのフレームを見つけた時点で、レートやサンプル数等の情報が表示されています。
  • 以後、フレームを見つける毎にダミー再生をおこない、残りのデータ長を表示させています。
  • 残り226バイトになったところで400KBの境目に到達したためデコードが異常終了しています。

このように、およそ16秒の曲データを再生するのに、デコーダの実行には10秒弱しか要しないことがわかりました。これなら、残りのCPUを使ってじゅうぶんに再生処理が行えそうですね。なお、この実験は60MHzのクロックでおこないました。72MHzにすれば、さらに速く処理できるのかもしれません。