素因子快速傅里叶变换

Posted liam-ji

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了素因子快速傅里叶变换相关的知识,希望对你有一定的参考价值。

一、功能

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

以上是关于素因子快速傅里叶变换的主要内容,如果未能解决你的问题,请参考以下文章

数字信号处理3: 快速傅里叶变换(FFT)(含代码)

数字信号处理3: 快速傅里叶变换(FFT)(含代码)

数学建模由张量模-n展开到高维傅里叶变换(附代码)

傅里叶变换通俗解释及快速傅里叶变换的python实现

关于快速傅里叶变换

快速傅里叶变换(FFT)