引き続き、AMDFを使ったピッチ計算で色々もがく。
いきなりプログラム組むとナニなので、例によって
表計算ソフトを使って数値シミュレーションしてみる。
作戦は、ADCから512点のデータを40000spsで正弦波を
サンプリングした状態をシミュレート。コイツを任意の
周波数に該当する時間分だけシフトしてみて、それが
元の波形と比較してどのくらいの誤差になるのかを
計算してみる。
アレコレ考えながら、とりあえずワークシートが出来た。
とりあえず、「補完」を行わずに、1サンプルは1サンプル
として整数値単位でシフトさせてみた結果。
220Hzで計算してみると、確かに丁度220Hz付近で
誤差が最小値になることを確認。
続いて440Hzの場合。440Hz付近の4つの周波数(438
~441Hz)で同一の最小値になった。
そう。シフトが整数単位(セル単位)だから、四捨五入
の結果、同じセル分だけずれたところを参照しちゃう
んだよな。これだと、1centはとても分離できないという
ところは予めわかってたところ。
とりあえずはココまで。
んで、この後は、整数単位ではなく、端数分を使って
按分することで、セル以下の数値に補完(直線補完)を
掛けてみるだな。
数値的にはきっと妥当な値まで追い詰めることがが出来る
だろうけど、問題は、計算速度に影響する「計算回数」
だな。
どうやったら計算速度を下げずに精度を保てるか。
シミュレーションで、手替え品替え、追い込んでいって
みよう。それができれば、Arduinoならすぐにスケッチに
落とせるだろう。
バイナリサーチ的な演算で追い込んでいけるといいんだ
けどなぁ。純粋な正弦波ならともかく、ノイズ混じりで
倍音混じりの信号となると、その手が通じるのかどうか…
あと、440Hzの波形を220Hz分だけシフトさせてみると、
当然だけどピッタンコ合っちゃうんだよな。(丁度
2波形分に相等するから)
こういうの、どうやって区別付けたらいいのかも、
一緒に考えておかないとな…。
|