课程设计:FFT算法的matlab实现及应用研究(含源码、数据和报告)

完整源码下载
点击下载

1、资源项目源码均已通过严格测试验证,保证能够正常运行;
2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通;
3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;
4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

题目1:FFT算法的matlab实现及应用研究
设计要求:
1.编程实现FFT算法;
2.运用编写的FFT程序对信号进行FFT计算和还原,待分析的信号自
行选择和产生,可以是一段音乐,可以是自己录入的语音信号或者
是一副图像等;
3.与matlab的FFT函数进行比较;
3.设计系统界面。

一、设计目的

  1. 加深对DFT算法原理和基本性质的理解;
  2. 熟悉FFT的算法原理和FFT子程序的算法流程和应用;
  3. 学习DSP中FFT的设计和编程思想;
  4. 熟悉FFT和IFFT在实际图像处理和音频处理中的效果;
  5. 掌握MATLAB编程,熟悉MATLAB的基本语法以及函数的调用;
  6. 学会运用MATLAB的信号处理功能,能够进行语音信号采集,并对语音信号进行变换以及还原处理,观察其时域和频域特性;
  7. 学会运用MATLAB进行图像信号采集,并对图像信号进行变换以及还原处理。

二、设计原理
本次课程设计我们的任务是分别用Matlab系统自带的基2fft函数和我们自己编写的基2fft函数来对图像进行处理和还原。
首先,我们知道,一张彩色图片是由一个三维数组组成,它们可以分成三个二维数组,分别代表图片每个点的R,G,B的值。所以,我们只需分别对每个二维数组进行fft处理即可。
然后,每个二维数组可以看成由x行个一维数组构成,每个一维数组的元素个数为y个(假设图片的长度为y,宽度为x)。所以我们对一个二维数组求基2fft变换,实际上只需对每个二维数组的每一行和每一列分别求一次一维的基2fft变换即可。
在进行一维数组的基2fft求解之前,必须保证数组的元素个数为2的n次方个,n为整数,所以在进行一维数组的基2fft变换前,应先将数组进行补0处理。所以,我们在对一幅图片进行fft变换前,先将图片进行了补0处理。即把原图片补成长和宽都为2的n次方个点,再进行fft变换。

三、步骤
1)建立一个GUI界面,并填充相应的元素,如按钮,静态文本框等。构思好整
体效果,规划好每个按钮要实现的功能。
2)右击打开图片按钮,查看回调函数编写打开图片的代码。
3)同第二步,编写用系统自带fft函数处理图像并显示的代码。
4)编写对经过fft函数处理过的图像进行ifft变换并显示的代码。
5)开始自己编写一维数组的基2fft函数并测试所写代码的正确性。
6)编写一维数组的ifft函数并测试代码的正确性。
7)运行整个程序,查看程序的实际实现效果。
8)添加对音频处理的界面及代码。
9)不断改进所编代码。

四、详细内容
1、fft函数的编写
要编写基2fft算法的运算程序,首先要分析它的运算规律,总结编程思想并画出程序框图。

1.1 原位计算
对N=2M点的FFT共进行M级运算,每级由N/2个蝶形运算组成。在同一级中,每个蝶的输入数据只对本蝶有用,所以每算完一个蝶后,所得数据可立即存入原输入数据所占用的存储单元。

1.2 蝶形运算
蝶形运算是分级进行的,每级的蝶形运算可以按旋转因子的指数大小排序进行。如果指数大小一样则可以从上往下依次蝶形运算。对N=2M点的FFT共有M级蝶形运算,用L表示从左到右的运算级数(L=1,2,…,M)。第L级共有B=2L-1个不同指数的旋转因子,用R表示这些不同指数旋转因子从上到下的顺序(R=0,1,…,B-1)。第R个旋转因子的指数P=2M-LR,旋转因子指数为P的第一个蝶的第一节点标号k从R开始,由于本级中旋转因子共有2M-L个,且这些蝶的相邻间距为2L,所以旋转因子指数为P的最后一个蝶的第一节点标号k为:(2M-L-1)*2L+R=N-2L+R,本级中各蝶的第二个节点与第一个节点都相距B点。应用原位计算,蝶形运算可表示成如下形式:

总结上述规律,可采用如下算法。因为在调用此函数之前,我们已经给数组补过零保证了数组的长度为2的n(n为整数)次方,所以这里省去了数组补零操作。首先读入数据,得到数组长度N和运算级数M(M=log2(N))。
然后对数组进行倒序处理。倒序后从第1级开始逐级进行,共进行M级运算。在进行第L级运算时,先算出该级不同旋转因子的个数B=2L-1,同时,B也是该级中各个蝶形运算两输入数据的间距。再从R=0开始按序计算,直到R=B-1结束。每个R对应的旋转因子指数P=2M-LR,旋转因子指数相同的蝶从上往下依次逐个运算,各个蝶的第一节点标号k都是从R开始,以2L为步长,到N-2L+R结束,也可简取极值N-2结束。所以,数据倒序后的运算可以用一个三重循环程序来实现,图1为编写FFT2的程序框图。

1.3序列倒序
用MATLAB等高级语言实现倒序时,直接倒置二进制数位的方法不可取,需要找出产生倒序的十进制规律。将十进制顺序数用I表示,与之对应的二进制数用IB表示。十进制倒序数用J表示,与之对应的二进制数用JB表示,所以JB是IB的为倒置结果。若十进制顺序数加1,则相当于IB最低位加1且逢2向高位进1,即相当于JB最高位加1且逢2向低位进1.JB的变化规律反映到J的变化分两种情况:如果JB的最高位是0(J<N/2),则最高位直接加1(J=J+N/2)得到下一个倒序值;如果JB的最高位为1(J>=N/2),则要先将最高位变成0(J=J-N/2),再在次高位加1(J=J+N/4)。但次高位加1时,同样也要判断该位的0,1值,重复上面的过程,依次类推,直到完成最低位加1,逢2向右进位的运算。此方法可实现按顺序数I的递增顺序,依次求得与之对应的倒序数J。另外,当I=J时不需要交换,当I≠J时需要交换数据。为了避免再次调换前面已经调换过的一对数据,只对I<J的情况进行数据交换即可实现数据倒序操作。图2为数据倒序算法的程序框图。

在这里插入图片描述

图1 基2fft算法程序框图 图2 数据倒序算法的程序框图

五、设计结果及总结分析
1.图像对比分析
在这里插入图片描述
从运行结果来看,自编fft函数对图像的处理和系统自带的fft函数对图像的处理效果相同,说明程序编写的正确。在看自编的ifft函数和系统自带ifft函数对图像的还原,两者还原的图片也没有区别。说明编写的ifft函数也是正确的。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 20
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毕业小助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值