素因子快速傅里叶变换
一、功能
用素因子分解算法计算复序列的离散傅里叶变换。序列的长度是数集{2,3,4,5,7,8,9,16}中的一个或几个素因子的乘机。
二、方法简介
序列\(x(n)\)的离散傅里叶变换为
\[X(k)=\sum_{n=0}^{N-1}x(n)W_{N}^{nk}, \ k=0,1,...,N-1
\]
若\(N\)可分解为两两互素因子的乘积,即
\[N=N_{1}\cdot N_{2}\cdot ...\cdot N_{M}, \ (N_{i},N_{j})=1 \ (i\neq j)
\]
那么素因子快速傅里叶变换算法由以下步骤组成:
1、一维DFT映射为多维DFT
对输入下标\(n\)作多因子简单映射,输出下标\(k\)作多因子孙子定理映射
\[\left\{\begin{matrix}\begin{align*}n &\equiv \sum_{i=1}^{M}\frac{N}{N_{i}}n_{i} \ \textup{mod} \ N\\ k &\equiv \sum_{i=1}^{M}\frac{N}{N_{i}}t_{i}k_{i} \ \textup{mod} \ N\end{align*}\end{matrix}\right., (n_{i},k_{i}=0,1,...,N_{i}-1)
\]
其中\(t_i\)满足
\[\sum_{i=1}^{M}\frac{N}{N_{i}}t_{i}\equiv 1 \ \textup{mod} \ N
\]
并记
\[\begin{align*}x(n_{1},n_{2},...,n_{M}) &= x(\frac{N}{N_{1}}n_{1}+...+\frac{N}{N_{M}}n_{M}) \\X(k_{1},k_{2},...,k_{M}) &= X(\frac{N}{N_{1}}t_{1}k_{1}+...+\frac{N}{N_{M}}t_{M}k_{M})\end{align*}
\]
于是得到\(M\)维DFT,即
\[\begin{align*}X(k_{1},k_{2},...,k_{M}) &= \sum_{n_{1}=0}^{N_{1}-1} \sum_{n_{2}=0}^{N_{2}-1}...\sum_{n_{M}=0}^{N_{M}-1}x(n_{1},n_{2},...,n_{M})W_{N_{1}}^{n_{1}k_{1}}W_{N_{2}}^{n_{2}k_{2}}...W_{N_{M}}^{n_{M}k_{M}} \\(k_{i} &= 0,1,...,N_{1}-1;i=1,2,...,M)\end{align*}
\]
这样原来长度为\(N\)的一维DFT映射为长度分别为\(N_1,N_2,...,N_M\)的\(M\)维DFT,从而一维长DFT可用多维短DFT实现。下面将说明,这些短DFT可用短循环卷积来计算。
2、用Rader算法将DFT转换为循环卷积
设\(p\)为素数,\(p\)点DFT为
\[X(k)=\sum_{n=0}^{p-1}x(n)W_{N}^{nk}, \ k=0,1,...,p-1
\]
将\(n=0\)和\(k=0\)的点单独列出,则有
\[\begin{align*}X(0)&=\sum_{=0}^{p-1}x(n),\\X(k)&=x(0)+\bar{X}(k) \ , \ k=1,2,...,p-1\end{align*}
\]
其中\(\bar{X}(k) = \sum_{n=1}^{p-1}x(n)W_{N}^{nk} \ , \ k=1,2,...,p-1\)
设
\[\begin{Bmatrix}\begin{align*}n &\equiv g^{-u} \textup{mod} p\\ k &\equiv g^{u} \textup{mod} p\end{align*}\end{Bmatrix}
\]
则上面的DFT\(\bar{X}(k)\)就成为循环卷积
\[\bar{X}(g^{v}) = \sum_{u=0}^{p-2}x(g^{-u}W_{N}^{g^{v-u}}) \ , \ v = 0,1,...,p-2
\]
3、用Winograd算法计算短卷积
三、使用说明
C语言实现方式如下