音声帯域(0〜3.2KHz)のスペアナ製作
TOPページへ
声で動かすマウス
の完成を願って音声帯域のほぼリアルタイムスペアナを製作しました。
...LCD画面全体にスペクトル表示するように改造してみたのですが...↓の方
250Hzの方形波を入力した時のLCD画面です。右の数字は4つのピーク周波数をレベル順に表示しています。微分していくだけの方法なので時々、間違います(笑
作り終わって後悔している事:
入力にVRを付けておけば良かったなぁ
LCDのバックライトをパターンで配線しておけば良かったなぁ
ポーズSWを付けておけばよかったなぁ
ハードウェアーの製作
秋月電子のグラフィックLCD(SG12232)を使用して主に人の声のスペクトルを見る装置です。表示器が122x32ドットなので、それに合わせて製作していきます。プラケースも同じく秋月です。
回路図、パター図、部品配置図です。配置図で赤、黄緑、水色はジャンパーです。ビスの止め穴に六角ナットをハンダ付けしてスペーサーにしているので基板の裏へ部品をつけるのが困難になってしまいました。
PICとOP-AMPだけのオモチャですね。
マイクが拾った音声を増幅後、簡単なローパスフィルターを通します。特性は
こんな感じで4KHzで約-10dBになっています。LCDの縦軸は31dB(1dot=1dB)しかないので、この辺りで妥協しました。この信号は16KHzでサンプリングされます
ソフトウェアーの製作
アナログ入力の信号を16KHzでサンプリング後、4KHz以上が邪魔なので内部でローパスフィルターを通します。
MPLAB-C30 Free Student Edition
でコンパイル出来る様にdsPICのフィルターツールで係数だけ出力し、フィルター実行はDSPライブラリを使用しています。
FIRのタップ数は59です。このフィルターから出て来たデータを半分に間引いて8KHzサンプリングとして128ポイントづつ16mS周期でFFTにて周波数領域へ変換後、LCDへ出力しています。
LCDへの転送も含めてサンプリング以外の全ての処理に約4mS掛かっています。16KHz側のサンプリングに9mS分のFIFOバッファーを使用しているので後5mS程、他の処理が可能です。
HEXファイル
か
speana.c
MyDsp.s
MyDsp.h
をBuildしてdsPICに書き込んでください。Cソースファイルを一つにしたので見難いですが...
作る方は居ないと思いますが万一、作られた方は最新をダウンロードしましょう。予告無くバグフィックス、改良、変更しています。
6-17 バーがゆっくり下がるようにして見た(下の映像入れ替えた)
実行してみる
ニュースや音楽では右側の周波数が意味ないですね。もちろん「あーーー」と喋れば、一番上の周波数は止まってみえます。
自分で高い声を出しているつもりでもスペクトルは想像したのと違う動きをしているようです。さぁ、声で動かすマウスに行って見ようか!
LCD画面全体にスペクトルを表示してオーディオアクセサリ風に改造するのも、面白いかもしれません。
入力のFIFO無し、FIRフィルター無しなら、このデバイスのRAM容量で256ポイント32KHzサンプルが可能だと思います。(Yメモリーは複素データだけで一杯ですが...他は入らないかな?)
オペアンプのフィルターも安価マイク入力なら要らないでしょう。バーがゆっくり下がるようにすれば、「らしく」見えそうですね。(作ってみようかな?)
以前、仕事関係で録画した男声アナウンサーのニュース音声(NHK)入力時の映像です。マイクは良質の物を使用しましょう、無印良品だと2KHz以上が殆ど出てきませんでした。
「おまけ」
プログラムの前半にある#define VERSIONを2や3にしてコンパイルすると見た目が変わります。ソースファイルを参照してください
オーディオ用に改造してみた
サンプリング周波数32KHzで256ポイントへ変更してみました。ハードウェアーはC1とC3を取り除いただけです。
ところがマイクの具合が良くないのか、箕面スパーガーデンの福引で3等賞だったCDラジカセの具合が良くないのかLCDの左1/3にしかスペクトルが出てきません。低周波発信器をマイク入力に接続してやるとそれなりに出てくるようです。(1/fって言う奴かな?)
縦軸も30dBしかありませんし、おもしろく無いので周波数を16KHzに落としました。ライン入力を作ってやれば、良いのかもしれません。
ソースファイル全部とHEXファイル
です。speana.cの最初の方にある
#define SAMPLE_CLOCK 16 //サンプリング周波数
を変えればサンプリング周波数を変える事が出来ます。が42KHz以上にすると見た目は解りませんが処理が間に合わなくなります。(フレーム落ち?)
256ポイント処理毎にLCDをほぼ全面書換えている部分に約5mS掛かっています。これがボトルネックとなっているようです。サンプリング周波数16KHz時で62.5f/s、32KHz時で125f/sには間に合っています。
TOPへ戻る