【OTFFT: High Speed FFT library】

【Stockham FFT の漸化式の解】

 このページでは、Stockham のアルゴリズムの漸化式の解について調べてみます。 まずは、周波数間引き(DIF)の Stockham FFT の漸化式を見てみましょう。 ただし、\(W_N=\exp\left(-j\frac{2\pi}{N}\right)\),\(~j=\sqrt{-1}\) とします。

\[ \begin{eqnarray*} x_{h+1}(q,p) & = & x_h(q,p) + x_h(q,p + m) \\ x_{h+1}(q+s,p) & = & \left(x_h(q,p) - x_h(q,p + m)\right)W_N^{sp} \\ q & = & 0,1,\ldots,s-1 \\ p & = & 0,1,\ldots,m-1 \end{eqnarray*} \]

 離散フーリエ変換の系列長を \(N\) とするとき (\(N=2^L,~L=0,1,2,3,\ldots\))、 離散フーリエ変換に係数 \(N^{-1}\) を付けるか付けないかで漸化式に定数倍の差がありますが、 ここでは係数 \(N^{-1}\) を付けない流儀で考えます。

 \(n=2^{L-h}\),\(~m=2^{-1}n\),\(~s=2^h\),\(~x_h(q,p)=x_h[q+sp]\) とおくと、 \(x_h[~]\) が計算 \(h\) 段目の配列を表します。 入力系列 \(x_0[~]\) から始めて \(x_L[~]\) を求めると離散フーリエ変換出来ます。 この漸化式の解は、天下り式になってしまいますが以下のようになります。

\[ x_h(q,p) = \left(\sum_{r=0}^{s-1}x_0[p+rn]W_s^{qr}\right)W_N^{qp} \] \[ q = 0,1,\ldots,s-1 \\ \] \[ p = 0,1,\ldots,n-1 \]

 本当に解になっているか確認してみましょう。まずは \(h=0\) のときと \(h=L\) のときの値を確認してみます。\(h=0\) のとき \(q\) のとりうる範囲は \(q=0\) のみです。また、\(h=L\) のとき \(p\) のとりうる範囲は \(p=0\) のみです。 以上のことを踏まえて式を変形すると以下のようになります。

\[ \begin{eqnarray*} x_0(0,p) & = & x_0[p] \\ x_L(q,0) & = & \sum_{r=0}^{N-1}x_0[r]W_N^{qr} \end{eqnarray*} \]

 確かに、\(h=0\) のときに入力系列になり、 \(h=L\) のときにその離散フーリエ変換になっています。 それでは、途中経過を確認してみましょう。\(W_N^{qm} = W_{2s}^q\), \(W_{2s}^{sr} = (-1)^r\) という関係が成り立つことに注意して、 漸化式の左辺と右辺をそれぞれ計算すると以下のようになります。

