フーリエ変換と離散フーリエ変換
1次元フーリエ変換とは、1次元関数を、さまざまな周期の正弦関数(いわゆる三角関数のsin、位相は0でなくてもよい)に係数をかけたものの和と考え、その係数の集まりとして表現しようというものです。
まず簡単のため、有限長区間の繰り返しで表現される関数の場合で説明します。
一般に有限長区間の繰り返しで表現される、連続で滑らかな1次元関数は、区間の平均値である直流成分と、その区間を1周期とする正弦関数、その区間を2周期とする正弦関数、その区間を3周期とする正弦関数、...のそれぞれに係数(重み)づけした和(無限線形和)として書き表すことができます。
その係数は、さまざまな周波数成分がどれだけ含まれているかの量を示します。
特にその繰り返し区間が-∞から+∞まで広がった時、これは無限和というよりは、その極限である積分になります。
このような関数f(x)のフーリエ変換F(w)は、以下のように与えられます。
ただし本来はこれにある定数を掛けるべきなのですが、ここでは重要でないので省略します。
∫は積分範囲-∞から+∞までの定積分、exp()は自然対数の底e(2.71828...)を底とする指数関数、iは虚数単位です。
F(w) =∫f(x) * exp(-iwx) dx
フーリエ変換に対し、離散フーリエ変換(DFT)を考えることができます。
すなわちf(x)の定義域をN個に離散化し、関数でなくN個の数字f0、f1、...、f(N-1)を入力とし、やはりN個の数字F0、F1、...、F(N-1)を出力とする、N次元ベクトルからN次元ベクトルへの変換です。
数式では以下のように表現されます。
やはり定数との積は省略します。
Σはk=0からk=N-1までの級数、exp()は自然対数の底eを底とする指数関数、iは虚数単位です。
Fj = Σfk * exp(-2πijk/N)
Σは苦手だという人のためにもう少しわかりやすく書くと、以下の通りです。
Fj =f0 +f1 * exp(-2πij/N) +f2 * exp(-2πij2/N) +f3 * exp(-2πij3/N) + ・・・ + f(N-1) * exp(-2πij(N-1)/N)
ここでf0の係数が1である理由は、k=0だとexpの中味が0となり、eの0乗は1だからです。
こういった例外的な係数の場合を無視すれば、あるjについてFjを計算するためには、fの値とexpの値との乗算をN回行うことになります。
jも0からN-1まで動きますから、結局離散フーリエ変換全体としては、N**2(Nの二乗)回の乗算が必要です。
なお、expの値は、fの各値に関係なくあらかじめ計算できるので、定数としてメモリなどに用意しておくのが普通です。


