マイコン工作実験日記

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

CMSIS-DSPのグライコを試す

2013-07-05 21:38:03 | SAM4
SAM4LにつなげたSPI LCDでスペクトル表示を行うべく、その手段を調査中です。まずは、以前から使ってみようと思っていたCMSISに含まれるDSP Software Libraryを準備すべく最新版のCMSISをダウンロード。ドキュメント一式も中に含まれています。これまでも、CMSIS-COREの部分のAPIを使ってはいたのですが、CrossWorksのCPUサポートパッケージの中に含まれているものを使っていただけだったので、CMSIS一式をちゃんと見てみるのは初めてになります。

今回はDSP Libraryの部分を使ってみたいので、CMSIS-DSPの部分に目を通します。このライブラリ、Cortex-M3, M4だけでなくM0やM0+までサポートするようにできているのですね。SAM4LはCortex-M4なので、マクロARM_MATH_CM4を定義して、コンパイルしてやります。FPUが使える場合には__FPU_PESENT = 1 とすれば良いのですが、SAM4LはFPU無しなのでこれは必要無し。

さて、DSP libraryにはexampleもいくつか含まれているのですが、そのひとつとしてグライコ(Graphic Audio Equalizer Example)が用意されています。Exampleでは、あらかじめ用意されたオーディオデータをグライコ処理を通して、その結果を確認するというものになっていますが、処理の中心部分は5つのバンドに対応する 5本の 4次のBiquad IIRフィルターを通すというものになっています。演算処理には固定小数点形式であるq31_tを使っているので、このサンプルをほとんどそのままSAM4Lで動かしてみることにしました。Exampleの説明文中では明記されていませんが、周波数特性のグラフを見ると44.1KHzサンプリング用に設計されたフィルターであることが読み取れますので、Biquadフィルターの係数はそのまま流用することができます。

現在、音楽の再生処理はDMAを使って128サンプル毎にIISCで取り込んで、そのままABDACBに送っています。そこで、そのまま送るのではなく、イコライザー処理に対応するIIRフィルターを通した結果を送るようにしてやれば、イコライザーを通した結果を実際に耳で聞くことができます。まずは、試しに左チャンネルだけイコライザを通して、右チャンネルはそのまま再生することにしてみました。

結果、クロック24MHzでは動きませんでした。イコライザーのフィルタ処理は、128サンプル毎に行いますが、当然のことながら、次の128サンプルの受信が完了する前までに終了させねばなりません。44.1KHzサンプリングなので、128/44100 = 0.0029となりおよそ3msで処理を終えねばならないのですが、処理速度が足りずに間に合いません。しょうがないので、一気に48MHzにクロックを上げてみると、ちゃんと動くようになりました。FREQMを使って調べてみると....


となり、およそ38MHzのCPUクロック速度を必要としていることがわかります。FREQMでのクロック数計測には7.6msほどかかりますので、この間に2回はDMA終了割り込みに伴いイコライザー処理が走ります。そのため、FREQMの計測結果は、イコライザー処理によるCPU負荷に応じて変化します。SAM4Lでは48MHzがクロックの上限なので、とてもじゃないけどステレオ処理には力不足であることがわかります。

今のところ、サンプルのコードをそのまま持ってきただけなので、イコライザーのゲイン設定は固定となっていますが、イコライザーを通すと音が変わることが良くわかります。ちょっと手を加えればCLIからバンド毎にゲインを設定できるようになるので、やってみようかな。また、DSP LibraryのBiquad IIRフィルタには、高速処理が可能なAPIも用意されているので、そちらを使うようにプログラムを修正してみるつもりです。