关于一个通俗易懂的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 语言的标准库,它集合了开发者常用的函数.开发者自行编写的函数也可以组成函数库,通常称之为自定义 ...
随机推荐
- 在CDH5.5.0上安装Kudu6.0
1. 下载安装文件: a. CSD文件:KUDU-0.6.0.jar b. kudu parcel:KUDU-0.6.0-1.kudu0.6.0.p0.334-el6.parcel和manifest. ...
- SoapUI中如何获取当前active环境
// Get the current selected Environment def activeEnv = testRunner.testCase.testSuite.project.getAct ...
- 例子:Background Audio Streamer Sample
The Background Audio Streamer sample demonstrates how to create an app that uses a MediaStreamSource ...
- 使用strace 工具跟踪系统调用和信号
使用strace来执行程序,它会记录程序执行过程中调用,接收到的信号,通过查看记录结果,就可以知道程序打开哪些文件,进行哪些读写,映射哪些内存,向系统申请多少内存等信息 strace 移植 下载str ...
- Java在JFinal中出现Can not create instance of class: com.keesail.web.config.WebConfig异常处理方式
编译的时候一直出现如下问题: 后面 查了许多资料 说是build项目的时候web.xml没有输出到class目录.后面试了很多方式不行.后面自己摸索出如下方式解决问题: 改成默认输出目录.
- 数据库DDL语句书写规范
数据库DDL语句书写规范 1.SQL语句编写说明编写SQL语句应遵循统一的规范,包括大小写.空格.换行.缩进等等,只有完全一样的SQL才能在数据库中共享,从而减少硬解析. 字段类型.长度:根据数据情况 ...
- centos 6 安装 gitlib
安装gitlab-----------1. 下载 gitlabcurl -O https://downloads-packages.s3.amazonaws.com/centos-6.5/gitlab ...
- Hive的内表和外表以及分区表
1. 内表和外表的区别 内表和外表之间是通过关键字EXTERNAL来区分.删除表时: 内表:在删除时,既删除内表的元数据,也删除内表的数据 外表:删除时,仅仅删除外表的元数据. CREATE [EXT ...
- Unity在PC上创建Excel文档
NPOI下载连接:http://pan.baidu.com/s/1qWoITRI
- Alpha版使用说明书
游戏规则: 玩家是黑色的小煤球哦! 通过方向键或者ASDW,来控制小球移动(上.下.左.右). 累计时间,直到碰到了红色的小球 ...