\[ \begin{eqnarray*} x_{h+1}(q,p) & = & \left(\sum_{r=0}^{2s-1}x_0[p+rm]W_{2s}^{qr}\right)W_N^{qp} \\ x_h(q,p)+x_h(q,p+m) & = & \left(\sum_{r=0}^{s-1}x_0[p+rn]W_s^{qr}\right)W_N^{qp} + \left(\sum_{r=0}^{s-1}x_0[p+m+rn]W_s^{qr}\right)W_N^{q(p+m)} \\ & = & \left(\sum_{r=0}^{s-1}x_0[p+2rm]W_{2s}^{2qr}\right)W_N^{qp} + \left(\sum_{r=0}^{s-1}x_0[p+m+2rm]W_{2s}^{2qr}\right)W_N^{qp+qm} \\ & = & \left(\sum_{r=0}^{s-1}x_0[p+(2r)m]W_{2s}^{q(2r)}\right)W_N^{qp} + \left(\sum_{r=0}^{s-1}x_0[p+(2r+1)m]W_{2s}^{q(2r)}\right)W_N^{qp}W_{2s}^q \\ & = & \left(\sum_{r=0}^{s-1}x_0[p+(2r)m]W_{2s}^{q(2r)}\right)W_N^{qp} + \left(\sum_{r=0}^{s-1}x_0[p+(2r+1)m]W_{2s}^{q(2r+1)}\right)W_N^{qp} \\ & = & \left(\sum_{r=0}^{2s-1}x_0[p+rm]W_{2s}^{qr}\right)W_N^{qp} \end{eqnarray*} \]
\[ \begin{eqnarray*} x_{h+1}(q+s,p) & = & \left(\sum_{r=0}^{2s-1}x_0[p+rm]W_{2s}^{(q+s)r}\right)W_N^{(q+s)p} \\ & = & \left(\sum_{r=0}^{2s-1}x_0[p+rm]W_{2s}^{qr+sr}\right)W_N^{(q+s)p} \\ & = & \left(\sum_{r=0}^{2s-1}x_0[p+rm]W_{2s}^{qr}(-1)^r\right)W_N^{(q+s)p} \\ & = & \left(\sum_{r=0}^{s-1}x_0[p+(2r)m]W_{2s}^{q(2r)} - \sum_{r=0}^{s-1}x_0[p+(2r+1)m]W_{2s}^{q(2r+1)}\right)W_N^{(q+s)p} \\ \left(x_h(q,p)-x_h(q,p + m)\right)W_N^{sp} & = & \left(\left(\sum_{r=0}^{s-1}x_0[p+(2r)m]W_{2s}^{q(2r)}\right)W_N^{qp} - \left(\sum_{r=0}^{s-1}x_0[p+(2r+1)m]W_{2s}^{q(2r+1)}\right)W_N^{qp}\right)W_N^{sp} \\ & = & \left(\sum_{r=0}^{s-1}x_0[p+(2r)m]W_{2s}^{q(2r)} - \sum_{r=0}^{s-1}x_0[p+(2r+1)m]W_{2s}^{q(2r+1)}\right)W_N^{(q+s)p} \end{eqnarray*} \]

 確かに漸化式を満たすようです。これでこの式が、 間違いなく Stockham のアルゴリズムの漸化式の解だと確認されました。 しかし、この漸化式を満たす式はこの解だけではありません。 実は、以下のような式もその解になります。

\[ \begin{eqnarray*} x_h(q,p) & = & \frac{1}{n}\sum_{r=0}^{n-1}y[q+rs]W_n^{-pr} \\ q & = & 0,1,\ldots,s-1 \\ p & = & 0,1,\ldots,n-1 \end{eqnarray*} \]

 これも確認してみましょう。\(W_n^{-mr}=(-1)^r\), \(W_N^{sp}=W_n^p\) という関係に注意して、 漸化式の右辺と左辺をそれぞれ計算すると以下のようになります。

\[ \begin{eqnarray*} x_{h+1}(q,p) & = & \frac{1}{m}\sum_{r=0}^{m-1}y[q+2rs]W_m^{-pr} \\ x_h(q,p)+x_h(q,p+m) & = & \frac{1}{n}\sum_{r=0}^{n-1}y[q+rs]W_n^{-pr} + \frac{1}{n}\sum_{r=0}^{n-1}y[q+rs]W_n^{-(p+m)r} \\ & = & \frac{1}{n}\sum_{r=0}^{n-1}y[q+rs]W_n^{-pr}(1+W_n^{-mr}) \\ & = & \frac{1}{n}\sum_{r=0}^{n-1}y[q+rs]W_n^{-pr}(1+(-1)^r) \\ & = & \frac{2}{n}\sum_{r=0}^{m-1}y[q+2rs]W_n^{-2pr} \\ & = & \frac{1}{m}\sum_{r=0}^{m-1}y[q+2rs]W_m^{-pr} \end{eqnarray*} \]
\[ \begin{eqnarray*} x_{h+1}(q+s,p) & = & \frac{1}{m}\sum_{r=0}^{m-1}y[q+s+2rs]W_m^{-pr} \\ & = & \frac{1}{m}\sum_{r=0}^{m-1}y[q+(2r+1)s]W_m^{-pr} \\ \left(x_h(q,p)-x_h(q,p+m)\right)W_N^{sp} & = & \left(\frac{1}{n}\sum_{r=0}^{n-1}y[q+rs]W_n^{-pr} - \frac{1}{n}\sum_{r=0}^{n-1}y[q+rs]W_n^{-(p+m)r}\right)W_N^{sp} \\ & = & \left(\frac{1}{n}\sum_{r=0}^{n-1}y[q+rs]W_n^{-pr}(1-W_n^{-mr})\right)W_n^p \\ & = & \left(\frac{1}{n}\sum_{r=0}^{n-1}y[q+rs]W_n^{-pr}(1-(-1)^r)\right)W_n^p \\ & = & \left(\frac{2}{n}\sum_{r=0}^{m-1}y[q+(2r+1)s]W_n^{-p(2r+1)}\right)W_n^p \\ & = & \frac{1}{m}\sum_{r=0}^{m-1}y[q+(2r+1)s]W_n^{-2pr} \\ & = & \frac{1}{m}\sum_{r=0}^{m-1}y[q+(2r+1)s]W_m^{-pr} \end{eqnarray*} \]

 確かに途中経過は OK のようです。 では、\(h=0\) のときと \(h=L\) のときはどうでしょうか? それぞれ計算してみると以下のようになります。

