素因子快速傅里叶变换
一、功能
用素因子分解算法计算复序列的离散傅里叶变换。序列的长度是数集{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
- Kafka单节点至集群的安装部署及注意事项
- JavaScript onchange 事件:表单文本域或选择域发生改变
- 利用反射比较两个对象字段值是否相等
- 更新Silverlight ctp到Silverlight beta 1.0
- JSON.stringify(), JSON.parse(), toJSON()方法使用
- compression功能测试
- 源码阅读再来一发:解读RGW中request的处理流程
- 绘制Crushmap分布图-Python
- RGW奇淫技巧-玩转system特权
- 源码走读rgw内置civetweb的参数初始化过程
- 重磅:Flume1-7结合kafka讲解
- 遍历删除List中的元素
- RGW Bucket Shard设计与优化-下
- RGW Bucket Shard设计与优化-中
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- winform总结2> Action<> ,Action,func<>,委托相关的理解
- winform开发 总结1>winform程序使用线程的必要性,以及正确的使用方式
- Winform 后台将指定的控件集合添加到制定容器中
- C#微信公众平台接入示例代码
- FreeRTOS三种数据结构区别(StreamBuffer,MessageBuffer,Queue)
- Keras & Tensorflow 笔记
- Netty之HTTP协议应用开发
- 超全Python IDE武器库大总结,优缺点一目了然!
- Set源码解析(红黑树)
- RouteOnAttribute
- PutHiveStreaming
- 【LINUX】开发环境搭建
- C 库函数 - strcat()
- 快速搞定 uiautomator2 自动化测试工具使用
- AvroRecordSetWriter