一、功能
用素因子分解算法计算复序列的离散傅里叶变换。序列的长度是数集{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
eq j)
]
那么素因子快速傅里叶变换算法由以下步骤组成:
1、一维DFT映射为多维DFT
对输入下标(n)作多因子简单映射,输出下标(k)作多因子孙子定理映射
[left{egin{matrix}egin{align*}n &equiv sum_{i=1}^{M}frac{N}{N_{i}}n_{i} extup{mod} N\ k &equiv sum_{i=1}^{M}frac{N}{N_{i}}t_{i}k_{i} extup{mod} Nend{align*}end{matrix}
ight., (n_{i},k_{i}=0,1,...,N_{i}-1)
]
其中(t_i)满足
[sum_{i=1}^{M}frac{N}{N_{i}}t_{i}equiv 1 extup{mod} N
]
并记
[egin{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,即
[egin{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)的点单独列出,则有
[egin{align*}X(0)&=sum_{=0}^{p-1}x(n),\X(k)&=x(0)+ar{X}(k) , k=1,2,...,p-1end{align*}
]
其中(ar{X}(k) = sum_{n=1}^{p-1}x(n)W_{N}^{nk} , k=1,2,...,p-1)
设
[egin{Bmatrix}egin{align*}n &equiv g^{-u} extup{mod} p\ k &equiv g^{u} extup{mod} pend{align*}end{Bmatrix}
]
则上面的DFT(ar{X}(k))就成为循环卷积
[ar{X}(g^{v}) = sum_{u=0}^{p-2}x(g^{-u}W_{N}^{g^{v-u}}) , v = 0,1,...,p-2
]
3、用Winograd算法计算短卷积
三、使用说明
C语言实现方式如下