「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



なんとなく、解ったような、解らないような、
中途半端な状態で放置してあったので、あらためて
YINについて調べなおす。

http://audition.ens.fr/adc/pdf/2002_JASA_YIN.pdf

YINといえばこの英文pdf。
これまで、なんとなく開いてはメゲる感じだった
んだけど、ちょっと気合を入れて、ある程度読み
込んでみた。

ざっくり、以下の6つのステップで計算していく
感じと書いてあるみたい。

(1)自己相関について
(2)差分関数について
(3)差分関数の累積平均正規化
(4)絶対域(テーパード処理?)
(5)放物線補間
(6)一番近いところの推定

AMDFとくらべて大きく違うところは、テーパード化
してオクターブエラーを防ぐっぽい作戦っぽいのと、
補間を放物線で行うあたりかな。


(1)は、AMDFとかと同様に、1波形分だけ位相を
ずらして、自己相関取ることで周期を計算。

(2)は、ちょうど1周期ずれたときに差分のシグマ
がゼロ(つまり一致する)して、そうじゃないときは
ゼロじゃない値で求まると。

(3)は難しそうな内容なので、ちゃんと解ってるか
自信ないけど、ズレ量が1波形分のときと、まったく
ズレて無いとき(F0)のときのの各差異について、
後続で意識せずに扱えるようにノーマライズする式
みたい。

(4)は、1番目の一致する周波数(F1)と、それ以降
(F2、F3…)を区別できるように、テーパードさせる
計算みたい。

(5)は、サンプリングしたデータを、線形補間じゃなく、
放物線補間をかけるみたい。

(6)で、ようやく一番近い周波数をピックアップして
完了、と。


この中で、(3)や(4)はクロマチックチューナー
でも、今回狙っているような、オクターブ違いを
ちゃんと表示することをやろうとすると、ちゃんと
必要になるところ。
(注:普通のクロマチックチューナーでは多分不用)


というわけで、オイラが実装したコードは、どうやら
AMDFでもYINでもなく、その中間的なコードということ
みたいだな。

Arduinoの処理速度とメモリだと、当然限度があるから、
ロジックの工夫で何とかしないといけないもんで…


まぁ、大体解ったところで、次の一歩を進めよう。


http://www.nicovideo.jp/watch/sm22586371
ゲーグラTV29回。新年からやはり任天堂だったな。


http://galaxyheavyblow.web.fc2.com/93.html
ワンパンマンの最新話が出てた。


http://www.cronos.ne.jp/kit/
くろのすさんの頒布品に、PSoC3, PSo5LP対応の
PSoCプログラマ/デバッガが加わった。おぉ。

PSoC4は対応しないみたいだなぁ…。



コメント ( 0 )