找到一个通俗易懂并且神奇并且有趣的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语言实现教程的更多相关文章

  1. 一个UUID生成算法的C语言实现 --- WIN32版本 .

    一个UUID生成算法的C语言实现——WIN32版本   cheungmine 2007-9-16   根据定义,UUID(Universally Unique IDentifier,也称GUID)在时 ...

  2. 制作一个类似苹果VFL的格式化语言来描述UIStackView

    在项目中总是希望页面上各处的文字,颜色,字体大小甚至各个视图控件布局都能够在发版之后能够修改以弥补一些前期考虑不周,或者根据统计数据能够随时进行调整,当然是各个版本都能够统一变化.看到这样的要求后,第 ...

  3. FFT 的C 语言

    FFT 的C 语言 说好的C 语言实现.必须搞定它! 理论介绍: http://blog.csdn.net/cinmyheart/article/details/39052739 这里有之前matla ...

  4. 写一个程序,统计自己C语言共写了多少行代码。ver2.00

    概要 完成一个程序,作用是统计一个文件夹下面所有文件的代码行数.输入是一个文件夹的绝对路径,输出是代码行数.所以此程序的新特点有两个: 统计某一文件夹下的所有文件: 可以任意指定本机硬盘上任何位置的某 ...

  5. 使用Sublime text 3打造一个小巧但强大的Go语言开发IDE

    版权声明:欢迎转载,转载请注明出处! https://blog.csdn.net/iTaacy/article/details/76716049 使用Sublime text 3打造一个小巧但强大的G ...

  6. 一个UUID生成算法的C语言实现——WIN32版本

    源: 一个UUID生成算法的C语言实现——WIN32版本

  7. 【C语言入门教程】1.2 函数库 和 链接

    程序员可以不需要从头开始设计每一个函数,完成用C语言命令所实现的函数非常罕见.因为所有的C语言编辑器都提供能完成各种常见任务函数,如printf()函数等.C语言编译器的实现者已经编写了大部分常见的通 ...

  8. 【C语言入门教程】5.5 实现问题(效率)

    在设计函数时需要遵循一些基本原则,因为影响到函数的执行效率和可用性.函数是代码复用的基础,一个健壮的函数或由函数组成的函数集可以在多个程序中使用.C语言标准库里存放的就是这样的函数,这些函数被放置在头 ...

  9. 【C语言入门教程】5.6 函数库和文件

    函数库是为代码复用建立的,将同一类型,需要在不同的程序里使用的函数放置在一起,就组成了一个函数库.如 C 语言的标准库,它集合了开发者常用的函数.开发者自行编写的函数也可以组成函数库,通常称之为自定义 ...

随机推荐

  1. git branch(git 的branch 使用方法)

    查看分支:         $ git branch    该命令会类出当先项目中的所有分支信息,其中以*开头的表示当前所在的分支.参数-r列出远程仓库中的分支,而-a则远程与本地仓库的全部分支. 创 ...

  2. Tomcat Shell脚本(启动|关闭|重启|状态)

    #!/bin/bash # # chkconfig: - # description: Tomcat start/stop/status script #Location of JAVA_HOME ( ...

  3. windows下python Tkinner环境布置(包含PIL环境安装)

    布置步骤:1.安装python 2.7.11 安装步骤:由于网上存在有相关经验,所以在此引用一下 http://jingyan.baidu.com/article/0bc808fc42dfab1bd4 ...

  4. C#中DateTime.Now.ToString()

    项目开发中遇到一个问题:C#编写的SQL语句中有时间值,刚开始直接将DateTime.Now进行toString()处理,源代码调试程序运行正常. 然后我的电脑重装了系统,再次运行程序就报错“从字符串 ...

  5. Android开源框架:Universal-Image-Loader解析(二)MemoryCache

  6. 六大免费网站数据采集器对比(火车头,海纳,云采集,ET,三人行,狂人采集)

    2013年02月27日 PHP开源系统 暂无评论 阅读 497 views 次 在目前的站长圈内,比较流行的采集工具有很多,但是总结起来,比较出名的免费的就这么几个:火车头,海纳,云采集,ET,三人行 ...

  7. 2016 - 3 - 12 SQLite的学习之SQL语言入门

    1.SQL语句的特点: 1.1 不区分大小写 1.2 每条语句以;结尾 2.SQL语句中常用关键字: select,insert,update,from,create,where,desc,order ...

  8. 2016 - 2 - 20 ARC知识总结(二 autorelease概念及实现)

    首先祝自己生日快乐~23咯~ 一  autorelease的概念 autorelease会像C语言的自动变量那样来对待对象实例.当超出作用域(相当于变量作用域)时,对象的实例release实力方法被调 ...

  9. iOS中block的用法 以及和函数用法的区别

    ios中block的用法和函数的用法大致相同 但是block的用法的灵活性更高: 不带参数的block: void ^(MyBlock)() = ^{}; 调用的时候  MyBlock(); 带参数的 ...

  10. 重载运算符:类成员函数or友元函数

    类成员函数: bool operator ==(const point &a)const { return x==a.x; } 友元函数: friend bool operator ==(co ...