121 lines
4.8 KiB
Markdown
121 lines
4.8 KiB
Markdown
# FFT快速傅里叶变换原理
|
||
|
||
## - 函数理论分析
|
||
|
||
对于一个多项式,设该多项式为:
|
||
$$A(x) = \Sigma_{i=0}^{n-1}a_ix_i = a_0 + a_1x + a_2x^2 + \mathellipsis$$
|
||
|
||
按A(x)的下标奇偶性分类:
|
||
$$A(x) = (a_0 + a_2x^{2} + \mathellipsis + a_{n-2}x^{n-2}) + (a_1 + a_3x^3 + \mathellipsis + a_{n-1}x^{n-1})$$ $$= (a_0 + a_2x^2 + \mathellipsis + a_{n-2}x^{n-2}) + x(a_1 + a_3x^2 + \mathellipsis + a_{n-1}x^{n-2})$$
|
||
|
||
观察式子两边发现极为相似,设两个函数$A_e$, $A_o$,令
|
||
$$A_e(x) = a_0 + a_2x^{\frac{2}{2}} + \mathellipsis + a_{n-2}x^\frac{n-2}{2} = a_0 + a_2x^{1} + \mathellipsis + a_{n-2}x^{\frac{n}{2}-1} $$ $$A_o(x) = a_1 + a_3x^\frac{2}{2} + \mathellipsis + a_{n-1}x^\frac{n-2}{2} = a_1 + a_3x^1 + \mathellipsis + a_{n-1}x^{\frac{n}{2}-1}$$
|
||
显然有
|
||
$$A(x) = A_e(x^2) + xA_o(x^2)$$ $$A(-x) = A_e(x^2) - xA_o(x^2)$$
|
||
|
||
> 请注意上式右侧的平方
|
||
|
||
带入$x=\omega_n^k$
|
||
$$A(\omega_n^k) = A_e(\omega_n^{2k}) + \omega_n^k A_o(\omega_n^{2k})$$ $$=A_e(\omega_\frac{n}{2}^{k}) + \omega_n^k A_o(\omega_\frac{n}{2}^{k})$$ $$A(-\omega_n^k) = A(\omega_n^{k+\frac{n}{2}}) = A_e(\omega_n^{2k+n}) - \omega_n^k A_o(\omega_n^{2k+n})$$ $$=A_e(\omega_n^{2k}) - \omega_n^k A_o(\omega_n^{2k})$$ $$=A_e(\omega_\frac{n}{2}^{k}) - \omega_n^k A_o(\omega_\frac{n}{2}^{k})$$
|
||
|
||
>利用性质如下
|
||
> - $-\omega_n^k = \omega_n^{k+\frac{n}{2}}$
|
||
> - $\omega_n^{2k} = \omega_\frac{n}{2}^k$
|
||
|
||
不难发现,如果我们知道了$A_e(\omega_\frac{n}{2}^k), A_o(\omega_\frac{n}{2}^k)$ ,就可以知道$A(\omega_n^k)$
|
||
|
||
> 这一步叫做Butterfly(蝴蝶操作)
|
||
> $$u = A_e(\mathellipsis)$$ $$v=\omega_n^k A_o(\mathellipsis)$$
|
||
> 则有
|
||
> $$y_k = u + v$$ $$y_{k+\frac{n}{2}} = u - v$$
|
||
> 即可以自下而上的,从 $A_{\mathellipsis}(\omega_{\mathellipsis}^k)$ 推导出 $A(x)$
|
||
> 同时当我们知道$A(-x)$的时候,我们也可以知道$A(x)$
|
||
|
||
有下面的树(以$n=4, x = \omega_{16}^k$为例)
|
||
> $A(\omega_{16}^k)$
|
||
> $Ae(\omega_8^k); Ao(\omega_8^k)$
|
||
> $Aee(\omega_4^k), Aeo(\omega_4^k); Aoe(\omega_4^k), Aoo(\omega_4^k)$
|
||
> $Aeee(\omega_2^k), Aeeo(\omega_2^k) ,, Aeoe(\omega_2^k), Aeoo(\omega_2^k);$
|
||
> $Aoee(\omega_2^k), Aoeo(\omega_2^k) ,, Aeoe(\omega_2^k), Aeoo(\omega_2^k)$
|
||
> 最底层为$A...(\omega_1^k) = a_i$(系数 | 常数多项式)
|
||
|
||
**已知最下层的所有数值(的一半),一次往上带入即可**
|
||
|
||
---
|
||
## - 示例
|
||
|
||
以下两个式子为例:
|
||
$$f_1 = x^3 + x^2 + 8x + 1 $$ $$ f_2 = x^2 - 5x - 2 $$
|
||
|
||
### 一、确定次数以及补零
|
||
- 次数:$2 + 3 = 5$, 需要 $5 + 1 = 6$ 个点值
|
||
- 确定n:$2^3=8$,$n = 3$
|
||
|
||
得到两个系数数组
|
||
- $A = [1,8,1,1,0,0,0,0]$
|
||
- $B = [-2, -5,1,0,0,0,0,0]$
|
||
**(从低次到高次排序,补0至8位)**
|
||
|
||
### 二、正向FFT
|
||
**计算$f_1(\omega_8^k)$,$f_2(\omega_8^k)$,其中$k = 0, 1, \mathellipsis , 7$,单位根$\omega_8^k = e^{i\frac{2\pi k}{8}} = \cos(\frac{2k\pi}{8}) + i\sin(\frac{2k\pi}{8})$**
|
||
|
||
|
||
#### 1. 初始多项式定义
|
||
设两个多项式:
|
||
$$f_1(x) = x^3 + x^2 + 8x + 1$$
|
||
$$f_2(x) = x^2 - 5x - 2$$
|
||
|
||
为了进行 $n=8$ 的 FFT,补零后的系数向量为:
|
||
$$A = [a_0, a_1, a_2, a_3, a_4, a_5, a_6, a_7] = [1, 8, 1, 1, 0, 0, 0, 0]$$
|
||
$$B = [b_0, b_1, b_2, b_3, b_4, b_5, b_6, b_7] = [-2, -5, 1, 0, 0, 0, 0, 0]$$
|
||
|
||
---
|
||
|
||
#### 2. 递归拆分逻辑 (以 A 为例)
|
||
|
||
**第一层拆分 ($n=8 \to n=4$):**
|
||
$$A_e(x) = a_0 + a_2x + a_4x^2 + a_6x^3 = 1 + 1x$$
|
||
$$A_o(x) = a_1 + a_3x + a_5x^2 + a_7x^3 = 8 + 1x$$
|
||
|
||
**第二层拆分 ($n=4 \to n=2$):**
|
||
对于 $A_e$:
|
||
$$A_{ee}(x) = a_0 + a_4x = 1$$
|
||
$$A_{eo}(x) = a_2 + a_6x = 1$$
|
||
对于 $A_o$:
|
||
$$A_{oe}(x) = a_1 + a_5x = 8$$
|
||
$$A_{oo}(x) = a_3 + a_7x = 1$$
|
||
|
||
**第三层拆分 ($n=2 \to n=1$):**
|
||
这是递归终点,系数即为点值:
|
||
$$A_{eee}=1, A_{eeo}=0, A_{eoe}=1, A_{eeo}=0 \dots$$
|
||
|
||
---
|
||
|
||
#### 3. 向上回溯(蝴蝶变换公式)
|
||
利用核心公式:
|
||
$$A(\omega_n^k) = A_e(\omega_{n/2}^k) + \omega_n^k A_o(\omega_{n/2}^k)$$
|
||
$$A(\omega_n^{k+n/2}) = A_e(\omega_{n/2}^k) - \omega_n^k A_o(\omega_{n/2}^k)$$
|
||
|
||
**从 $n=2$ 合并到 $n=4$ 的例子 (计算 $A_e$ 的点值):**
|
||
已知 $A_{ee}$ 的点值在 $\omega_2^0$ 处为 $1$, $A_{eo}$ 的点值也为 $1$。
|
||
则在 $n=4$ 层:
|
||
$$A_e(\omega_4^0) = A_{ee}(\omega_2^0) + \omega_4^0 A_{eo}(\omega_2^0) = 1 + 1(1) = 2$$
|
||
$$A_e(\omega_4^1) = A_{ee}(\omega_2^1) + \omega_4^1 A_{eo}(\omega_2^1) = 1 + i(1) = 1+i$$
|
||
$$A_e(\omega_4^2) = A_{ee}(\omega_2^0) - \omega_4^0 A_{eo}(\omega_2^0) = 1 - 1 = 0$$
|
||
$$A_e(\omega_4^3) = A_{ee}(\omega_2^1) - \omega_4^1 A_{eo}(\omega_2^1) = 1 - i$$
|
||
|
||
---
|
||
|
||
#### 4. 点值乘法与逆变换 (IFFT)
|
||
得到 $A(\omega_8^k)$ 和 $B(\omega_8^k)$ 后,进行点值乘法:
|
||
$$C(\omega_8^k) = A(\omega_8^k) \cdot B(\omega_8^k)$$
|
||
|
||
最后进行 IFFT,公式为:
|
||
$$c_j = \frac{1}{n} \sum_{k=0}^{n-1} C(\omega_n^k) (\omega_n^{-j})^k$$
|
||
|
||
---
|
||
|
||
#### 5. 最终系数结果
|
||
$$C(x) = f_1(x) \cdot f_2(x) = x^5 - 4x^4 + x^3 - 41x^2 - 21x - 2$$
|
||
系数向量为:
|
||
$$[-2, -21, -41, 1, -4, 1, 0, 0]$$ |