Copyright
(C) 2003-2008 << 信号処理 ランダム・ウォーク >>
フーリエ変換については、高速アルゴリズムがソースコードの形で、あちこちに公開されています。ただ使い方(パラメータの与え方や結果の見方)の敷居が高いことも単純にあると思うので、その辺を簡単に説明したいと思います。

フーリエ変換の関数が、例えば、
のように呼ばれるとします。Reは信号の実数部を格納するための配列、Imは信号の虚数部を格納するための配列、sizeはReとImのデータ数です。実数部、虚数部というのは、フーリエ変換後の周波数領域で位相(sin波の進み遅れ)を含めた波の状態を表すために複素数を用いることから必要になります。
例えば、処理したい信号が256個(高速アルゴリズムはデータ個数に2のべき乗を要求するので単純に合わせました)のデータだとすると、まずRe(実数部)に256個の信号を格納します。そしてIm(虚数部)には256個の零を格納します(時間領域の波形や空間領域の画像は実数データなので、複素数データに格納する場合虚数部には零が入ります)。最後にsizeには256を格納します。
fft( ,,, ); を実行すると、上図に示すようにRe(実数部)とIm(虚数部)が得られます。このときに有効なデータは配列の半分で、この場合には256の半分で128個です。配列の有効でない部分には、配列の中心に対して対称となるように同じ数値が入ってます。もし周波数領域で数値を与えて人工的な信号を作るなどするなら、こういう配列上の数値の並び(対称であること)には気をつける必要があります。
例えばグラフィック・イコライザを作るなら、有効データのそれぞれに対して上図に示すPowerを求めて( Power[n] = Re[n]*Re[n]+Im[n]*Im[n] )、低周波成分から並べて表示すれば良いことになります。位相を求める場合にもRe[n]とIm[n]に対して三角関数を使えば計算できます(位相を表示する例ってあまりないですけど、位相情報はかなり重要です)。
サンプリング周波数とナイキスト周波数( サンプリング定理 ):
サンプリング周波数は1秒間にサンプリングされるデータ数のことを表します。よくデジタル・オーディオなどでサンプリング周波数が 44100Hz と言われたりしますが、これは1秒間に44100個の割合でデータを得たことを示しています。この時に表すことのできる最高の周波数がナイキスト周波数で、サンプリング周波数の半分で 22050Hz となります。サンプリング周波数とナイキスト周波数の関係はサンプリング定理により表されます。
データ数とサンプリング周波数と周波数領域の分解能( 離散信号処理の限界 ):
サンプリング周波数 44100Hz でデータ数 256 の信号があるとすると、このデータをフーリエ変換した場合にナイキスト周波数 22050Hz でデータ数 128 の周波数表現が得られます。この時の周波数領域での分解能はおよそ 178Hz( 22050Hz/128 ) となります。おおざっぱに言っておよそ 178Hz 以下の周波数の差は区別できないことを、この分解能は意味してます。具体的には、例えば 150Hz の信号と 200Hz の信号があった場合に、上記条件では、フーリエ変換をかけても、150Hz のピークと 200Hz のピークを分離することはできません。二つのピークは見かけ上一つのピークに合わさってしまいます。
周波数領域の分解能を上げるには、データ数を増やせば良いことがわかります。ただし解析したい現象が無限に続くなら必要な周波数分解能が得られるまでデータ数を増やせば良いのですが実際にはそうはいきません。例えば解析したい現象が 0.1 秒で終わってしまうとすると、サンプリング周波数が 44100Hz の場合には 4410 点しか得られないことになります。この場合の周波数分解能はおよそ 10Hz になります。さきほどの 178Hz よりはかなり良くなりますが、もしより高い周波数分解能が必要になる場合には、ハードウェア的にがんばってサンプリング周波数を上げてデータ数を稼ぐ他には方法がありません。
これは一種の 不確定性 で、アルゴリズム開発者の苦労の元だと言えます。サンプリング周波数が同じなら、、、
・反応の速い現象(短い時間で終わってしまう)を解析しようとすれば、周波数分解能を上げることはできません。
・周波数分解能を上げようとすれば、反応の速い信号は解析できません。
この話はフーリエ変換だけに限った話ではなくて、離散的に行う場合の信号処理全般(いわゆるデジタル信号処理)について言えることです。
2003.3.25. sigprocrandwalk_at_gmail_com