この間からシミュレータ上で弄りまくっていたFFTの
アセンブラプログラムを実機に流し込んで動かして
みることに。
実機として使うのは、16Mhzクロックやシリアルコネクタ
搭載の自作のarduinoシリアルボード。前に作ったあれ。
http://brown.ap.teacup.com/nekosan0/242.html
これならAVRstudioやシリアル-USB変換ケーブルと
繋ぐだけで実験できるので。
ブートローダは要らないのでそこだけAVR-ISPmkII
から無効化しておく。普通にISP経由でHEXを書いて
使うというわけ。普通のMEGA328搭載ボードと一緒。
ADCから入力したデータに64点FFT掛けて、2乗和の
平方根を算出したものをUSARTからシリアル変換
ケーブルでPC側のtera-termでモニターしてみる
という流れ。
通信速度は出来るだけ速めの115200bpsとしてみる…。
イザ!
ひどい文字化け。プログラム上でのレジスタ設定がおかしい
のかなぁ…と思って見直してみるも、特に問題ないっぽい。
計算式も合っている。
ボード上のクロック源もクリスタルを使ってるので、
セラロックほど不正確なはずも無し。
ただ、16Mhzだと理論上の通信速度誤差が2.1%
(ダブラ使用時)と結構大きいのが気になるところ。
シリアルケーブル側の通信能力が追従していないのか、
それとも元の誤差がデカいからなのか…
ためしに57600bpsに変えて試してみる…。
動いた。特に問題なさそう。こんな感じ。
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,
2A,19,09,03,04,04,01,04,02,01,02,01,01,03,00,02,01,00,01,01,00,01,01,01,01,00,01,01,01,03,01,01,01,78,
3A,16,01,02,01,01,01,02,00,00,01,01,00,01,00,01,00,00,01,00,00,01,00,01,00,01,00,00,01,00,00,01,00,62,
3B,17,01,02,00,01,01,02,00,00,01,00,00,01,00,02,00,00,00,01,00,00,01,00,00,01,00,00,00,01,00,02,00,63,
3C,18,01,02,01,01,01,02,00,01,01,00,01,01,00,01,00,01,00,00,00,01,00,00,00,01,00,01,01,01,00,02,00,69,
3D,18,01,02,01,01,01,02,00,00,01,00,01,01,01,01,00,00,00,01,00,01,00,01,00,01,01,00,01,01,00,01,00,6A,
3E,18,01,02,01,01,01,01,00,00,01,00,00,00,00,01,00,00,01,01,00,01,00,00,01,01,00,00,01,01,00,02,00,68,
3E,19,01,02,00,01,01,02,00,00,01,01,00,01,00,01,00,00,01,00,00,01,00,00,00,00,00,00,00,00,00,01,00,65,
3F,19,01,02,01,01,01,02,00,00,01,01,01,01,00,01,00,00,00,00,00,01,00,01,00,01,01,00,01,00,00,01,00,6B,
40,19,01,02,01,01,01,02,01,01,01,01,01,01,00,02,01,00,00,00,01,01,00,00,00,00,00,01,01,00,00,01,00,6F,
41,19,01,02,00,01,01,02,00,01,01,01,01,01,00,02,01,00,01,01,00,00,00,00,00,01,00,01,01,01,00,01,01,71,
41,1A,01,02,00,01,01,02,00,01,01,01,00,01,00,02,00,00,00,00,00,00,00,01,00,00,01,00,00,00,00,01,00,6B,
42,1A,01,01,00,01,01,02,01,00,00,01,00,01,01,02,00,00,01,00,00,00,00,00,01,01,01,01,00,00,01,02,00,70,
通信速度は速い方が良いといえば良いんだけど、
まぁ実際のウケシンセでシリアル出力するときは
MIDI信号の速度域だから、この手のシビアな速度
については気にする必要ないでしょう。
とりあえずこのまま57600bpsで進めることに。
最初の1行目はFFTが掛かる前の初期化データだから
オールゼロはまぁ想定内。2行目以降にFFT結果を
順次出力。
それ以降は先頭の1バイトに大きなデータが出ている…
これは直流成分。実験に使った実機のアナログ入力端子
はオープンにしてたから、実際の電圧は不明のため、
合ってるかどうかは良くわかんない。
hamming窓を使っているので、直流成分の隣にも数字が
載っている…。この辺の周波数分解能がどの程度影響
するのか…。
最後の1バイトは直流成分から最大周波数までの
エネルギーを集計したもの。つまり全周波数の
エネルギー合計。これもそれなりに合っているっぽい。
うん。とりあえず今後アレコレ弄って試すための
材料はそろった感じ。
この後は、色んな周波数の信号をアナログ入力端子
から入れてみたらどんな出力になるのかを確認して
みたいところ。
周波数分解能とダイナミックレンジのせめぎあい。
そのあたりの動作の具合が見えてきたら、次は
オイラ特製のナイロン弦用ピックアップに繋いで、
フレットの特定と振動の強さをセンシングできるか
確認の予定。反応速度とか音量とかフレットの正確さ
とか。オペアンプ周りのフィルタの動作も気になる
ところ。
そこまで出来てしまえば、あとは味付けだけだからな。
もうちょっとだ…と思うんだけどな。



|
 |
|
|
|
|