DFT と FFT(離散フーリエ変換)

時間波形を飛び飛びの周波数ビンに分解するのが DFT、その計算を O(N log N) に速めたのが FFT。周波数分解能 Δf=fs/N=1/Tobs はレーダーの距離・速度分解能の土台になる

区分用語・概念
版1.0
作成
更新

一文定義

離散フーリエ変換(DFT; Discrete Fourier Transform)は、一定間隔で標本化した NN 点の時間波形を、含まれる周波数成分の大きさと位相に分解する変換。高速フーリエ変換(FFT; Fast Fourier Transform)は、その DFT を O(Nlog⁡N)O(N\log N) で計算する高速アルゴリズムで、得られる結果は DFT と同じである。

何を計算しているのか

どんな波形も、いろいろな周波数の正弦波を重ね合わせて作れる——これがフーリエの考え方。DFT はその逆で、混ざった波形を「どの周波数がどれだけ含まれているか」に分解する。

和音を思い浮かべると早い。ピアノで「ド・ミ・ソ」を同時に押すと、耳には 1 つの混ざった音が届く。DFT はこの混ざった音を、ド・ミ・ソそれぞれの強さに分けて表にする操作にあたる。時間の関数(いつ・どんな振幅か)を、周波数の関数(どの高さの成分が・どれだけか)に翻訳している。

レーダーで言えば、受信信号に含まれるビート周波数(距離)やドップラー周波数(速度)を読み取るのがこの分解である。

なぜ「ビン」になるのか — 周波数分解能

DFT は連続なスペクトルではなく、飛び飛びの周波数点で成分を返す。この 1 点 1 点を「ビン(bin, 入れ物)」と呼ぶ。理由は、入力が有限個の標本だからである。

  • 標本化周波数 fsf_s で NN 点を取ると、観測している時間は Tobs=N/fsT_{\mathrm{obs}} = N/f_s。
  • FFT は NN 点入力に対し NN 個の出力(ビン)を返す。ビンは 0 から fsf_s までを等間隔に刻んだもので、その間隔が周波数分解能になる:
Δf=fsN=1Tobs\Delta f = \frac{f_s}{N} = \frac{1}{T_{\mathrm{obs}}}
  • 実数信号では上半分のビンは下半分の折り返し(冗長)なので、意味を持つのは fs/2f_s/2(ナイキスト周波数)までの N/2N/2 本である。

重要なのは Δf\Delta f が観測時間だけで決まること。細かく周波数を分けたければ、長く観測する(TobsT_{\mathrm{obs}} を伸ばす)しかない。これは レーダーのドップラー の速度分解能 Δv=λ/2Tobs\Delta v = \lambda/2T_{\mathrm{obs}} と同じ TobsT_{\mathrm{obs}} が効く——「観測時間が周波数(=速度)分解能を決める」というひとつの事実の別の顔である。

振幅時間時間波形(N 点に標本化)全体 Tobs = N / fsFFT強さ周波数周波数ビン(飛び飛び)Δf = fs/N = 1/Tobsfs/2
図: N 点に標本化した時間波形を FFT にかけると、間隔 Δf = fs/N = 1/Tobs で並ぶ周波数ビンが返る。信号の周波数に当たるビンだけが高く立つ。上限は fs/2(ナイキスト)。

上半分のビンが冗長な理由(実数信号の鏡写し)

上で「意味を持つのは fs/2f_s/2 までの N/2N/2 本」と書いた。ここが分かりにくいので補う。核心は 実数の信号は、周波数の上半分と下半分が必ず鏡写しになる ことである。

FFT は 0 から fsf_s 手前までを NN 等分した NN 本のビンを返す。ところが ADC で拾う電圧のような実数の信号では、必ず「ビン kk」と「ビン N−kN-k」が同じ大きさになる。上半分は下半分を fs/2f_s/2 で折り返した鏡像で、新しい情報を持たない。

なぜ鏡写しになるか。実数の余弦波は、逆向きに回る 2 つの成分でできている(オイラーの式):

cos⁡(2πft)=12e+j2πft+12e−j2πft\cos(2\pi f t) = \tfrac{1}{2}e^{+j2\pi f t} + \tfrac{1}{2}e^{-j2\pi f t}

つまり周波数 +f+f と −f-f が必ずペアで現れる。実数信号には「正の周波数だけ」が存在できない。そして FFT では負の周波数が上半分(fs/2f_s/2 〜 fsf_s)に回り込んで入るので、下半分(正)と上半分(負)が鏡像になる。

