くまデザインきんくまデザインブログお問い合わせFFTを自前で実装して周波数分析(Player10)2008/08/31こんばんは。近頃、大雨がすごいですね。夜中に雷を伴う雨が数日続くなんてことは生まれてこのかた、あんまり体験したことないんで驚いています。北京五輪で、雨を降らせないためにロケットを何十発も打ち込んだなんて話をきくと、「まさか、それと関係じなんてないよね?」なんて勘ぐってみたくなってしまう、今日この頃です。今回は周波数を分析するFFTについてです。Player9からSoundMixer.computeSpectrumっちゅう関数が実装されて、音を波形から周波数成分に分解することができるようになりました。それで、これはこれでよかったんですが、困ることもありました。それは、たとえばニコニコ動画とかをみながら、このメソッドを実行するswfが埋め込まれたページを開いたとします。すると、埋め込まれたページだけでなく、関係ないニコニコの音まで拾って解析しようとするんです。するとセキュリティサンドボックスエラーみたいなことが起こってうまく実行できなくなってしまうんです。Adobe標準のものじゃなくて、自前で実装しようと思いました。FFT(=高速離散フーリエ変換)を自分で一から実装するのは正直難しいです。これのアルゴリズムをどこかから移植しようと思いました。あって、Java版やExcel版の簡単そうなのを書き直してみたりしたんですが、いまいち動きません。私の理解不足なためにそうなってしまうんでしょう。それで、「もうだめだ!」と投げかけてたところに現れたのが、このページです。概略と設計法いや、すごい。大浦様、ありがとうございました。ソースはフリーで使ってもよいと書いてあったんでたぶん大丈夫でしょう。それで、ここから基本となるプログラムを移植して完成したものが、こちらです。→サンプルページ(要Player10)今回それなりにフーリエ変換について勉強しました。最後の部分に移植したFFTのプログラムを載せます。これの使い方なんですが、以下のようになります。・入力データサンプル数は2のべき乗個分用意する。2048)・出力されたデータは左右対称の形をしている。このうち右半分のデータは不必要なのでカットする。・カットしたデータが周波数成分表になるが、横軸の最大値がサンプリングレートの半分となる。(たとえば44.1kHzでサンプリングしているとき、22.05kHzが最大値となる。今回Player10の音生成とからめているので、Palyer10の音生成のサンプリングレートは44.1kHzのため、これにあてはまることになる。)・縦軸の単位はわからない。割合を表していると思う。(たとえば、棒が2本でていて、それぞれ3,7ぐらいの高さだとすると、その棒の位置の周波数成分が3:7の割合だということ)とりあえずソースです。今回Player10から登場したVectorクラスを初めて使ってみました。//データの読み込み。}}あと、おまけですがクライアント側のプログラムも載せときます。LINEスタンプ作りました!毎日使える。サウンドプログラミングこのブログについてこんにちは。フロントエンドエンジニアです。自作のiPhoneアプリを作っています。