頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


iPhoneのマイクからの音をリアルタイムFFTで認識する

iPhone向けVRアプリを作る時に入力方法として加速度センサーを使うってのを考えてみたけど、
iPhone 6の加速度センサで移動した距離の計測
↑やっぱり使えそうにないって話をこの前書いたんだわ。

その次に思いつくのは音を利用するってアイデア。例えば手を叩くとミサイルを発射するとかそういう感じね。

そういうのを実現するにはどうするのかなあ、、、?といろいろ調べたんだけど、これが結構大変で。
とにかくフレームワークも(Apple外のも)いろいろあるし、当然用途によってどういうフレームワークを使うかもあるもんね。
かなりの時間さまよってた結果、ようやくいいページを発見。

Capture iPhone microphone | Stefan Popp
↑このあたりを参考にとりあえずiPhoneのマイクからの音をFFTで周波数ごとのスペクトルを得るってのをやってみたところ何やら数値は得ることができた。


iOSで高速フーリエ変換を使う - Qiita
↑ここみたいにiOSでFFTってのは調べたらいいページがいろいろあると思う。

ちなみにマイクから拾ってきたデータは(上記のサンプルコードだと)SInt16って2バイトの整数でもらうのでFFTするのにfloat(4バイト)でメモリを再割り当てしてる。

FFTがホントにできてるの?ってのを確認するため

トーンジェネレータ
↑この「トーンジェネレーター」ってアプリをiPadで実行。

FFT結果
↑イコライザーアプリにあるような周波数ごとのグラフみたいなのを作ればいいんだろうけど、それは面倒だったのでとりあえずUIViewの位置を変えてるだけ(縦軸が周波数(対数)、横軸がスペクトルとして)。
とりあえず音源の周波数を変えるのに従ってグラフも変化していくのは確認できた。


ここまではいいんだけど、、、
例えば手を叩いたってのを検出したいとするよ。最初にベースとする手を叩いた音のデータを取っておいて、後はマイクから入ってきた音と比べることになるんだろうけど、じゃあどうやって二つの音が「似ている」って評価すればいいんだろう?

周波数で区切って平均でも取って最初に登録しておいたデータとの差分の合計を見るとか?
なんてのがすぐ思いつくとこだけど、実際やってみたけどなかなかうまくいかないんだわ。

なんせ同じように作った音(手を叩くでも鉛筆で机を叩くでもいい)が周波数分析するとやるたびに結構ばらつくんだ。フィルターかけたりなんかノウハウあるんだろうなあ。

結局、大きい音は拾えるからある一定の音より大きかったら入力ありと判断する、なんてのが現実的だったりするというなんともねえ。ああ、情けない、、、orz



音に関する基本的な知識について、参考になったページ:
音(声)の高低を検出する方法を真面目に書く - キノコの自省録

<< 傑作テニスゲーム Tennis Bitsの操作方法  TopPage  ヨーグルトメーカーで低脂肪ヨーグルトをタネに使えるか? >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1018-06eff510




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad