找到一个通俗易懂并且神奇并且有趣的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. Eclipse - 修改默认user和类的创建日期

    1.找到eclipse.ini文件 2.在文件中找到 -vmargs -Duser.name=xxxxxxxx 3.修改xxxxxxxx为你的名字 4.eclipse中:Window -> Pr ...

  2. svn出现版本冲突之后的 无效路径

    .csproj.FileListAbsolute.txt  找到之后删掉错误的代码

  3. 用powershell+excel行列转置三步走

    本文重点讲解第一步,手动在excel表中输入公式,或者用powershell自动输入公式. 第二步,用powershell向excel中写入数据,略. 第三步,用powershell从excel中读取 ...

  4. Access restriction: The type TaskTopicResolver is not accessible due to restrict

    Access restriction: The type TaskTopicResolver is not accessible due to restrict :  Eclipse 默认把这些受访问 ...

  5. as3 代码加解密

    private var loader:URLLoader; ... private function init():void { loader = new URLLoader; req=URLRequ ...

  6. AngularJs的UI组件ui-Bootstrap分享(一)

    最近几个月学习了AngularJs和扩展的UI组件,并在公司小组内做了一次分享交流,感觉很有收获,在此记录下个人的学习心得. 目录: AngularJs的UI组件ui-Bootstrap分享(一) A ...

  7. Which ports are considered unsafe on Chrome

    1, // tcpmux 7, // echo 9, // discard 11, // systat 13, // daytime 15, // netstat 17, // qotd 19, // ...

  8. thymeleaf的常见用法

    1,th:属性名="",就可以直接修改控件的属性,比如 <input th:type="button" th:name="xinxin" ...

  9. Unity中游戏的声音管理

    using UnityEngine;using System.Collections;using System.Collections.Generic;/// <summary>/// 用 ...

  10. linux中解压缩并安装.tar.gz后缀的文件

    1.解压缩: Linux下以tar.gz为扩展名的软件包,是用tar程序打包并用gzip程序压缩的软件包.要安装这种软件包,需要先对软件包进行解压缩,使用“tar -zxfv filename.tar ...