素因子快速傅里叶变换

时间:2019-12-03
本文章向大家介绍素因子快速傅里叶变换,主要包括素因子快速傅里叶变换使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、功能

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

原文地址:https://www.cnblogs.com/liam-ji/p/11886068.html