素因子快速傅里叶变换

一、功能

用素因子分解算法计算复序列的离散傅里叶变换。序列的长度是数集{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语言实现方式如下


posted @ 2019-12-03 22:20  Liam-Ji  阅读(978)  评论(5编辑  收藏  举报