相変わらず、Arduinoでクロマチックチューナー。
おかしな処理をしちゃう原因を探るために、計算途中
の変数をダンプとって、グラフ化してみることに。
まずは、440Hzの信号を入れた場合。
うん、うん。想定どおり。バッチリ。ちなみに、いくつか
の線がごちゃごちゃ重なるように表示されているけど、
1本1本がそれぞれ何cent分に相当する量をずらした場合の、
シフト後の波形。それぞれ、32、16、8、4、2、1、0、-1、
-2、-4、-8、-16、-32centずつ、ラの音(440Hz)から
ずらす想定の波形。
丁度真ん中で440Hz±0centの波形と重なってる状態。
当然、このロジックを通した結果は、440Hz±0centが
一番近いよ、と表示されるわけ。よし、よし。
続いて、他の音程も眺めてみる。F#(369.99Hz)。
おや?上下反転してる波形が出てくる…。
F(349.23Hz)。
おやおや?
C#(277.18Hz)。
おやおやおや?
C(261.63Hz)。
おやおやおやおや?
なんとなくわかってきたような…。
一部の波形が正負反転しちゃってるから、自己相関
取ろうとしても、真逆の位相なら相関は真逆に
なっちゃうよな。
んで、実際にDDSファンクションジェネレータから
読み込んだ波形での結果も、これらの「反転」
しているところだけが拾えてないっていう事実と
符合することが確認できた。
(でも、Fの音は、単に反転してるだけじゃない
ような感じがあるな…ちょっと後回し)
さらに内部変数を色々ダンプしてみて、反転しちゃう
計算がどこから来るのか、電卓使って確認中。
電卓で計算してみると、確かに反転するような波形
を吐き出しているみたい。unsignedとか、キャスト
とか、桁あふれとか、そんな単純なミスっていう
感じではなさそうだなぁ…
440Hzはうまく行ってて、他の周波数は反転したり
しなかったりっていうのは、何故なんだろう?
やっぱ、ちゃんとしたデバッガ環境が欲しいな。
シリアルデバッグは厳しいものがあるよなぁ。
もうちょっと細かく覗いてみないとな。反転しちゃう
条件がわかれば、一気にロジックは完成ってことに
なりそうなんだけどな。
一つの取っ掛かりとしては、0centずらす(つまり
全然シフトしない)状態では、反転するケースが
無いっていうことかな。
それ以外のcent値では、ことごとく反転している
ことを考えると、そこが糸口になりそう。
http://headlines.yahoo.co.jp/hl?a=20140118-00000001-jct-bus_all
660ccのケータハムセブン。だいぶスペックが
わかってきた感じ。
80PSはナカナカ。だけど、確かターボって言ってた
ような気がするな。NAで出して欲しいんだけどな。
お値段も結構だな。でも、ちゃんと軽枠なんだな。
|