关于一个通俗易懂的FFT的C语言实现教程
找到一个通俗易懂并且神奇并且有趣的FFT算法C语言实现教程:http://www.katjaas.nl/FFTimplement/FFTimplement.html
只要对矩阵比较熟悉就能在教程的辅助下很快实现FFT算法的C代码。
这个教程的第二部分 “Bitwiser FFT” 是一个基于位运算的FFT优化代码,我花了一段时间反复看才理解,不过理解之后印象深刻。难理解的地方主要是作者所说的 lo - set 和 odd - even 两对概念。作者开始介绍的时候这似乎是两个不同的概念,后来在程序中又变成了统一的 odd - even 命名,然而其实质是两个不同的概念。一个是为了跳过矩阵中的子空矩阵,通过与 span 求“或”实现( odd |= span ),另一个是为了求蝶形运算对中另一个元素的下标(横坐标),通过与 span 求“异或”实现( even = odd ^ span )。还需要注意的是,在每个 stage 内的每个 loop 都是以 odd 变量(这个名字太容易引起歧义,我索性不去管它的字面意思,而把它理解为蝶形运算对里靠后的那个元素,或者把它理解为二进制数 span 中为 "1" 的那一位的奇偶)为主导变量的,即 odd 变导致 even 变然后进行其他运算。
图形化理解 “Bitwiser FFT” 一节的方法在于,把每个 stage 内的每个 loop 理解为一个正方形的四个顶点的运算(如 “Bitwiser FFT” 一节的图2、4、6),正方形的边长是 span + 1 。这个算法中的主导变量 odd 即代表正方形右上角顶点元素的纵坐标(其纵坐标指向蝶形运算输入的元素下标,其横坐标指向蝶形运算输出的元素下标)。整个 stage 内的过程可以描述为三步:
1. odd 自增(包括跳过空白子矩阵)。
2. 计算 even 。
3. 蝶形运算产生新的 odd 和 even 。
这个算法是莱昂斯的《数字信号处理》中提到的按位反转输出的频域抽取FFT(见中文版第96页图4.12)。其蝶形运算公式为:x'' = x + y 和 y'' = WkN * x - WkN * y = WkN * ( x - y ) 。图4.12和 “Bitwiser FFT” 中相同的一点就是在这种算法内每次蝶形运算的输入和输出总是平行的,即当蝶形运算的输入是第 0 个和第 4 个元素时,其输出也是第 0 个和第 4 个元素。这个蝶形运算就对应上一段提到的正方形。正方形的上边(左上、右上两个顶点)代表以 x 和 y 为输入, 以x + y 为输出的蝶形运算一侧,下边(左下、右下)两个顶点代表以 x 和 y 为输入, 以 WkN * ( x - y ) 为输出的蝶形运算的另一侧,这两个输出分别存放在正方形上下两边对应的行向量进行矩阵运算结果位置。
我的一个新思路是以矩阵对角线元素为主导变量形成的算法实现可能更为简单,但目前还没尝试。
关于一个通俗易懂的FFT的C语言实现教程的更多相关文章
- 一个UUID生成算法的C语言实现 --- WIN32版本 .
一个UUID生成算法的C语言实现——WIN32版本 cheungmine 2007-9-16 根据定义,UUID(Universally Unique IDentifier,也称GUID)在时 ...
- 制作一个类似苹果VFL的格式化语言来描述UIStackView
在项目中总是希望页面上各处的文字,颜色,字体大小甚至各个视图控件布局都能够在发版之后能够修改以弥补一些前期考虑不周,或者根据统计数据能够随时进行调整,当然是各个版本都能够统一变化.看到这样的要求后,第 ...
- FFT 的C 语言
FFT 的C 语言 说好的C 语言实现.必须搞定它! 理论介绍: http://blog.csdn.net/cinmyheart/article/details/39052739 这里有之前matla ...
- 写一个程序,统计自己C语言共写了多少行代码。ver2.00
概要 完成一个程序,作用是统计一个文件夹下面所有文件的代码行数.输入是一个文件夹的绝对路径,输出是代码行数.所以此程序的新特点有两个: 统计某一文件夹下的所有文件: 可以任意指定本机硬盘上任何位置的某 ...
- 使用Sublime text 3打造一个小巧但强大的Go语言开发IDE
版权声明:欢迎转载,转载请注明出处! https://blog.csdn.net/iTaacy/article/details/76716049 使用Sublime text 3打造一个小巧但强大的G ...
- 一个UUID生成算法的C语言实现——WIN32版本
源: 一个UUID生成算法的C语言实现——WIN32版本
- 【C语言入门教程】1.2 函数库 和 链接
程序员可以不需要从头开始设计每一个函数,完成用C语言命令所实现的函数非常罕见.因为所有的C语言编辑器都提供能完成各种常见任务函数,如printf()函数等.C语言编译器的实现者已经编写了大部分常见的通 ...
- 【C语言入门教程】5.5 实现问题(效率)
在设计函数时需要遵循一些基本原则,因为影响到函数的执行效率和可用性.函数是代码复用的基础,一个健壮的函数或由函数组成的函数集可以在多个程序中使用.C语言标准库里存放的就是这样的函数,这些函数被放置在头 ...
- 【C语言入门教程】5.6 函数库和文件
函数库是为代码复用建立的,将同一类型,需要在不同的程序里使用的函数放置在一起,就组成了一个函数库.如 C 语言的标准库,它集合了开发者常用的函数.开发者自行编写的函数也可以组成函数库,通常称之为自定义 ...
随机推荐
- [NOI 2006] 最大获利 80分
最后两点怎么搞都要30s+,但是我不会什么优化啊…暂时就这样吧.Dinic的时间复杂度是O(N^2*M) 这题和TDL的幼儿园模板是一样的. 这次写网络流给自己计时了,大约是40min左右,后来都跑去 ...
- Tomcat容器虚拟路径设置
1.[官方文档]在tomcat\conf下server.xml中找到 <Host name="localhost" appBase="webapps" u ...
- Linux——【转】gcc编译与gdb调试简要步骤
原文:gcc编译与gdb调试简要步骤 一.Linux程序gcc编译步骤: Gcc编译过程主要的4个阶段: l 预处理阶段,完成宏定义和include文件展开等工作:(.i) l 根据编译参数进行不同程 ...
- angular js 图片轮播
搬运工: eg1: Build a Sweet AngularJS Photo Slider Pt 2 with ngTouch DEMO:http://paul-xiao.github.io/ang ...
- 用powershell+excel行列转置三步走
本文重点讲解第一步,手动在excel表中输入公式,或者用powershell自动输入公式. 第二步,用powershell向excel中写入数据,略. 第三步,用powershell从excel中读取 ...
- 黑马程序员——C语言基础 内存剖析
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)进制 进制是一种计数的方式,数值的表示形式.有多种进制十进制.二进制 ...
- GreenDao数据库框架的配置与增删改查
并非原创,原创地址http://blog.csdn.net/njweiyukun/article/details/51893092 配置-------------------------------- ...
- 如何解决Selenium中"Cannot find function addEventListener in object [object HTMLDocument]"的错误
project: blog target: how-to-resolve-cannot-find-function-addEventListener-error-in-selenium.md stat ...
- hash表C语言实现
算法参考<算法导论>第11章散列表.采用链地址法解决冲突. #include <stdio.h> #include <stdlib.h> #include < ...
- 【汇总】Android 常用方法整理
1.解决ActionBar OverFlow按钮不显示.(在oncreate中调用即可) private void setOverflowShowingAlways() { try { ViewCon ...