没有合适的资源?快使用搜索试试~ 我知道了~
基于FFT快速优化算法在MSP430G2553芯片上实现128点快速傅里叶变换_小字体1
需积分: 0 30 下载量 201 浏览量
2022-08-03
21:47:52
上传
评论 1
收藏 1.53MB PDF 举报
温馨提示
试读
12页
前言:如果你看到了这篇文章,那么我应该默认你已经懂得了傅里叶变换是干什么的(用2553实现FFT,全网基本上就没有,但凡想实现FFT功能的也不会选2553(老人
资源推荐
资源详情
资源评论
基于FFT快速优化算法在MSP430G2553单片机上实现128点快
速傅里叶变换
一、项目简介及实现原理
项目简介
基于入门级单片机MSP430G2553(主时钟16MHz,512B RAM, 16KB FLASH)(对刚刚学习单片机的童鞋来讲,这款芯片的
资源已经足够,但是稍微增加一些复杂的算法或者功能就会很费劲,比如FFT算法。如果使用最直接简单的FFT,不进行优
化,则最多可以运行64点FFT,主要消耗资源为RAM,512字节的RAM不允许开辟很大的数组)。
FFT(Fast Fourier Transform)即快速傅里叶变换,是DFT(Discrete Fourier Transform,离散傅里叶变换)的高效算法,
并不是一种新的变换。
FFT是DFT的高效算法,但FFT也有一些神奇的“变种”。参考文章 《几种特殊的FFT算法》 。本项目利用其中的实数FFT算法
用64点FFT程序框架实现128点FFT。
基本FFT原理
前言:
如果你看到了这篇文章,那么我应该默认你已经懂得了傅里叶变换是干什么的(用2553实现FFT,全网基本上就没有,但
凡想实现FFT功能的也不会选2553(老人地铁手机),所以这篇文章是学长总结给为了学分而来的学弟们学妹们),并且
也了解了DTFT,DFT,FFT等各种形式的傅里叶变换之间的联系(即便不理解也不影响使用本程序),此处就不进行详细
阐述了。一是一篇短文章不太可能把伟大深邃的傅里叶变换讲通透;二是本文的重点是对理论转换到程序进行描述,着重
于软件实现;三是笔者水平并不高,自己也并未将傅里叶变换理解的很透彻,仅仅是了解FFT的过程以及应用范畴和各种
参数的含义,具体的数学推导以及整个理论的支撑建议大家从《信号与系统》-->《DSP数字信号处理》中寻找答案。
FFT是啥?
简单来说,FFT就是一种快速计算DFT的方法,DFT是有限离散傅里叶变换,是将离散的数据进行离散时间傅里叶变换
(DTFT)后得到的频域连续函数再进行离散化(单独的点数据,不连续,称为离散)得到的。所以DFT的输入数据和输出
数据都是离散的。既然FFT只是DFT的快速算法,那么FFT的输入输出也是离散的,且计算过程比DFT快,而计算机处理模
拟量(连续的)比处理离散化数据难的多,所以现在计算机普遍使用FFT进行数据处理。
FFT后的数据有什么用呢?实际上,这个问题涉及到了很多领域,因为傅里叶变换在每一个领域几乎都可以找到它的身
影。数字信号处理这门课程实际上就是在讲傅里叶变换,围绕傅里叶变换对数字信号进行处理,那么是不是可以说只要涉
及到数字信号的领域都可以用傅里叶变换作为工具去分析呢?实际上,物联网,机械震动,通信传输,图像处理等很多你
想到的,想不到的领域,都会使用到傅立叶变换。最直接的用处就是用作信号的频谱分析。
FFT的计算过程 (本章节参考此篇知乎,基本框架代码来自该文章,优化部分为原创。想全面了解算法请查看此篇文章,想
了解优化部分,可以略过此部分,直接跳到程序优化)
整个FFT的计算过程一般都以图形方式表示,蝶形运算就是其中的精髓。下图即为一个简单的蝶形运算:
表示的结果为:
其中 是旋转因子,旋转因子定义为:
由该定义可以推出以下性质:
1)周期性
,其中:
2)对称性
3)可约性
4)特殊的旋转因子
这些性质的运用,使得DFT的运算量大大减少,也是FFT能够高效快速运算的核心。
了解了蝶形运算的规则,我们还需要知道FFT的运算流程,FFT有很多种不同的抽取运算方式,大体分为时序抽取和频域抽
取。
大家只要将两者抽取的图形对比一下 ,就可以知道,这两种方案其实是相同的,只不过把输入和输出的标号顺序交换了一
下,一个是从奇偶序到顺序(基2时序抽选)一个是从顺序到奇偶序(基2频域抽选)。下图分别为时序和频域抽选的计算
流程图:
基2时序抽选法
基2频域抽选法
看到上面的流程图,我们就可以来分析整个FFT的运算结构以及转化成C语言程序所需要的步骤了(仅针对基2时域抽
选):
1)输入序列为划分奇偶后的序列,因此,我们需要先进行码位倒序,即将原来顺序排列的数据按照新的规则分开
重新排列。
2)进行蝶形运算的设计,这一点极为头痛,尤其是看到这个流程图之后,似乎完全没有办法用一些程序思维将其
转化。最开始我也是这么认为,但好在人类的强大就是可以把每一代的智慧结晶都保存下来,供我这种不太灵光的
人借鉴,指引前进的方向。于是乎,在互联网的帮助下,找到了这篇优秀的 文章 ,完整的阐述了FFT蝶形运算的规
律,以及如何将其糅合进C语言程序中。看完整个文章以后,发现所有的思路都归结“找规律”这三个字,人为的寻
找不同的参数之间的规律,并且将参数之间的规律融合,由此形成了一个完整的算法程序。
顺序 反序
十进
制
二进
制
二进
制
十进
制
0 000 000 0
1 001 100 4
2 010 010 2
3 011 110 6
4 100 001 1
5 101 101 5
6 110 011 3
7 111 111 7
程序是怎样炼成的
首先从8点FFT的运算图中寻找规律,下图是8点FFT的运算流程图,首先规定几个符号:
1)此图 ,表示为8点FFT
2)左边x(n)代表输入的数组,A[n]代表C语言储存的数组,右边的X(k)代表运算后的数组,即经过FFT变换后的数组。
3) 是旋转因子,p为指数,p相同则旋转因子相同。
找规律:
根据左边的x(n)的顺序,我们知道在x(n)输入到整个蝶形运算时,顺序发生了变化,我们称之为码位倒序,即用二
进制表示时,码位倒序后的数的二进制为原数二进制的反序,如下表所示:
因此,整个程序应该先将原序列数据经过码位倒序,重新排列后,再输入到FFT程序进行计算。实现码位倒序的程序比较
多,最基本的可以从原理入手。
例如,设I为原的数组下标,J为码位倒序后的数组下标,从左到右遍历I的所有位,遍历的同时,将当前的位的二进制值,
按照从右到左的顺序赋给J,最终完成码位倒序。也可以选择从两边向中间遍历,最后将J变成码位倒序。
这里不使用这两种方案,因为涉及到的位操作对于C语言而言效率不高,写起来也比较繁琐。
还有一种方案:
剩余11页未读,继续阅读
资源评论
扈涧盛
- 粉丝: 24
- 资源: 319
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功