STM32F4シリーズを使ってみる7 -Helix MP3 Decoderを実装してMP3ファイルの再生を行う-

マイコンを使った工作物としては入門となったMP3ファイルの再生ですが、今日日の
コアクロック100MHz越えのMPUならVS1053等の外付けのデコーダーICを使わずとも
ソフトウエアでデコードが可能です。
STM32F4にgiflibを載せて以来、次のステップとして(入院中もノートPCで)音楽再生に
挑戦していましたが私もようやく形にすることが出来ましたのでご紹介します。


すでにSTM32ではShuji009氏がHelixMP3Decorder挑戦されており、さらに野田篤司氏
libmadでMP3プレーヤーを製作されています
ねむいさんはこちらのBBSで公開されていたHelix+STM32F4Discoveryを利用したもの
大部分参考にさせていただきました。このプログラムはSPIポートを経由してSDカードから
データを取得しデコードを行う形になっていてハードウエア的には私のいつものとほぼ同じ
構成だったので非常に助かりました。
ソフトウエア的な点についてはChibiOS/RTを使用していたので私の非OS環境に移植する
ためにはさすがにそのまま転用は不可能で、一つ一つ動作を理解しつつ再構成していき
ました。

ChaN氏のファイラーはデータ転送用に容量固定値の汎用のSRAMを確保するようになって
いるのでそれを上手く使いSRAM容量を一切無駄にしないようにしています。また、I2Sへ
のデータ転送はリングバッファ構成でDMAするのでCPUにかなり余裕ができます。

あとSTM32F4を使い始めたころから何度も言及していますがCCM領域はDMA不可能
なのでCCM領域をスタックとして使い、自動変数にバッファを置くようなメモリの使い方を
していると特定困難な不具合になりますのでご注意ください。
…ってわざわざこういうこと書いてるのは自分で言ったにも係らず嵌ったということですorz。


ついでにいつものTFT-LCDにも各種情報を乗っけることにしました。
MP3のIDタグはv1とv2があり、v2でArtist/Titleが見つからなかった場合v1の方もくまな
く探すルーチンにしています。もちろん日本語表示もFontX2ドライバで対応してます♥


↑MP3ファイルを再生してるところ。48kHz/230kBpsでもSTM32F4はぱわふりゃーなので
 まったくの余裕です♥(※最適化オプションは必須です)


↑Riff-WAVEファイルももちろん再生可能です。WAVEのルーチンはChaN氏のWAVEPlayer
 FM3マイコン版を移植させていただきました。


MP3HelixのデコーダーはCBRとVBRをサポートしています。演奏中に全演奏時間や経過
時間をリアルタイムに表示するためにはCBRの場合はヘッダを除いたバイト数から容易
に算出可能です。しかしVBRの場合は少々厄介です。正確に算出したい場合は1フレー
ムあたりのビットレートからバイト数を計算しさらにそれを全フレームにわたって行う
必要がありますがもちろんこんなもんワンチップマイコンレベルではやってられない
のですが以下のプロセスで近似できます。

 ID2ヘッダ領域にあるXingと呼ばれるヘッダから全フレーム数を算出
◆.汽鵐廛襯譟璽箸ら1フレームあたりの時間を算出
   MPEG1Layer-3は1フレームあたり1152Sampleと定義付けられており、たとえば
   44.1KHzなら1フレームにかかる時間は((1152*10^3)/44100(Hz))=26mSecと近似できる。
 ,鉢△魍櫃韻襪帆躅藾媚間がミリ秒単位で得られる。

Xingヘッダーが無いと上記の技が使えませんので演奏時間/経過時間はめちゃくちゃに
なっちゃいます。殆どのMP3エンコーダーはXingヘッダーをちゃんと付与するのであまり
気にはなりませんが…。



今回のデモンストレーションで使用したaitendoさんのLCDはSPI接続オンリーなのですが、
STM32F4の性能のおかげでLCDへの転送をソフトSPIにしても音が一切途切れず余裕で
間に合うレベルです。STM32F4すごいってね、また一つ確信させていただきました!



てわけで先日より先行で紹介はしておりましたがソースコードを改めて紹介します
おまけでフリーで使用できるFontX2のフォントや隠れたメインコンテンツのTFT-LCD
ドライバも沢山(特にaitendoさんので初期化ルーチンが提示されてない品種)追加
しておりますのでこちらも併せて皆さんの参考としてください。

Comments

週末には反映します・・汗

  • 野田篤司
  • 2012/12/06 10:35 PM

ふぉーひびだんだったので、これも駄目かも。

MP3お疲れ様でしたー。フリー環境への移植を希望していましたので、うれしい限りですm(_ _)m。

今は、AVRに翻弄されていますが、次は、再びSTM32に翻弄される予定です。
ねむいさん環境をこっそりと構築中です(秘密です)。

  • Shuji009
  • 2012/12/07 12:34 AM

野田様、Shuji様こんばんは、ねむいです。


>週末には反映します・・汗
こっそり小さく書いてたの気付いてくれた…!
よろしくお願いします…


>ねむいさん環境をこっそりと構築中です(秘密です)。
うまくいかないと評判の私のビルド手順ですが、
いろいろ意見を戴いたお陰で大分マシになって
きていると(たぶん)思います…

すいません、一応反映しました。
全てのソースコードの先頭にライセンス文を書くのは大変なので、
雑誌「WEB+DB PRESS vol.69」GitHub特集記事のP30に「License.txtをリポジトリに配置し、README.TXTに何のライセンスを用いているのか記載」と書いてありましたので、License.txtとREADME.TXTを追加するに留めています・・・

  • 野田篤司
  • 2012/12/09 3:49 PM

野田様
ねむいです、こんばんは。

実は私がMIT/X11ライセンス避けた理由がNEW-BSDライセンスには無い"「重要な部分」
に著作権/承諾条件を表記しなければならない"というくだりだったのですが、
結局はプロジェクトがあるディレクトリのトップ等目につきやすい場所に宣言文
置いておいて出来れば各ファイルのヘッダでそこに誘導する今の形でまったく問題ないかと
思います。

これだとNEW-BSDライセンスとも共存出来ますし短いヘッダファイルに長々と
ライセンス表記があるという見ただけでげんなりする状態もなくなりますから…。

私の↑のレスにある
"承諾条件"(Agreement)とあるのは"免責条項"(Disclaimer)の
誤りです。お詫びして訂正します。

また、BSDライセンスとMIT/X11ライセンスの関係については
マイコン徹底入門でおなじみの川内氏が非常にわかり易くま
とめられていますので参考にしてください。
www.homu.net/2007/06/post_cd47.html

Post a Comment








Go to top of page