具体例で見る。N=8N=8、fs=8 Hzf_s=8\ \mathrm{Hz} ならビンは 0,1,…,7 Hz0,1,\dots,7\ \mathrm{Hz}。ここに実数の 1 Hz1\ \mathrm{Hz} の波を入れると、ピークはビン 1(本物)とビン 7(=8−1=8-1、鏡像)の両方に立つ。同様に 2↔62\leftrightarrow6、3↔53\leftrightarrow5 がペアで、ビン 4 =fs/2=f_s/2 が折り返しの中心になる。だから独立な情報は 00〜fs/2f_s/2 の N/2N/2 本だけで、上半分は下半分の焼き直しなので捨ててよい。

これは標本化定理の裏返しでもある。fsf_s で標本化すると fs/2f_s/2 より上は正しく表せず下に折り返って化ける(エイリアシング、レーダーのドップラー の速度アンビギュイティ=映画の車輪と同じ)。元々 fs/2f_s/2 までしか意味のある周波数は載っていない。

DFT と FFT はどう違うか — なぜ FFT は速いのか

DFT は「変換の定義」、FFT は「その定義を速く計算する手順」 で、両者は別物ではない。返す答えは同じである。

DFT を定義どおり計算すると、各ビン kk の値は NN 個の標本すべてとの積和で求まる。ビンは NN 個あるので、全体で N×N=N2N \times N = N^2 回の演算が要る(O(N2)O(N^2))。N=1024N=1024 なら約 100 万回。

FFT(Cooley–Tukey, 1965)は、NN が 2 の冪のとき、標本を偶数番・奇数番の 2 組に分けると、NN 点 DFT が半分サイズの DFT 2 つで書けることを使う。これを再帰的に繰り返すと演算量が O(Nlog⁡N)O(N\log N) に落ちる。N=1024N=1024 なら約 1 万回で、同じ答えが約 100 倍速く求まる。標本数が増えるほど差は開く。

「FFT という新しい変換がある」のではなく、「DFT を賢く計算する方法が FFT」という理解が正しい。

リーケージと窓関数

DFT は暗黙に 「観測した区間がそのまま周期的に繰り返す」 と仮定している。信号の周波数がちょうどビンの位置に一致すればきれいに 1 本のビンに立つが、一致しないと区間の端で波形が不連続になり、エネルギーが周囲のビンに漏れる。これを スペクトルリーケージ と呼ぶ。

漏れの正体を掘ると、効いているのは切り取りの 「角(段差)」 である。有限区間で切ることは、無限に続く波へ窓(区間外は 0)を掛けることに等しい。時間領域の掛け算は周波数領域では畳み込みになり、観測されるスペクトルは「使った窓のスペクトルそのもの」 に置き換わる。方形の窓は両端に鋭い角(不連続)を持ち、角を表現するには高い周波数が遠くまで必要になる(矩形波が高調波の山を持つのと同じ)。この広がりが、中央の 主ローブ と裾を引く サイドローブ(=漏れ)になる。

対策が窓関数で、区間の端を滑らかに 0 へ落として(ハニング窓・ハミング窓など)角そのものを消し、サイドローブを大きく下げる。ただし端を丸めるぶん有効区間が実質狭まり、主ローブが太る。主ローブが太ると近接する 2 つの周波数の山が重なって分離しにくくなる——つまり 漏れの抑制と周波数分解能はトレードオフ である。

方形窓(切りっぱなし)ハニング窓端に角(不連続)なめらかに0へ(角なし)時間の重みFFTFFT主ローブ(細い)サイドローブ大主ローブ(太い)サイドローブ小周波数 →周波数 →
図(模式): 窓の端の「角」がサイドローブ(漏れ)を生む。ハニング窓は端をなめらかに0へ落として漏れを抑えるが、代償に主ローブが太り周波数分解能は悪化する。観測されるにじみは、使った窓のスペクトルそのもの。

レーダーとのつながり

