第6章
離散フーリエ変換
この章のねらい
- 周波数 ω を ω_k=2πk/N でサンプリングして DFT の式を導ける
- 周波数を離散化すると時間側が周期的になる双対を説明できる
- N点⇄N点の有限変換であること、FFT が O(N log N) で同じ DFT を速く計算する仕組みを理解する
6.1 DTFT の困るところ
第5章で数列のフーリエ変換(DTFT)が完成したお。 だお。これでコンピュータの信号も周波数に分解できる…はずだお?
理論上はな。だが章の最後にお前自身が言った困りごとが2つある。覚えているか。
えーと…。 が連続変数だから、 全部の値はコンピュータに持てない、って言ったお。あ、もう1個あるお。和 は から まで足すことになってるお。無限個は足せないお!
その2つだ。整理しよう。DTFT がそのままでは計算機に乗らない理由は、
- 周波数 が連続( の中に無限個の点がある)
- 時間 が無限に長い(和が から まで)
時間側の問題は、実は簡単に片付く。実際に手元にあるデータは有限個、例えば 個 だけだ。それ以外を とすれば和は 項で止まる。残るのは周波数が連続という問題だ。
時間を有限で打ち切るのは分かるお。じゃあ周波数のほうは…。あ、第4章で時間を離散化したのと同じことを、今度は周波数でやればいいんじゃないかお?
それだ。発想がもう身についてきたな。時間軸でやった「とびとびに拾う」を、そっくり周波数軸でやる。
6.2 周波数領域を離散化する
連続な の代わりに、 から までを 等分したとびとびの周波数だけを見る。
DTFT の1周期 に等間隔で 本の「物差しの目盛り」を打つイメージだ。この を式 (5.3) に代入し、和を有限の 項に切ると
これが離散フーリエ変換(Discrete Fourier Transform、DFT)だ。 個の数列 から 個のスペクトル値 を作る。
おお、 も無限和も消えて、有限の足し算だけになったお! これならコンピュータで回せるお。 もカギ括弧で、ただの配列だお。
そうだ。 は「 番目の周波数ビン」と呼ばれる。 が大きいほど高い周波数(ただし が を超えると負の周波数側になる、これは後で見る)。下のデモで、固定した信号(長さ8の矩形パルス)の DTFT 曲線の上に、 点 DFT のビンがどう乗るかを見てみろ。 を動かせる。
これ、第3章で見たやつと同じ気持ちになるお! あのとき周期 を伸ばすと線スペクトルの棒が密になっていったお。今回は を増やすと棒が密になる。けど…曲線(破線)はずっと同じ形だお。
完璧な観察だ。DFT は DTFT という連続曲線を、 という点で拾った標本値にすぎない。 は「周波数の物差しを何目盛りで刻むか」を決めるだけで、信号そのものの情報量を増やしも減らしもしない。棒が乗っている曲線が真実で、棒はその上の点を拾っているだけだ。
サンプリングって、時間でも周波数でも結局おんなじことなんだお。
いいまとめだ。そして、ここでまた双対が顔を出す。第3章で「時間側が周期的だと周波数側は離散」、第5章で「時間側が離散だと周波数側は周期」を見た。今度は周波数側を離散化した。すると鏡写しに、時間側が周期的とみなされる。
え、時間が周期的? は別に周期信号じゃないお。長さ の有限の数列なだけだお。
そこが DFT の最大の落とし穴だ。逆変換でわかるが、 から を組み立て直すと、 が の外でも値が出てきて、それは周期 で同じパターンを繰り返す。DFT は心の中で「 は周期 で無限に続く周期信号だ」と思い込んで計算している。だから第3章の対応の鏡写しが完成する。
- 周波数を離散化(DFT のビン)した ⇒ 時間側が周期 とみなされる
第3章「時間が周期的⇔周波数が離散」を、左右ひっくり返した形だ。
6.3 離散フーリエ逆変換
順変換 (6.2) で 個の から 個の を作った。逆に戻す離散フーリエ逆変換(IDFT)はこうだ。
順変換 (6.2) とそっくりだお。違いは、肩の符号が から に変わったのと、頭に が付いたことだけだお。
その通り。第5章の逆変換 (5.5) では だったのが、周波数も離散になったので積分が和に変わり、 になった。係数 が に化けたのも、周波数の刻み幅が になったことの帳尻合わせだ。順変換が「全周波数のビンで和」、逆変換も「全時間で和」。どちらも有限和で、対称的にきれいだろ。
順も逆も有限の足し算で閉じてるお。やっと全部がコンピュータで完結するんだお。
そうだ。ここに至って、信号処理はついに「紙の上の積分」を完全に離れて、配列と足し算と掛け算だけの世界に降りてきた。これが実際に走るフーリエ変換だ。
6.4 離散フーリエ変換のまとめ — 行列として見る
DFT (6.2) をもう一度眺める。 個の入力 から 個の出力 への変換だ。各 は の重み付き和。これは行列とベクトルの掛け算そのものだ。
を 成分とする 行列を ベクトルに掛ければ ベクトルが出る、というわけだ。
ってのは、 等分した円周を1目盛り進む回転因子かお。 は「 周ぶん時計回りに回す」やつだお。
その通り、回転因子と呼ぶ。行列の各行 は「周波数 の複素正弦波」、すなわち DFT の基底ベクトル になっている。DFT とは結局「入力ベクトルを、これら 本の正弦波基底に分解する」操作だ。各基底がどんな波か、下のデモで を動かして見てみろ。上が実部 、下が虚部 だ( 固定)。
は全部 で平ら(直流)だお。 を上げてくと振動が速くなって、 で の交互(一番速い)になるお。…で、 以上にすると、またゆっくりに戻るお! なんて にそっくりだお。
そこが急所だ。()を境に、 のビンは負の周波数を表す。 は の逆回転、つまり は と同じこと。第4章・第5章でやった「 と (あるいは )は区別がつかない」がここでも生きている。だから 点 DFT の出力は、低い周波数から最高周波数()まで上がって、また負側の低い周波数へ折り返す並びになる。
基底が一回りして戻ってくるんだお。離散の世界はとことん周期的だお。
6.5 高速フーリエ変換
DFT は実用の本命だが、素直に計算すると重い。式 (6.2) で を1個求めるのに掛け算が 回。それを の 個ぶん。合計 回の掛け算が要る。 なら 回。さすがに遅すぎる。
は嫌な響きだお…。 がちょっと増えるとドカンと重くなるやつだお。なんとかならないのかお。
なる。これを劇的に速くするのが高速フーリエ変換(Fast Fourier Transform、FFT)だ。まず強調しておく。FFT は DFT とは別物ではない。式 (6.2) とまったく同じ を、計算の順番を工夫して速く出すだけの計算法だ。結果は1ビットも変わらない。
別の変換じゃなくて、同じ答えへの近道なんだお。安心したお。で、どう工夫するんだお?
肝は「分割」だ。 を偶数として、和を偶数番目の と奇数番目の の2つに分ける。
偶数番を 、奇数番を ()と書き直す。鍵は回転因子の指数が半分の長さの回転因子になることだ。偶数番の和に現れる を変形すると
が分母の と打ち消し合って、ちょうど長さ の回転因子 に化ける。つまり偶数番だけの和は、それ自身が長さ の DFTになっている。奇数番のほうは、 に掛かる から、 に依らない共通因子 を和の外にくくり出せて、残りがまた長さ の DFT になる。
偶数番だけの DFT を 、奇数番だけの DFT を と名付ければ、くくり出した を奇数側に掛けて足し合わせるだけで
長さ の DFT が、長さ の DFT 2個と、たった1回の掛け算+足し算でつながった。
長さ の DFT 1個が、長さ の DFT 2個+ちょっとの結合になったお。 が消えて回転因子が半分サイズになるのが効いてるんだお。…これ、半分のやつをまた半分に割れば、どんどん小さくできそうだお!
そこに気づけば勝ちだ。 の DFT を、また偶数・奇数に割って の DFT 2個に。それをまた割って…と再帰的に繰り返す。 が のべき乗なら、最後は長さ の DFT(=そのまま)まで割れる。
ここがコストの急所だ。半分に割る段数は 回。各段で全 個のデータを結合 (6.7) するのに 回程度の計算。だから全体は
なら が 。約5万倍速い。リアルタイム音声処理も画像のスペクトル解析も、この差で初めて実用になった。
5万倍! 同じ答えなのに、足す順番を変えただけでそんなに違うのかお。半分に割ると、片方の計算がもう片方と使い回せるからかお。
その通り。素朴な計算は、 ごとに同じ部分和を何度も計算し直していた。FFT はそれを共有して二度手間を省く。発想は「分割統治」、賢いプログラムの王道だ。
ところで、結合の式 (6.7) は で までしか作ってないお。残り半分の はどうするんだお? また別に計算するのかお?
そこが一番うまい所だ。実はただ同然で手に入る。 も も長さ の DFT だから で周期的、つまり 、。さらに回転因子は (半周ぶん回すと符号が反転)だ。これを (6.7) に入れると
は (6.7) でもう計算済みだお! 符号を から に変えるだけで、上半分 と下半分 が一度の掛け算から2つ同時に出てくるんだお!
それが「バタフライ」と呼ばれる演算だ。入力 と から、掛け算 をたった1回やって、 と の2出力を作る。流れ図に描くと羽を広げた蝶のように線が交差するから蝶々形だ。下のデモで、その配線そのものを見てみろ。
配線の交差が「再帰木をほどいて1枚に広げた姿」だと思えばいい。再帰木(さっきのデモ)が縦の分割を、このバタフライ図が横の結合を見せている。両方あわせて FFT の全体像だ。とはいえ細かい配線を暗記する必要はない。FFT は DFT の高速計算法、答えは同じ——これだけは絶対に外すな。
6.6 4種類のフーリエ変換のまとめ
これで4つのフーリエ変換が出そろった。バラバラに見えるが、**「時間と周波数が、それぞれ連続/離散・周期/非周期のどれか」**で整理すると、見事に1枚の表に収まる。
| 変換 | 時間領域 | 周波数領域 |
|---|---|---|
| フーリエ変換(FT、第3章) | 連続・非周期 | 連続・非周期 |
| フーリエ級数(FS、第1〜2章) | 連続・周期 | 離散・非周期(線スペクトル) |
| 離散時間フーリエ変換(DTFT、第5章) | 離散・非周期 | 連続・周期() |
| 離散フーリエ変換(DFT、本章) | 離散・周期() | 離散・周期() |
これ、すごくきれいだお…。表の中の「離散」と「周期」が、時間側と周波数側で必ずペアで入れ替わってるお。
それがこの2章で何度も言ってきた双対の正体だ。法則はたった一行にまとまる。
片方の領域が「離散」なら、もう片方は必ず「周期的」。片方が「周期的」なら、もう片方は必ず「離散」。
- FS: 時間が周期的 ⇒ 周波数が離散(第3章 (3.8))
- DTFT: 時間が離散 ⇒ 周波数が周期的(第5章 (5.4))
- DFT: 時間も離散かつ周期、周波数も離散かつ周期(両方の合わせ技)
DFT が両方とも「離散・周期」なのは、時間も周波数も離散化した当然の帰結だ。そして両方が離散・有限だからこそ、唯一コンピュータの中で完全に閉じられる。
FS・FT・DTFT・DFT って名前で4つもあるから別々の難しい話かと身構えてたお。でも全部「波を周波数に分ける」同じ思想で、ただ時間と周波数を連続にするか離散にするかの組み合わせ違いだったんだお。スッキリしたお!
それがこの章までの一番の収穫だ。ここまでで「フーリエ解析」という大きな道具立ては完成した。次章からは、この道具を使って信号を操作するときに成り立つ便利な性質——線形性、時間シフト、そして信号処理の心臓部である「たたみこみ」——を見ていく。変換の式を覚える段階から、変換を武器として使う段階へ進むぞ。
- DTFT は が連続でそのままでは計算機に乗らない。周波数を で離散化し、和を 項に切ると DFT
- DFT は DTFT 曲線を で拾った標本。 は目盛りの細かさで、信号の中身は変えない
- 周波数を離散化すると、双対により時間側が周期 とみなされる。DFT は時間も周波数も「離散・周期」で、唯一コンピュータ内で完全に閉じる
- IDFT は 。順変換と肩の符号と だけ違う
- DFT は行列 ()の掛け算。各行は基底正弦波で、 は負の周波数
- FFT は DFT の高速計算法(別物ではない)。偶奇分割の再帰で
- 4変換は「時間・周波数が連続/離散・周期/非周期」の組み合わせ。片方が離散なら他方は周期という双対が貫く