マイコン工作実験日記

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

CODEC実験準備

2009-05-18 09:22:58 | MP3プレーヤ
MMcodec01をLPC2388で使ってみるべく、14Pの接続コネクタを準備。



フラットケーブルで接続して、こんな↓感じ。ちょっとケーブル長すぎなんですが、秋月にちょうど14Pのケーブルがあったので、実験はこれで進めることにします。



両者の間のは次のように端子をつなぐだけ。モジュール使ったのでお気楽工作になってます。LPC2388のI2Cには、I2C0/1/2の3つのポートがありますが、I2C2を使っています。


LPC2388とTLV320AIC23Bは、両者ともI2Sのマスター/スレーブのどちらにも設定して利用することができます。MMcodec01にはクロック生成のためのXTALも載っているので、今回は上図の矢印で示したようにTLV320AIC23B側をI2Sマスターとして使用することにします。LPC2388をマスターにすると適切なクロックとWS信号を供給するための設定が必要になりますが、TLV320AIC23Bをマスターにした場合には必要な設定パラメータをI2Cで送ってやるだけですし、そのパラメータもデータシートに書かれているのでソフトの作成も簡単なのです。

じつはこの準備作業、すでにしばらく前に終えていたもの。現在、I2Sのコード作成中。次回は、その報告をするつもりです。

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にすれば、さらに速く処理できるのかもしれません。

MMcodec01

2009-05-10 18:18:49 | MP3プレーヤ
停滞しているLPC2388の実験を再開すべく、先月仕入れておいた新ネタに手を出そうかと思います。いつものPropoxから購入したMMcodec01です。



TIのTLV320AIC23Bを使用したI2Sでつながるオーディオ・コーデックです。LPC2388のI2Sにつなげて、MP3を再生してみようという魂胆です。AT91SAM7のAPノートEmbDec.netのプロジェクト紹介ページでも、このコーデックを使ったMP3プレーヤーがあるので、一度試してみたいと思っていたのでした。このコーデックは今となっては古いチップのようですが、SOPパッケージがあるのでアマチュアでも手はんだできそうです。わたしは、Propoxにモジュールがあることに気がついて、安易にこいつを使うことにしました。

AT91SAM7の場合にはSSCをI2Sインタフェースとして機能させることが可能なので、上記の作例でもそのようにしてTLV320AIC23Bをつなげています。ところが、AT91SAM7ではフラッシュからコードを実行していると命令実行速度が遅いので、MP3のデコードが苦しくなるようです。上記の作例では、サンプリングレートを8KHzに制限してデコードの際のCPU負荷を低減したり、MP3デコーダーの部分のコードをRAM上に配置することにより命令実行速度を最適化することでこの問題の解決を図っているようです。このように、MP3デコードはAT91SAM7にとってはちょっと苦しい処理なのですが、LPC2388であればクロックも60MHz/72MHzと早いですし、フラッシュにコードを配置してもMAMの機能により、AT91SAM7ほどには実行速度が低下せずに済むのではないかと期待しているわけです。

さて、Propoxからの荷物にはいつもポーランドの切手が貼られているのですが、ちょっと不思議な図案だったのでパチリと一枚撮ってみました。どういう意味なんだろう?