Winograd快速傅立葉轉換演算法

**威諾格拉德快速傅立葉演算法**（英語：Winograd FFT）是由美國電腦科學家 Shmuel Winograd 在 1978 年提出。此演算法可以找出最少的乘法運算量。

當把 DFT 的公式： $y_{j}=\sum _{k=0}^{n-1}x_{k}e^{-j{\begin{matrix}{\frac {2\pi }{n}}\end{matrix}}ik}\qquad j=0,1,\cdots ,n-1.$

用矩陣方式來表示： ${\begin{bmatrix}y_{0}\\y_{1}\\\vdots \\y_{n-1}\end{bmatrix}}={\begin{bmatrix}1&1&1&\cdots &1&1\\1&w&w^{2}&\cdots &w^{n-2}&w^{n-1}\\\vdots &\vdots &\vdots &\cdots &\vdots &\vdots \\1&w^{n-1}&w^{2(n-1)}&\cdots &w^{(n-2)(n-1)}&w^{(n-1)(n-1)}\end{bmatrix}}{\begin{bmatrix}x_{0}\\x_{1}\\\vdots \\x_{n-1}\end{bmatrix}},\quad w=e^{-j{\begin{matrix}{\frac {2\pi }{n}}\end{matrix}}}$

如果 n 是質數，則可以無視第一行與第一列，把 n 點的 DFT 用 n-1 點的迴旋摺積來取代。

## 使用方法

使用此演算法，可分為以下幾個步驟，此處以 n=5 的 DFT 為例：

$$
{\begin{bmatrix}y_{0}\\y_{1}\\y_{2}\\y_{3}\\y_{4}\end{bmatrix}}={\begin{bmatrix}1&1&1&1&1\\1&w&w^{2}&w^{3}&w^{4}\\1&w^{2}&w^{4}&w&w^{3}\\1&w^{3}&w&w^{4}&w^{2}\\1&w^{4}&w^{3}&w^{2}&w\end{bmatrix}}{\begin{bmatrix}x_{0}\\x_{1}\\x_{2}\\x_{3}\\x_{4}\end{bmatrix}},\qquad w=e^{-j\angle 72^{\circ }}
$$

 
Step 1：消去第一行與第一列，式子可以改寫如下：

$$
{\begin{bmatrix}y_{1}-x_{0}\\y_{2}-x_{0}\\y_{3}-x_{0}\\y_{4}-x_{0}\end{bmatrix}}={\begin{bmatrix}w&w^{2}&w^{3}&w^{4}\\w^{2}&w^{4}&w&w^{3}\\w^{3}&w&w^{4}&w^{2}\\w^{4}&w^{3}&w^{2}&w\end{bmatrix}}{\begin{bmatrix}x_{1}\\x_{2}\\x_{3}\\x_{4}\end{bmatrix}},\qquad w=e^{-j\angle 72^{\circ }}
$$

Step 2：找出列與行的順序：

a) 找出一個原根 a，使得 $a^{k}{\bmod {N}}\neq 1\quad when\quad k=1,2,\cdots ,N-2,\quad a^{N-1}{\bmod {N}}=1$ .

b) 用 p [n] 表示列與行的順序： $p[n]=a^{n}{\bmod {N}},\quad n=0,1,\cdots ,N-2$

在這例子中，N=5 有兩個原根：2 與 3。取 2 作為其原根，可得其順序為：1,2,4,3。

 
故要將此矩陣 ${\begin{bmatrix}y_{1}-x_{0}\\y_{2}-x_{0}\\y_{3}-x_{0}\\y_{4}-x_{0}\end{bmatrix}}={\begin{bmatrix}w&w^{2}&w^{3}&w^{4}\\w^{2}&w^{4}&w&w^{3}\\w^{3}&w&w^{4}&w^{2}\\w^{4}&w^{3}&w^{2}&w\end{bmatrix}}{\begin{bmatrix}x_{1}\\x_{2}\\x_{3}\\x_{4}\end{bmatrix}}\quad $ 的第三列與第四列交換，第三行與第四行交換，把矩陣變成如下：

$$
{\begin{bmatrix}y_{1}-x_{0}\\y_{2}-x_{0}\\y_{4}-x_{0}\\y_{3}-x_{0}\end{bmatrix}}={\begin{bmatrix}w&w^{2}&w^{4}&w^{3}\\w^{2}&w^{4}&w^{3}&w\\w^{4}&w^{3}&w&w^{2}\\w^{3}&w&w^{2}&w^{4}\end{bmatrix}}{\begin{bmatrix}x_{1}\\x_{2}\\x_{4}\\x_{3}\end{bmatrix}}\quad
$$

如此第一行與第一列都跟所求得的順序：1,2,4,3 一樣，此為 circular correlation 的形式。

Step 3：為了要符合迴旋摺積的定義 (矩陣的對角線的項數相同)，故必須再將第二列與第四列交換，第二行與第四行交換，矩陣如下：

$$
{\begin{bmatrix}y_{1}-x_{0}\\y_{3}-x_{0}\\y_{4}-x_{0}\\y_{2}-x_{0}\end{bmatrix}}={\begin{bmatrix}w&w^{3}&w^{4}&w^{2}\\w^{2}&w&w^{3}&w^{4}\\w^{4}&w^{2}&w&w^{3}\\w^{3}&w^{4}&w^{2}&w\end{bmatrix}}{\begin{bmatrix}x_{1}\\x_{3}\\x_{4}\\x_{2}\end{bmatrix}}\quad
$$

如此就可把 N 點 DFT 用 N-1 點的 DFT 來簡化，表示如下：

$$
{\begin{bmatrix}y_{1}-x_{0}\\y_{3}-x_{0}\\y_{4}-x_{0}\\y_{2}-x_{0}\end{bmatrix}}=IFFT\left[FFT_{4}\left\{{\begin{bmatrix}x_{1}\\x_{3}\\x_{4}\\x_{2}\end{bmatrix}}\right\}.FFT_{4}\left\{{\begin{bmatrix}w^{1}\\w^{3}\\w^{4}\\w^{2}\end{bmatrix}}\right\}\right]
$$

## 缺點

雖然此演算法有著可以大幅減少乘法量的優點，但相對於此，也有一些缺點：

* N 不同，那硬體的架構也會跟著改變。
* Time Cycle 較多（因為要做兩次 N-1 點的 DFT）。
* 加法量會增加很多。

## 其他運用

任意長度的 DFT 都可以用長度為 $2^{k}$ 點的 DFT 來簡化，舉例來說：

7 點的 DFT：先將 7 點 DFT 用 Winograd 簡化成 6 點 DFT，再利用 6=2x3，故 6 點 DFT 可用 2 點 DFT 與 3 點的 DFT 來表示，再把 3 點的 DFT 用 Winograd 簡化成 2 點的 DFT，即可把 7 點的 DFT 用 $2^{k}$ 點的 DFT 來簡化。

## 參考資料

* Jian-Jiun Ding, Advanced Digital Signal Processing class note,the Department of Electrical Engineering, National Taiwan University (NTU), Taipei, Taiwan, 2007.
* S.Winograd, "On computing the discrete Fourier transform," Mathematics of Computation, vol.32,no.141,pp.179-199,Jan.1978.