2010年9月29日TweetPocket簡単な高速フーリエ変換ができるようになりましたが、なにも考えずに信号をフーリエ変換すると周波数特性がきれいにでない場合があります。これは信号に含まれる成分の波長がフーリエ変換する長さに会わなかった場合に発生するのですが、「窓」と呼ばれるものを使うとこの問題を低減できます。「窓」を作る機能もvDSPには用意されているので使ってみます。波長が信号(配列)の長さにおさまらない波形はキレイに解析できません。前の記事で最初に作った波形は30回振動する周期(つまり、波長が配列の長さの1/30になっている)ので、波形がぴったり配列におさまりキレイな周波数特性がでるのですが、これの周期を中途半端な少数などにしてしまうと、キレイな周波数特性はでなくなってしまいます。現実世界に存在する音声信号は基本的に後者(配列の長さに波長がぴったりおさまることはない)なので、これでは問題です。これは、こうやって信号を並べた時に両端に不連続な個所が発生してしまうためだとイメージしてください。するの?じゃあ波形の両端をつまんで0にしちゃって、無理矢理つながるようにしようぜという発想です。窓関数この、「両端をつまんで0にする」ために元の信号に対してかけ算をするのですが、その時に使われる関数のことを窓関数と言います。窓関数にはいくつか種類がありますが、vDSPの中にも用意されています。今回はその中でもシンプルなハニング窓というのを使います。窓を作る窓関数の使い方はちょっと特殊です。最初にvDSP_hann_window関数を使って「窓」を作ります。「窓」の長さ半分までしか作らないか、全体をつくるかを引数で渡します。窓の長さはフーリエ変換させる信号の長さと同じ長さ、最後の引数では0を指定して窓を最後まで作ってもらうようにします。0);窓がどうなっているか気になる人は、ログに出力してみてください。windowWave[i]);}信号に窓をかける元の信号に「窓」を掛けます。信号のかけ算にもvDSPの加減乗除の関数を使いましょう。512);信号の両端の音量が0になってつなぎ目がきれいになった信号windowedInputWaveができました。フーリエ変換するあとは、この両端が0になった信号を前回と同じく複素数に変換してから、フーリエ変換するだけです。FFT_FORWARD);vDSP_destroy_fftsetup(fftSetup);窓を使わなかった場合に比べて、周波数特性が正しくとれているはずなので周波数特性を出力して、確認してみてください。PMはい、そちらが正しいです。編集時に途中で切れてしまったので手動で書き直していた際に間違えてしまったようです...。コメントをキャンセルメールアドレスが公開されることはありません。*ウェブサイトご意見、ご感想をお願いします。その2ARを学ぶ10連休。折り返し地点までの記録。