---
# System prepended metadata

title: '探討快速傅立葉轉換（Fast Fourier Transform, FFT）理論與實驗'

---

# 探討快速傅立葉轉換（Fast Fourier Transform, FFT）理論與實驗


# 1. 前言

理論上來說，離散時間訊號的頻譜 (Spectrum) 可以使用離散時間傅立葉轉換 (Discrete-Time Fourier Transform, DTFT) 得到。但實際上電腦並不存在無限大的記憶體空間，因此我們會使用離散傅立葉轉換 (Discrete Fourier Transform, DFT) 方法，並使用一個稱為快速傅立葉轉換 (Fast Fourier Transform, FFT) 的計算高效演算法用程式計算而得。

## 1.1 DTFT 初探

離散時間訊號以 $x[n]$ 表示，$n$ 屬於整數，DTFT 配對定義如下：

**Forward DTFT:**

$$
X(e^{j\omega}) = \sum_{n=-\infty}^{\infty} x[n] e^{-j\omega n}
$$

**Inverse DTFT:**

$$
x[n] = \frac{1}{2\pi} \int_{-\pi}^{\pi} X(e^{j\omega}) e^{j\omega n} \, d\omega
$$


一般而言，離散時間訊號的 DTFT 頻譜是以 $2π$ 為週期的。在實務上，我們通常假設這個離散訊號是根據取樣定理，從一個頻帶限制在 $[−fs/2,fs/2]$ 的類比訊號取樣而來。經過正規化後，這個頻帶對應到數位角頻率 $[-π, π]$ 的區間。因此，雖然 DTFT 頻譜在整個頻率軸上都存在，但其所有的唯一資訊都集中在 $[-π, π]$ 這個基本週期內，我們通常也只分析這個區間。

## 1.2 DFT 初探

假設現在有一個 $N$-point 訊號，並定義 $W_N = e^{-j(\frac{2\pi}{N})}$，$W_N^n$ 是多項式 $W^n = 1$ 的根，則 DFT 配對定義如下：

**DFT (Discrete Fourier Transform)**

$$X[k] = \sum_{n=0}^{N-1} x[n]W_N^{kn}, \quad k = 0, 1, \dots, N-1$$

**IDFT (Inverse Discrete Fourier Transform)**

$$x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k]W_N^{-kn}, \quad n = 0, 1, \dots, N-1$$

在這裡 $W_N^n$ 是多項式 $W^N = 1$ 的第 $n$ 個根。值得注意的是，使用上面的方程式做計算的話，在乘法的時間複雜度會是 $O(n^2)$，在加法的時間複雜度會是 $O(n(n-1)), i.e., O(n^2    )$。


# 2. 理論

Cooley-Tukey 演算法是 FFT 的其中一個重要的演算法，它最主要的原理有兩個：
1. $W_N^2 = W_{N/2}$ (例如：$W_8^2 = W_4$)。
2. 迭代地做分治法 (Divide and Conquer)

我們已經知道在這裡 $W_N^n$ 是多項式 $W^N = 1$ 的第 $n$ 個根，如果 $N = 8$：

<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/S1fBqsTOle.png" width=50%>
</div>

## 2.1 FFT 演算法於時間域減退抽樣 (Decimation-in-time)


一般來說，

$$
X[k] = \sum_{n \,\text{even}} x[n] W_N^{nk} \;+\; \sum_{n \,\text{odd}} x[n] W_N^{nk}
$$

假設 $N = 8$，我們可以分解 $N$-point DFT 為兩個 $N/2$-point DFT。

![截圖 2025-08-16 下午3.31.02](https://hackmd.io/_uploads/B1X6726dex.png)

我們可以進一步分解 $N/2$-point DFT 為兩個 $N/4$-point DFT。

![截圖 2025-08-16 下午3.44.29](https://hackmd.io/_uploads/By3kD26_ee.png)

因此，$8$-point DFT 可以用四個 $2$-point DFT 得到。

![截圖 2025-08-16 下午3.45.21](https://hackmd.io/_uploads/rkRfDnadlg.png)

最後，每一個 $2$-point DFT 可以用以下的 single-flow graph 實作，而不需要用到乘法：

<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/rkN5d3adgx.png" width="66%">
</div>

以下是 $8$-point DFT 於時間域減退抽樣得到的 single-graph。

![image](https://hackmd.io/_uploads/rJaIF2T_ex.png)

在 FFT 於時間域減退抽樣的每一個階段，有一個基本的結構叫做蝴蝶計算 (Butterfly computation)

$$
X_m[p] = X_{m-1}[p] + W_N^r X_{m-1}[q]
$$

$$
X_m[q] = X_{m-1}[p] - W_N^r X_{m-1}[q]
$$


以 flow graph 來表示蝴蝶計算 (Butterfly computation)，如下：

<div style="text-align: center;">
  <img src="https://hackmd.io/_uploads/S17_c2puex.png" width="66%">
</div>

它又可以簡化為如下：

<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/Syf09haugl.png" width="66%">
</div>



## 2.2 FFT 演算法於頻率域減退抽樣 (Decimation-in-frequency)



# 3. 實驗

我們將使用 MATLAB 並使用 FFT 做影像訊號的初步實驗。

（待補）


# 參考文獻

[1] 陳祝嵩, 國立臺灣大學資訊工程學系, "112-2 數位訊號處理概論投影片", Course Slides, 2024.
