关于一个通俗易懂的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 语言的标准库,它集合了开发者常用的函数.开发者自行编写的函数也可以组成函数库,通常称之为自定义 ...
随机推荐
- html5之canvas画图基础
HTML5+CSS3的好处是,你可以编写一个页面分别用于不同的平台,只需要设置不同的css样式就可以了,现在基本主流浏览器都支持全新的HTML5和CSS3,因为它的跨平台开发.因为是原生代码所以它的页 ...
- app上传到App Store的快捷方法及步骤
跳过证书的申请及配置概要文件的设置, 现在根据已有的配置概要文件及发布证书开始: 1.先在Xcode上的PROJECT和TARGETS->Build Setting->Code Signi ...
- ScrollView can host only one direct child
Android 采用ScrollView布局时出现异常:ScrollView can host only one direct child. 异常原因: 主要是ScrollView内部只能有一个子元素 ...
- java web学习之初识jsp
用java语言(+html语言)开发动态资源的技术: jsp的运行过程,1:tomcat服务器将jsp代码翻译成java代码,并且编译成class文件 2:tomcat服务器构造类对象 3:tomca ...
- vultr vps服务器存在的7个优势及选择原因
原本准备在第一篇文章的时候完整的新注册账户的,但是考虑到对于这款VPS主机的了解,还是先整理这篇关于网络上和我自己在使用vultr vps主机产品的时候可能自认为的优势之处,这样可以加强很多新用户对于 ...
- 基于H5的移动端开发,window.location.href在IOS系统无法触发问题
最近负责公司的微信公众号开发项目,基于H5进行开发,某些页面window.location.href在Android机上能正常运行而IOS系统上无法运行,导致无法重定向到指定页面,查了好久终于找到方法 ...
- PowerMockito 同时mock多个对象
有时候,需要测试的方法内有collections结构,就需要同时mock多个对象 被测方法: public class EmployeeService { public List<Integer ...
- 在gridControl的单元格中的多行文本
我们知道,gridcontrol里面的单元格默认是不能换行的,但是有时候我们需要显示要换行的文本,应该怎么处理呢?这里提供一个方案: 假设我有一个列”合同文本“(colContractText),我要 ...
- Android高效加载大图、多图解决方案,有效避免程序OOM
高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状.不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统图片库里展示的图片大都是 ...
- sqlserver查看所有的外键约束
select a.name as 约束名, object_name(b.parent_object_id) as 外键表, d.name as 外键列, object_name(b.reference ...