\[ \begin{eqnarray*} x_0(0,p) & = & \frac{1}{N}\sum_{r=0}^{N-1}y[r]W_N^{-pr} \\ x_L(q,0) & = & y[q] \end{eqnarray*} \]

 何と、入力系列が出力系列の逆離散フーリエ変換になってしまいました。 ちょうど、先の解を逆に考えたものになっているわけです。 これはすなわち、 漸化式を \(x_{h+1}(q,p)\) から \(x_h(q,p)\) を求めて逆にたどると、逆離散フーリエ変換できるということです。 実際、そのように漸化式を解いてみましょう。以下のようになります。

\[ \begin{eqnarray*} x_h(q,p) & = & \frac{1}{2}\left(x_{h+1}(q,p)+x_{h+1}(q+s,p)W_N^{-sp}\right) \\ x_h(q,p+m) & = & \frac{1}{2}\left(x_{h+1}(q,p)-x_{h+1}(q+s,p)W_N^{-sp}\right) \end{eqnarray*} \]

 漸化式の定数倍は、離散フーリエ変換に係数 \(N^{-1}\) を付けるか付けないかの差なので、ちょっと定数を省略してみましょう。 以下のようになります。

\[ \begin{eqnarray*} x_h(q,p) & = & x_{h+1}(q,p)+x_{h+1}(q+s,p)W_N^{-sp} \\ x_h(q,p+m) & = & x_{h+1}(q,p)-x_{h+1}(q+s,p)W_N^{-sp} \end{eqnarray*} \]

 ん?これどこかで見たことあるぞ。 そうこれは時間間引き(DIT)の漸化式そっくりです。 \(h\) の増え方が逆になっていることと、\(W_N^{sp}\) が \(W_N^{-sp}\) になっているところが違いますが、全体の形は DIT の漸化式そのものです。

 フーリエ変換あるいは逆フーリエ変換の入力系列をその複素共役で置き換え、 変換の式全体の複素共役をとると、 フーリエ変換と逆フーリエ変換は定数倍を除いて互いに入れ替わります。 すなわち、\(y[~]\) をその複素共役で置き換えて、 漸化式全体の複素共役をとると、 逆フーリエ変換の漸化式はフーリエ変換の漸化式になります。 さらに、\(h+1=L-i\) と置いて \(h\) を \(i\) に番号を付け替えて考えると漸化式は以下のようになります

\[ \begin{eqnarray*} y_{i+1}(q,p) & = & y_i(q,p)+y_i(q+s,p)W_N^{sp} \\ y_{i+1}(q,p+m) & = & y_i(q,p)-y_i(q+s,p)W_N^{sp} \end{eqnarray*} \]

 おお、DIT の漸化式になりましたね。ここで、 \(t=2^{L-i}\),\(~s=2^{-1}t\),\(~m=2^i,~y_i(q,p)=y_i[q+tp]\) とおくと、 \(y_i[~]\) が計算 \(i\) 段目の配列を表します。 入力系列 \(y_0[~]\) から始めて \(y_L[~]\) を求めると離散フーリエ変換出来ます。このように、 DIF の漸化式と DIT の漸化式は互いに逆の関係にあると考えることができます。

 最後に、DIT の漸化式の解の正式版を示しておきましょう。 定数倍を省略したり、複素共役をとったり、 添え字を \(h\) から \(i\) に付け替えたりしたので、 最初のものから少し形が変わります。

\[ \begin{eqnarray*} y_i(q,p) & = & \sum_{r=0}^{m-1}y_0[q+rt]W_m^{pr} \\ q & = & 0,1,\ldots,t-1 \\ p & = & 0,1,\ldots,m-1 \end{eqnarray*} \]