車載 FMCW レーダーの信号処理は FFT の 2 段重ねでできている。送信は周波数を掃引したチャープを短い間隔で何発も連続して撃ち、受信波を送信波と混合してビート信号を作る。処理の流れはこうなる。

  1. 受信ビート信号 — 各チャープごとに、目標までの往復遅延に比例したビート周波数を含む信号が得られる。
  2. ADC で標本化 — 各チャープの信号を A/D 変換し、「1 チャープ内の標本」×「チャープ番号」の 2 次元データに並べる。
  3. レンジ FFT(1 段目) — 各チャープの標本方向(高速時間)に FFT。ビート周波数がそのまま距離になり、各ビンが距離ビンになる(パルス vs FMCW の R=cTfb/2BR=cTf_b/2B)。
  4. ドップラー FFT(2 段目) — 同じ距離ビンをチャープ方向(低速時間)に FFT。目標が動くとチャープごとに反射の位相が少しずつ回り、その回転の速さがドップラー周波数=速度になる。各ビンが速度ビンになる(レーダーのドップラー)。
  5. 距離×速度マップ — 2 段の FFT で、距離と速度の 2 次元平面(レンジドップラーマップ)ができる。CFAR や物標検出はこの平面の上で行う。
受信ビート信号(複数チャープ)ADC標本化レンジ FFTチャープ内↓ 各ビン = 距離ドップラー FFTチャープ間↓ 各ビン = 速度距離×速度マップ標本方向(高速時間)チャープ方向(低速時間)
図: FMCW は FFT の 2 段重ね。1 チャープ内のビート周波数を FFT すると距離が(レンジ FFT)、複数チャープにまたがる位相変化を FFT すると速度が出る(ドップラー FFT)。両者を組むと距離×速度の 2 次元マップになる。

ここで「標本方向」「チャープ方向」とは、ADC 後のデータを並べた 2 次元の表 の 2 つの軸を指す。横軸は 1 チャープ内の標本番号(標本間隔 1/fs1/f_s の高速時間)、縦軸はチャープ番号(チャープ周期ごとに 1 点の低速時間)である。同じ表を横方向に FFT すればレンジ FFT(距離)、縦方向に FFT すればドップラー FFT(速度) になる——掛ける「向き」を変えるだけで距離と速度が別々に出るのがミソである。高速時間の間は目標がほぼ止まって見えて距離だけが、低速時間(チャープをまたぐ)では位相が回って速度が現れる。

横 = 標本番号(1チャープ内, 間隔 1/fs)= 高速時間縦 = チャープ番号(間隔=チャープ周期)= 低速時間レンジ FFT(横に読む)→ 距離ドップラー FFT(縦に読む)↓ 速度1 行 = 1 チャープの受信標本列1 列 = 同じ距離をチャープ越しに見る
図: ADC 後のデータは「横=標本番号(高速時間)×縦=チャープ番号(低速時間)」の 2 次元表になる。同じ表を横方向に FFT すれば距離(レンジ FFT)、縦方向に FFT すれば速度(ドップラー FFT)が出る。

つまり距離分解能・速度分解能は、それぞれの FFT のビン幅そのもの。1 段目は「1 チャープの中」を、2 段目は「チャープをまたいで」見ている点が要で、同じ FFT を掛ける方向(高速時間か低速時間か)を変えるだけで距離と速度が別々に出る。FFT が分かるとレーダー処理の全体像が一気に見通せるのはこのためである。

混同されやすい概念との対比

観点DFTFFT
正体変換の定義(数学)それを速く計算するアルゴリズム
返す結果—DFT と同じ(数値誤差以外)
演算量O(N2)O(N^2)O(Nlog⁡N)O(N\log N)
NN の制約任意基数 2 の FFT は 2 の冪が基本(混合基数で緩和)
主な場面定義・理論の記述実装・実時間処理

「DFT か FFT か」で処理内容が変わるわけではない。結果は同じで、変わるのは計算の速さだけ。

II-1 答案例(600字)

離散フーリエ変換(DFT)は、一定間隔で標本化した NN 点の時間波形を、含まれる周波数成分の大きさと位相へ分解する変換である。標本化周波数を fsf_s とすると、DFT は 00 から fsf_s を NN 等分した飛び飛びの周波数点(ビン)ごとに成分を返す。ビン間隔すなわち周波数分解能は Δf=fs/N=1/Tobs\Delta f = f_s/N = 1/T_{\mathrm{obs}}(TobsT_{\mathrm{obs}} は観測時間)で与えられ、分解能を上げるには観測時間を延ばすほかない。実信号で意味を持つのは fs/2f_s/2(ナイキスト周波数)までの N/2N/2 本である。

