マイコン工作実験日記

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

音声スペクトルを表示してみる

2009-01-17 18:40:09 | W-SIM
電話機ジャケットでの発着信はアッサリと動いてしまったので、少し機能拡張してみることにしました。LCDとしてVoIP GWと同じNokia 5110を使っていますので、まずは音声波形の表示機能を持ってきましたが、これだけでは進歩が無いのでこんどはスペクトル表示もやってみることにしました。(表示するのは相手側から受信した音声だけとします)



FFTした結果をグラフ表示してやればいいという程度の理屈はわかってはいたのですが、何しろFFTなんてやったことがありません。まずは、いつも参考にさせていただいているChaNさんのオーディオ・スペクトラム・モニタの説明を読んで、動画を見ると刺激をうけて自分もやる気がでてきました。秋月LCD用のソースコードはAVRのアセンブラで書いてありましたが、ハミング窓を通してからFFTをかけて、結果はログ・スケールで表示するのが良いことがわかったので、ARMでも同じ流れで処理してやれば良さそうです。

とは言っても、AVRのアセンブラをARMのアセンブラで書きなおすほどの根性も無いので、Cで書かれたFFTのサンプルを探してみました。DTMF検出の時と同じように整数演算命令で済む固定小数点で処理しているものが欲しいわけです。すると、酔漢さんが解説記事を書いておられるのを見つけました。わたしが知りたいと思っていたことが要領良く整理してあり、サンプルコードも提示されています。はい、そのまま使わせていただくことにしました。

音声の送受信はこれまでのジャケットと同じく、20ms単位でDMAしています。8000Hzサンプリングですので、160バイトに相当します。そこで、FFTは256点毎に行うこととし、160バイトを受信する毎にFFTをかける範囲をスライドしていくことにしました。FFTの結果は、4000Hzまでの範囲に相当する128ドット幅で表示したいところなのですが、残念ながらNokia 5110は横84ドットしかありません。周波数の低い方から84ドット分表示することにしたので、2645Hz以上の周波数成分は表示されていません。実際の処理としては、20ms毎にW-SIMからの受信タスク(wsim_recv_task)が256点のFFTを実行し、横84ドット分の波形ならびにスペクトルのビットマップを作成します。そして、LCD画面の更新要求がwsim_recv_taskからphone_taskに送られ、phone_taskがビットマップ情報をLCDに対してDMAすることで画面の更新が行われています。

上掲の写真は、シャッター速度が遅かったために画面が流れてしまい、その結果黒い帯状の表示になってしまっています。動画を見ていただいた方が雰囲気がわかると思います。



最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。