未踏作業日誌――余計なもの作るよ!

未踏の作業日誌的なものを書きましょうということで書くことにしました.余計なことばっかりしています.

MPMアルゴリズムを実装してみた

GistにMPMアルゴリズムC++実装をアップしてみた.

https://gist.github.com/GRGSIBERIA/735e8727c4e0c152a841

 

もともとのコードがJavaだったので,C++で動くように色々と変更しつつ,多少コードを綺麗にしたりしてみた.2~3時間ぐらいかかったような気がする.

ウィーナー・ヒンチンの定理でFFT2回とNSDFで最大になる場所を求めれば,自己相関関数の周期を求めることができるらしいのだけれども,FFTを2回もやる必要は全くなく,NSDFとzerocrossingを求めるだけでできてしまった.ソースコードの中でFFTをやってるとは思えないし,論文と実装を照らしあわせてもNSDFだけで求められてしまったので混乱している.でも,とりあえず動いたのでよかった.

実際に実装して動かしてみたものの,とてもリアルタイムでは動かせない速度になってしまって困ってる.窓幅を変えてやってみると,もしかするとO(4^n)アルゴリズムなんじゃないかと思うぐらい,処理速度がブレてしまって困っている.

精度はそこそこ良いものの,時間応答性能がとても低い.比較的明瞭なサイン波に近いものであれば,簡単に検出することは可能であるものの,和音を弾いた場合は全く使い物にならないことがわかった.速度に関しては参考にしたところの実装が悪いような気がする.論文の作者の人がシステムを公開しているから,少し試してみたほうがいいのかもしれない.

 

明日になったら実験環境を構築して,ギター一本試してみようかなと思う.単音と和音の検出精度と,時間応答性能について実験をしてみたい.