DFT を定義どおり計算すると各ビンで NN 回の積和を要し、全体の演算量は O(N2)O(N^2) になる。高速フーリエ変換(FFT)は、NN が 2 の冪のとき標本を偶数番と奇数番に分けて半サイズの DFT へ再帰的に帰着させ、演算量を O(Nlog⁡N)O(N\log N) に削減するアルゴリズムである。結果は DFT と同一で、N=1024N=1024 なら約 100 倍高速になる。FFT は新しい変換ではなく DFT を速く解く手順に過ぎない。

有限区間を切り出すため、ビン周波数の整数倍でない成分はエネルギーが隣接ビンへ漏れる(スペクトルリーケージ)。窓関数で区間の端を滑らかにすると漏れは抑えられるが、分解能はやや低下する。FFT はレーダーのレンジ/ドップラー処理をはじめ、スペクトル解析全般の基盤となる。

用語メモ

本文で使った用語の平易な説明。厳密さより、本文のイメージをつかむことを優先している。

  • フーリエ変換 — どんな波形も「いろいろな高さの音(周波数)の混ぜ合わせ」で表せる、という考えに基づき、混ざった波を成分ごとの強さに分ける操作。DFT はその離散版(飛び飛びの標本・飛び飛びの周波数)。
  • 標本化(サンプリング) — 連続の波形を一定間隔で拾ってデジタルの数列にすること。1 秒間に拾う回数が標本化周波数 fsf_s。
  • 標本周波数 fsf_s は何で決まるか — 車載 FMCW レーダーでは、ADC はレーダー用 MMIC(送受信 RF を集積した IC)に内蔵され、fsf_s はその ADC の設定値になる(だから「MMIC による」で正しい)。ただし値は自由でなく下限がある。測りたい最大距離が大きいほど最大ビート周波数 fb,max⁡=(B/T)(2Rmax⁡/c)f_{b,\max}=(B/T)(2R_{\max}/c) が上がり、ナイキスト条件 fs≥2fb,max⁡f_s \ge 2 f_{b,\max} を満たす必要があるためである。つまり「最大レンジ → 最大ビート周波数 → 必要な fsf_s」で下限が、ADC の性能で上限が縛られる。
  • ビン(bin) — FFT が返す飛び飛びの周波数点、その 1 個 1 個。「周波数の入れ物」。信号のエネルギーは一番近いビンに落ちる。ビンの間隔 =1/Tobs=1/T_{\mathrm{obs}} が見分けられる最小の周波数差になる。
  • 周波数分解能 — どれだけ近い 2 つの周波数を別物として分けられるか。ビン間隔と同じで、長く観測するほど細かくなる(Δf=1/Tobs\Delta f = 1/T_{\mathrm{obs}})。
  • ナイキスト周波数 — 標本化周波数の半分 fs/2f_s/2。これより高い周波数は正しく表せず、低い周波数に化けて見える(折り返し=エイリアシング)。だから意味のあるビンは fs/2f_s/2 まで。
  • 演算量 O(Nlog⁡N)O(N\log N) — 処理にかかる手間が、データ数 NN に対してどう増えるかの目安。N2N^2 は NN が 10 倍で手間が 100 倍だが、Nlog⁡NN\log N はほぼ 10 倍で済む。FFT が実時間で使える理由。
  • 主ローブ / サイドローブ — 有限区間で切ると、1 本であるはずの周波数が「山」ににじむ。中央の大きな山が主ローブ(信号の本当の周波数はこの頂点)、両脇に並ぶ小さな波がサイドローブ(=漏れ)。この山の形は「使った窓のスペクトル」そのもの。主ローブが細いほど 2 つの近い周波数を見分けやすい(分解能が良い)。
  • スペクトルリーケージ — 有限の区間で切って FFT すると、ビンにぴたり乗らない成分のエネルギーが隣のビンへにじみ出る現象。窓の端の「角(段差)」が高い周波数を要求するために起きる。
  • 窓関数 — 切り出した区間の端をなだらかに 0 へ落とす重み付け(ハニング窓など)。ぶつ切りを和らげてリーケージを減らす。代わりにピークが少し太る(分解能は少し悪化)。
  • レンジ FFT / ドップラー FFT — FMCW レーダーで距離を出す 1 段目の FFT と、速度を出す 2 段目の FFT。距離・速度は、それぞれの FFT のビンとして現れる。

出典

更新履歴

版日付変更内容
1.02026-08-11初版(ドラフト)

関連ノート