实验五 快速傅里叶变换

合集下载

快速傅里叶变换(FFT)实验说明概要

快速傅里叶变换(FFT)实验说明概要

算法验证原理:为了验证该 FFT 的频谱分析能力,故对一段合成信号进行 FFT 。

方波的傅里叶级数展开公式如下:根据以上公式各次谐波与基波之间的谐波频率与谐波幅度的关系, 我们可以使用 sin 函数合成任意次的方波。

这里,我们选取三次谐波合成方波。

以下是例程中的合成三次谐波信号:Input[i]=sin(2*pi*5*i/(NL-1+sin(2*pi*i*5*3/(NL-1/3+sin(2*pi*i*5*5/(NL-1/5;基波角频率 =2*pi*5, NL 为将连续信号离散化的点数,在2π的周期上均匀分割为 NL 个离散点。

这一步代替了 AD 采样的功能。

离散点存放在数组 Input[i]里面,长度为 NL 。

例程里面 NL=256。

加载程序并运行,点击 view->Graph->Time/Frequency,设置如下:点击 OK ,出现如下图所示的波形:这是合成信号的时域波形, 根据吉布斯效应,如果谐次增加, 高电平两个尖峰之间的震荡幅度将会减小变密,但是两边的尖峰不会削减。

接着我们设置如下:点击 OK ,我们将看到如下波形:上图为对该合成信号的 256点 FFT 频谱图,在三个频率分量处有幅度分布。

由于 FFT 是在2π上的分析, 而且将复数进行了取模运算, 所以频谱图是关于π(采样值为点 127的对称图形。

将鼠标点击到尖峰处,分别得到点数与幅度的值为:第一尖峰:(5, 0.99 第二尖峰:(15, 0.32 , 第三尖峰:(25, 0.19 。

采样点数关系为 5,15,25,满足 1:3:5的频率关系;量化的幅度关系为 0.99:0.32:0.19,满足 1:1/3:1/5的谐波幅度关系。

因此,该 FFT 算法能够准确的对信号进行频谱计算。

快速傅立叶变换FFT 实验报告

快速傅立叶变换FFT  实验报告

快速傅立叶变换(FFT)算法实验一.实验目的1.加深对DFT算法原理和基本性质的理解;2.熟悉FFT算法原理和FFT子程序的应用;3.学习用FFT对连续信号和时域信号进行谱分析的方法,了解可能出现的分析误差及其原因,以便在实际中正确应用FFT。

二.实验设备计算机,CCS 3.1 版软件,E300实验箱,DSP仿真器,导线三.基本原理1.离散傅立叶变换DFT的定义:将时域的采样变换成频域的周期性离散函数,频域的采样也可以变换成时域的周期性离散函数,这样的变换称为离散傅立叶变换,简称DFT。

2.FFT是DFT的一种快速算法,将DFT的N2步运算减少为(N/2)log2N步,极大的提高了运算的速度。

3.旋转因子的变化规律。

4.蝶形运算规律。

5.基2FFT算法。

四.实验步骤1.E300底板的开关SW4的第1位置ON,其余置OFF。

其余开关不用具体设置。

2.E300板子上的SW7开关的第1位置OFF,其余位置ON3.阅读本实验所提供的样例子程序;4.运行CCS软件,对样例程序进行跟踪,分析结果;记录必要的参数。

5.填写实验报告。

6.提供样例程序实验操作说明A.实验前准备用导线连接“Signal expansion Unit”中2号孔接口“SIN”和“A/D单元”的2号孔接口“AD_IN0”。

(实验采用的是外部的AD模块)B.实验1.正确完成计算机、DSP仿真器和实验箱的连接后,系统上电。

2.启动CCS3.1,Project/Open打开“algorithm\01_fft”子目录下“fft.pjt”工程文件;双击“fft.pjt”及“Source”可查看各源程序;加载“Debug\fft.out”;3.单击“Debug\Go main”进入到主程序,在主程序“flag=0;”处设置断点;4.单击“Debug \ Run”运行程序,或按F5运行程序;程序将运行至断点处停止;5.用View / Graph / Time/Frequency打开一个图形观察窗口;设置该观察图形窗口变量及参数;采用双踪观察在启始地址分别为px和pz,长度为128,数值类型为16位整型,p x:存放经A/D转换后的输入信号;p z:对该信号进行FFT变换的结果。

快速傅里叶变换(含详细实验过程分析)

快速傅里叶变换(含详细实验过程分析)

一、实验目的1、掌握FFT 算法和卷积运算的基本原理;2、掌握用C 语言编写DSP 程序的方法;3、了解利用FFT 算法在数字信号处理中的应用。

二、实验设备 1. 一台装有CCS 软件的计算机; 2. DSP 实验箱的TMS320C5410主控板; 3. DSP 硬件仿真器。

三、实验原理 (一)快速傅里叶变换傅里叶变换是一种将信号从时域变换到频域的变换形式,是信号处理的重要分析工具。

离散傅里叶变换(DFT )是傅里叶变换在离散系统中的表示形式。

但是DFT 的计算量非常大, FFT 就是DFT 的一种快速算法, FFT 将DFT 的N 2步运算减少至 ( N/2 )log 2N 步。

离散信号x(n)的傅里叶变换可以表示为∑=-=10][)(N N nk N W n x k X , Nj N e W /2π-=式中的W N 称为蝶形因子,利用它的对称性和周期性可以减少运算量。

一般而言,FFT 算法分为时间抽取(DIT )和频率抽取(DIF )两大类。

两者的区别是蝶形因子出现的位置不同,前者中蝶形因子出现在输入端,后者中出现在输出端。

本实验以时间抽取方法为例。

时间抽取FFT 是将N 点输入序列x(n) 按照偶数项和奇数项分解为偶序列和奇序列。

偶序列为:x(0), x(2), x(4),…, x(N-2);奇序列为:x(1), x(3), x(5),…, x(N-1)。

这样x(n) 的N 点DFT 可写成:()()∑++∑=-=+-=12/0)12(12/02122)(N n kn NN n nkNW n x Wn x k X考虑到W N 的性质,即2/)2//(22/)2(2][N N j N j N W e e W ===--ππ因此有:()()∑++∑=-=-=12/02/12/02/122)(N n nkN k NN n nkN W n x WWn x k X或者写成:()()12()kN X k X k W X k =+由于X 1(k) 与X 2(k) 的周期为N/2,并且利用W N 的对称性和周期性,即:k N N k N W W -=+2/可得:()()12(/2)kN X k N X k W X k +=-对X 1(k) 与X 2(k)继续以同样的方式分解下去,就可以使一个N 点的DFT 最终用一组2点的DFT 来计算。

FFT算法分析实验实验报告

FFT算法分析实验实验报告

FFT算法分析实验实验报告一、实验目的快速傅里叶变换(Fast Fourier Transform,FFT)是数字信号处理中一种非常重要的算法。

本次实验的目的在于深入理解 FFT 算法的基本原理、性能特点,并通过实际编程实现和实验数据分析,掌握 FFT 算法在频谱分析中的应用。

二、实验原理FFT 算法是离散傅里叶变换(Discrete Fourier Transform,DFT)的快速计算方法。

DFT 的定义为:对于长度为 N 的序列 x(n),其 DFT 为X(k) =∑n=0 到 N-1 x(n) e^(j 2π k n / N) ,其中 j 为虚数单位。

FFT 算法基于分治法的思想,将 N 点 DFT 分解为多个较小规模的DFT,从而大大减少了计算量。

常见的 FFT 算法有基 2 算法、基 4 算法等。

三、实验环境本次实验使用的编程语言为 Python,主要依赖 numpy 库来实现 FFT 计算和相关的数据处理。

四、实验步骤1、生成测试信号首先,生成一个包含不同频率成分的正弦波叠加信号,例如100Hz、200Hz 和 300Hz 的正弦波。

设定采样频率为 1000Hz,采样时间为 1 秒,以获取足够的采样点进行分析。

2、进行 FFT 计算使用 numpy 库中的 fft 函数对生成的测试信号进行 FFT 变换。

3、频谱分析计算 FFT 结果的幅度谱和相位谱。

通过幅度谱确定信号中各个频率成分的强度。

4、误差分析与理论上的频率成分进行对比,计算误差。

五、实验结果与分析1、幅度谱分析观察到在 100Hz、200Hz 和 300Hz 附近出现明显的峰值,对应于生成信号中的频率成分。

峰值的大小反映了相应频率成分的强度。

2、相位谱分析相位谱显示了各个频率成分的相位信息。

3、误差分析计算得到的频率与理论值相比,存在一定的误差,但在可接受范围内。

误差主要来源于采样过程中的量化误差以及 FFT 算法本身的近似处理。

数字信号处理实验 快速傅里叶变换(东大)

数字信号处理实验 快速傅里叶变换(东大)

快速傅里叶变换及其应用1. 实验目的及原理1.1实验目的:(1)在理论学习的基础上,通过本实验,加深对FFT的理解,熟悉MATLAB中的有关函数。

(2)应用FFT对典型的信号进行频谱分析。

(3)了解应用FFT进行信号频谱分析过程中可能出现的问题,以便在实际中正确应用FFT。

(4)应用FFT实现序列的线性卷积和相关。

1.2实验原理:快速傅氏变换(FFT),是离散傅里叶变换的快速算法,它是根据离散傅氏变换的奇,偶,虚,实等特性,对离散傅里叶变换的算法进行改进获得的,根据不同的情况又分为按时间抽取的FFT和频率抽取的FFT,同时还包括N为任意复合数的算法以及Chirp-z变化算法。

2. 实验步骤和内容2.1 高斯序列其他(n)中参数p=8,改变q的值,使q分别等于2、观察高斯序列的时域和幅频特性,固定信号xa4、8,观察它们的时域和幅频特性,了解当q取不同值时,对信号序列的时域和幅频特性的影响;固定q=8,改变p,使p分别等于8,13,14,观察参数p变化对信号序列的时域及幅频特性的影响,注意p等于多少时,会发生明显的泄露现象,混叠是否也随之出现?记录实验中观察到的现象,绘出相应的时域序列和幅频特性曲线。

p=8 , q=4p=8 , q=8p=13 , q=8p=14 , q=8 结果分析:2.2衰减的正弦序列()其他(n)的时域和幅频特性,a=0.1,f=0.0625,检查谱峰出现位置是否正确,观察衰减正弦序列xb注意频谱的形状,绘出幅频特性曲线,改变f,使f分别等于0.4375和0.5625,观察这两种情况下,频谱的形状和谱峰出现位置,有无混叠和泄漏现象?说明产生现象的原因。

f=0.0625f=0.4375f=0.5625结果分析:2.3 三角波和反三角波序列三角波序列其他反三角波序列其他观察三角波和反三角波序列的时域和幅频特性,用N=8点FFT分析信号序列xc (n)和xd(n)的幅频特性,观察两者的序列形状和频谱曲线有什么异同?绘出两序列及其幅频特性曲线。

“快速傅里叶变换的实现”实验报告

“快速傅里叶变换的实现”实验报告
软件设计主要分为四个文件,四个文件各自完成自己的功能,如下: ①FFT1_main.cpp (复数据 FFT)
3
用户复数据输入
数据顺序颠倒 (remap()函数)
逐层蝶式运算
数据输出 ②IFFT_main.cpp (复数据 IFFT) 框图与①相同,略 ③FFT2_main.cpp (实数据 FFT)
设 实 序 列 为 x(n) 。 与 二 次 的 实 函 数 一 样 , 先 把 x(n) 分 离 为 奇 数 序 列
x1(n)(0 n N) 和 偶 数 序 列 x2 (n)(0 n N) 。 再 组 成 复数 序 列
y(n) x1(n) jx2 (n)(0 n N)
3 实验设备
安装了 VC、MATLAB 软件的 PC 机
4 实验原理
①如何在 matlab 上实现与 C 语言的混编? 由于本次实验中涉及到 C 语言与 matlab 进行数据交互的问题。如果按照
实验要求给出的方案来实现的话,无疑在测试中要进行频繁的文件读写才能 把数据在 matlab 和 C 语言之间传递。这样,测试过程缓慢并且容易出现人 为导致的错误。好在 matlab 为我们考虑到了这点,可以使用在 matlab 使用 mex 命令对 C 语言进行编译,编译完成之后,就可以直接在 matlab 命令行调 用 C 语言程序了,避免了 matlab 与 C 语言交互过程带来的种种不便。准确 来讲使用 mex 命令是把 C 语言编译成 matlab 能够识别的动态链接库 (.mexw64/.mexw32)。不过使用之前,用户需要解决两个问题:
第二个问题:matlab 与 C 语言是如何进行数据的传递的。 Matlab 传进 C 语言的数据是以数组的形式存在的。对于实数,可以利用

实验五--快速傅里叶变换

实验五--快速傅里叶变换

实验五--快速傅里叶变换CENTRAL SOUTH UNIVERSITY数字信号处理实验报告题目快速傅里叶变换学生姓名学院物理与电子学院专业班级电子信息科学与技术1105班学号140411072实验五快速傅里叶变换一、实验仪器PC机一台、JQ-SOPC开发系统实验箱及辅助软件(DSP Builder、Matlab/Simulink、Quartus II、Modelsim)。

二、实验目的1、了解快速傅里叶变换的基本结构组成。

2、学习使用DSP Builder设计FFT。

三、实验原理1、FFT的原理:快速傅里叶变换(FFT)是离散傅里叶变换(DFT)的一种高效运算方法,它大大简化了DFT 的运算过程,使运算时间缩短几个数量级。

FFT 算法可以分为按时间抽取(DIT)和按频率抽取(DIF)两类,输入也可分为实数和复数两种情况。

八点时间抽取基-2FFT算法信号流图如图1示:图1 8点基-2 DIT-FFT信号流图四、实验步骤1、将桌面的my_fft_8.mdl拷贝到“D:\Program Files\MATLAB71\work”(MATLAB安装目录下的work文件夹)处,并双击打开。

图5-1 快速傅里叶变换系统图图5-2 快速傅里叶变换子系统1图图5-3 快速傅里叶变换子系统2图图5-3 快速傅里叶变换子系统3图2、点击工具栏即可开始系统级simulink仿真,以验证该模型的正确性。

在仿真进行过程中分别将三个输入控制开关打到000、001、010、011、100以选择五组输入数据进行FFT运算。

(1)当开关打到000时选择第一组数据{2.0,2.0,4.0,7.0,3.0,5.0,5.0,8.0},其运算结果应为36、-2.41+3.84i、-4+8i、0.4219+1.844i、-8、0.4102-1.84i、-4-8i、-2.422-3.844i。

(2)当开关打到001时选择第二组数据{1.1,5.0,10.5,15.3,20.2,25.7,30.6,40.1},其运算结果应该为148.5、-16.1+52.35i、-19.8+24.7i、-22.02+12.25i、-23.7、-22.1-12.15i、-19.8-24.7i、-16.9-52.45i。

快速傅里叶变换FFT实验

快速傅里叶变换FFT实验

1.快速傅里叶变换FFT实验.1)快速傅里叶变换FFT源程序:#include"iostream.h"#include"math.h"//using namespace std#define pi 3.1415926536 //定义pai void swap(double &a,double &b) //定义交换函数swap{double t=a;a=b;b=t;}void fft(double A[],double B[],int M) //定义fft快速傅里叶函数{ long int J,I,L,LE,LE1,P,Q,R;double N,K,Wr,Wi,W1r,W1i,WTr,WTi,theta,Tr,Ti;J=0;N=pow(2,M);//雷达算法码位倒置程序for(I=0;I<N-1;I++){if(J>I){swap(A[I],A[J]);swap(B[I],B[J]);}K=N/2;//向低位进位while(K>=2&&J>=K){J-=K;K=K/2;}J+=K;}//蝶形运算程序//最外层循环由蝶形图的级数确定for(L=1;L<=M;L++){LE=pow(2,L); //各级群间隔LE1=LE/2; //输入间隔Wr=1.0; //Wn的实部Wi=0.0; //Wn的虚部theta=(-1)*pi/LE1;W1r=cos(theta);W1i=sin(theta);//中层循环由Wn的个数确定for(R=0;R<LE1;R++){//内层循环由每一级群的个数确定for(P=R;P<N-1;P+=LE){Q=P+LE1;Tr=Wr*A[Q]-Wi*B[Q];Ti=Wr*B[Q]+Wi*A[Q];A[Q]=A[P]-Tr;B[Q]=B[P]-Ti;A[P]+=Tr;B[P]+=Ti;}//计算每一级的Wn的值WTr=Wr;WTi=Wi;Wr=WTr*W1r-WTi*W1i;Wi=WTr*W1i+WTi*W1r;}}}void main(){int M;double N;cout<<"实验人的信息:姓名:张超华学号:200801000728 专业班级:电力电子0801"<<endl;cout<<"输入序列的个数N(N必须为2^M),N=";cin>>N;//判断输入N的个数是否符合2^M个while(1){double b=log10(N)/log10(2);int a=b/1;if(a-b==0){M=a;break;}else{cout<<"输入序列的个数须为2^M个,重新输入N=";cin>>N;}}double *A=new double[N]; //为序列的实部分配动态空间double *B=new double[N]; //为序列的虚部分配动态空间for(int i=0;i<N;i++){A[i]=0.0;B[i]=0.0;}// 输入序列cout<<"请在下方输入序列的实部:"<<endl;for(int j=0;j<N;j++){cin>>A[j];}cout<<"请在下方输入序列的虚部:"<<endl;for(j=0;j<N;j++){cin>>B[j];}fft(A,B,M); //调用fft函数 cout<<"经快速傅里叶变换后得到的结果为:"<<endl; //输出变换结果 for(int m=0;m<N;m++){cout<<" "<<A[m]<<"+j("<<B[m]<<")"<<endl;}//释放内存空间delete [] A;delete [] B;}2)FFT程序运行结果:(参考课本160页的‘例6-3’运行程序。

数字信号处理_快速傅里叶变换FFT实验报告

数字信号处理_快速傅里叶变换FFT实验报告

数字信号处理_快速傅里叶变换FFT实验报告快速傅里叶变换(FFT)实验报告1. 引言数字信号处理是一门研究如何对数字信号进行处理、分析和提取信息的学科。

傅里叶变换是数字信号处理中常用的一种方法,可以将信号从时域转换到频域。

而快速傅里叶变换(FFT)是一种高效的计算傅里叶变换的算法,广泛应用于信号处理、图象处理、通信等领域。

2. 实验目的本实验旨在通过编写程序实现快速傅里叶变换算法,并对不同信号进行频谱分析。

3. 实验原理快速傅里叶变换是一种基于分治策略的算法,通过将一个N点离散傅里叶变换(DFT)分解为多个较小规模的DFT,从而实现高效的计算。

具体步骤如下: - 如果N=1,直接计算DFT;- 如果N>1,将输入序列分为偶数和奇数两部份,分别计算两部份的DFT;- 将两部份的DFT合并为整体的DFT。

4. 实验步骤此处以C语言为例,给出实验的具体步骤:(1) 定义输入信号数组和输出频谱数组;(2) 实现快速傅里叶变换算法的函数,输入参数为输入信号数组和输出频谱数组;(3) 在主函数中调用快速傅里叶变换函数,得到输出频谱数组;(4) 对输出频谱数组进行可视化处理,如绘制频谱图。

5. 实验结果与分析为了验证快速傅里叶变换算法的正确性和有效性,我们设计了以下实验:(1) 生成一个正弦信号,频率为100Hz,采样频率为1000Hz,时长为1秒;(2) 对生成的正弦信号进行快速傅里叶变换,并绘制频谱图;(3) 生成一个方波信号,频率为200Hz,采样频率为1000Hz,时长为1秒;(4) 对生成的方波信号进行快速傅里叶变换,并绘制频谱图。

实验结果显示,对于正弦信号,频谱图中存在一个峰值,位于100Hz处,且幅度较大;对于方波信号,频谱图中存在多个峰值,分别位于200Hz的奇数倍处,且幅度较小。

这与我们的预期相符,说明快速傅里叶变换算法能够正确地提取信号的频谱信息。

6. 实验总结通过本次实验,我们成功实现了快速傅里叶变换算法,并对不同信号进行了频谱分析。

快速傅里叶变换实验报告

快速傅里叶变换实验报告

快速傅里叶变换实验报告机械34班 刘攀 2013010558一、 基本信号(函数)的FFT 变换1. 000()sin()sin 2cos36x t t t t πωωω=+++ 1) 采样频率08s f f =,截断长度N=16;取02ωπ=rad/s ,则0f =1Hz ,s f =8Hz ,频率分辨率f ∆=s f f N ∆==0.5Hz 。

最高频率c f =30f =3Hz ,s f >2c f ,故满足采样定理,不会发生混叠现象。

截断长度02T T =,整周期截取,不会发生栅栏效应。

理论上有一定的泄漏,但在整周期 截取的情况下,旁瓣上的采样都约为 0,泄漏现象没有体现出来。

频谱图如下:幅值误差0A ∆=,相位误差0ϕ∆=。

2) 采样频率08s f f =,截断长度N=32;取02ωπ=rad/s ,则0f =1Hz ,s f =8Hz ,频率分辨率f ∆=s f f N ∆==0.25Hz 。

最高频率c f =30f =3Hz ,s f >2c f ,故满足采样定理,不会发生混叠现象。

截断长度04T T =,整周期截取,不会发生栅栏效应。

理论上有一定的泄漏,但在整周期 截取的情况下,旁瓣上的采样都约为 0,泄漏现象没有体现出来。

频谱图如下:幅值误差0A ∆=,相位误差0ϕ∆=。

2. 00()sin()sin116x t t t πωω=++ 1) 采样频率08s f f =,截断长度N=16;取02ωπ=rad/s ,则0f =1Hz ,s f =8Hz ,频率分辨率f ∆=s f f N ∆==0.5Hz 。

最高频率c f =110f =11Hz ,s f <2c f ,故不满足采样定理,会发生混叠现象。

漏,但在整周期 截取的情况下,旁瓣上的采样都约为 0,泄漏现象没有体现出来。

频谱图:由上图可以看出,并未体现出110f 的成分,说明波形出现混叠失真。

为了消除混叠现象,应加大采样频率, 使之大于等于 22Hz 。

(完整)快速傅里叶变换fft的Matlab实现 实验报告

(完整)快速傅里叶变换fft的Matlab实现 实验报告

(完整)快速傅里叶变换fft的Matlab实现实验报告编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)快速傅里叶变换fft 的Matlab实现实验报告)的内容能够给您的工作和学习带来便利。

同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)快速傅里叶变换fft的Matlab实现实验报告的全部内容。

一、实验目的1在理论学习的基础上,通过本实验加深对快速傅立叶变换的理解;2熟悉并掌握按时间抽取FFT算法的程序;3了解应用FFT进行信号频谱分析过程中可能出现的问题,例如混淆、泄漏、栅栏效应等,以便在实际中正确应用FFT。

二、实验内容1仔细分析教材第六章‘时间抽取法FFT '的算法结构,编制出相应的用FFT进行信号分析的C语言(或MATLAB 语言)程序;用MATLAB语言编写的FFT源程序如下:%% 输入数据f、N、T及是否补零clc;clear;f=input('输入信号频率f:');N=input('输入采样点数N:');T=input(’输入采样间隔T:');C=input('信号是否补零(补零输入1,不补零输入0):’); %补零则输入1,不补则输入0if(C==0)t=0:T:(N—1)*T;x=sin(2*pi*f*t);b=0;e lseb=input(’输入补零的个数:');while(log2(N+b)~=fix(log2(N+b)))b=input(’输入错误,请重新输入补零的个数:’);endt=0:T:(N+b—1)*T;x=sin(2*pi*f*t).*(t<=(N—1)*T);end%% fft算法的实现A=bitrevorder(x); % 将序列按二进制倒序N=N+b;M=log2(N); % M为蝶形算法的层数W=exp(—j*2*pi/N);for L=1:1:M % 第L层蝶形算法B=2^L/2; % B为每层蝶形算法进行加减运算的两个数的间隔K=N/(2^L); % K为每层蝶形算法中独立模块的个数for k=0:1:K-1for J=0:1:B-1p=J*2^(M —L ); % p 是W 的指数q=A (k*2^L+J+1); % 用q 来代替运算前面那个数 A(k*2^L+J+1)=q+W^p *A (k*2^L+J+B+1);A (k *2^L+J+B+1)=q —W^p *A (k *2^L+J+B+1); end end end%% 画模特性的频谱图 z =abs(A ); % 取模z=z 。

快速傅立叶变换FFT实验报告

快速傅立叶变换FFT实验报告

一.实验内容用C++实现快速傅立叶变换FFT二.实验目的:更好的了解快速傅立叶变换的实质,用代码进行实现增强自己的编程能力。

三.实现思想在实现过程中采用一行一行的处理进行傅立叶变化,在处理的过程中采用W记号,由于计算机没有虚数这个基本的数据类型,所以用2个函数double CWvltDoc::W_image(int a, int b, int c)和double CWvltDoc::W_real(int a, int b ,int c)来返回W的虚部和实部,用2个数组*transient_real和*transient_image 来记录再频域化的过程中一行中的原始数据频域化后的实部和与虚部和。

在计算完一行像素值后,用该像素点的对应能量=transient_real[]2+transient_image[]2来修改原始数据的蓝色灰度值(后面用蓝色灰度值进行灰度化)。

这样处理完一行中所有的像素点之后用可视化算子进行可视化lpData[y*biAlign+3*i]=255*log10(1+fabs(lpData[y*biAlign+3 *i]))/log10(1+max);四.具体代码voidCWvltDoc::OnFft(){LPBITMAPINFOHEADER lpBitmapInfoHeader =(LPBITMAPINFOHEADER)(m_pBitmap+14);LPBITMAPFILEHEADER lpBitmapFileHeader = (LPBITMAPFILEHEADER)m_pBitmap;unsigned char *lpData = m_pBitmap + lpBitmapFileHeader->bfOffBits;unsigned long biHeight = lpBitmapInfoHeader->biHeight;unsigned long biWidth = lpBitmapInfoHeader->biWidth;unsigned long biAlign = ( biWidth*3+3) /4 *4;unsigned long bmSize = biHeight * biAlign;if (m_pTransfered == NULL)m_pTransfered = (unsigned char*)malloc(bmSize);if (m_pTransfered == NULL)return ;// TODO: Add your command handler code hereint x, y, cur;for (y = 0; y < (int)biHeight; y++) //处理第y行{double *transient_real=new double[biWidth];double *transient_image=new double[biWidth];for(x=0;x<(int)biWidth; x++) //第y行第x个数{double real=0;double image=0;for(inti=0;i<(int)biWidth;i++){real+=W_real(x,i,(int)biWidth)*double(lpData[y*biAlign+3*i]);image+=W_image(x,i,(int)biWidth)*double(lpData[y*biAlign+3*i]);}transient_real[x]=real;transient_image[x]=image;}for(inti=0;i<(int)biWidth; i++) //修改第y行的值lpData[y*biAlign+3*i]=sqrt(pow(transient_real[i],2)+pow(transient_i mage[i],2));delete []transient_real; //释放内存delete []transient_image;}for (y = 0; y < (int)biHeight; y++) //可视化算法{int max=0;for (x = 0; x < (int)biWidth; x++) //找到该行最大的像素值{cur = y*biAlign+3*x;if(fabs(lpData[cur])>max) max=fabs(lpData[cur]);}for(inti=0;i<(int)biWidth;i++)lpData[y*biAlign+3*i]=255*log10(1+fabs(lpData[y*biAlign+3*i]))/log 10(1+max);//可视化算子}for (y = 0; y < (int)biHeight; y++) //进行灰度化{for (x = 0; x < (int)biWidth; x++){cur = y*biAlign+3*x; //current pixelm_pTransfered[cur] = lpData[cur];m_pTransfered[cur+1] = lpData[cur];m_pTransfered[cur+2] = lpData[cur];}}UpdateAllViews(NULL);}doubleCWvltDoc::W_real(int a, int b ,int c){return cos((-2*3.1415*a*b)/c);}doubleCWvltDoc::W_image(int a, int b, int c){return sin((-2*3.1415*a*b)/c);}五.实验过程中遇到的问题及解决办法在具体实现时,开始没有想到灰度化,最后出来的结果还是彩色的图像,并且有的像素点的能量值可能大于255单可视化后一直是白色的点,解决办法是用可视化算子进行可视化,在实现的过程中一直修改的都是像素点的第一个灰度值即蓝色的灰度值,在用可视化算子可视化之后,再用蓝色的分量值进行灰度化即让其他的红色绿色灰度值都等于蓝色灰度值。

快速傅里叶变换实验报告

快速傅里叶变换实验报告

快速傅里叶变换实验报告班级:姓名:学号:快速傅里叶变换一.实验目的1.在理论学习的基础上,通过本实验加深对快速傅立叶变换的理解;2.熟悉并掌握按时间抽取FFT 算法的程序;3.了解应用FFT 进行信号频谱分析过程中可能出现的问题,例如混淆、泄漏、栅栏效应等,以便在实际中正确应用FFT 。

二.实验内容1.仔细分析教材第六章‘时间抽取法FFT ’的算法结构,编制出相应的用FFT 进行信号分析的C 语言(或MATLAB 语言)程序;2.用FFT 程序分析正弦信号()sin(2)[()(*)],(0)1y t f t u t u t N T t u π=---∞<<+∞=设分别在以下情况进行分析并讨论所得的结果:a ) 信号频率f =50Hz ,采样点数N=32,采样间隔T=0.000625sb ) 信号频率f =50Hz ,采样点数N=32,采样间隔T=0.005sc ) 信号频率f =50Hz ,采样点数N=32,采样间隔T=0.0046875sd ) 信号频率f =50Hz ,采样点数N=32,采样间隔T=0.004se ) 信号频率f =50Hz ,采样点数N=64,采样间隔T=0.000625sf ) 信号频率f =250Hz ,采样点数N=32,采样间隔T=0.005sg ) 将c ) 信号后补32个0,做64点FFT三.实验要求1.记录下实验内容中各种情况下的X (k)值,做出频谱图并深入讨论结果,说明参数的变化对信号频谱产生哪些影响。

频谱只做模特性,模的最大值=1,全部归一化;2.打印出用C 语言(或MATLAB 语言)编写的FFT 源程序,并且在每一小段处加上详细的注释说明;3.用C 语言(或MATLAB 语言)编写FFT 程序时,要求采用人机界面形式:N , T , f 变量均由键盘输入,补零或不补零要求设置一开关来选择。

四.实验分析对于本实验进行快速傅里叶变换,依次需要对信号进行采样,补零(要求补零时),码位倒置,蝶形运算,归一化处理并作图。

快速傅里叶变换(含详细实验过程分析)

快速傅里叶变换(含详细实验过程分析)

[实验2] 快速傅里叶变换 (FFT) 实现一、实验目的1、掌握FFT 算法和卷积运算的基本原理;2、掌握用C 语言编写DSP 程序的方法;3、了解利用FFT 算法在数字信号处理中的应用。

二、实验设备 1. 一台装有CCS 软件的计算机; 2. DSP 实验箱的TMS320C5410主控板; 3. DSP 硬件仿真器。

三、实验原理 (一)快速傅里叶变换傅里叶变换是一种将信号从时域变换到频域的变换形式,是信号处理的重要分析工具。

离散傅里叶变换(DFT )是傅里叶变换在离散系统中的表示形式。

但是DFT 的计算量非常大, FFT 就是DFT 的一种快速算法, FFT 将DFT 的N 2步运算减少至 ( N/2 )log 2N 步。

离散信号x(n)的傅里叶变换可以表示为∑=-=10][)(N N nk N W n x k X , Nj N e W /2π-=式中的W N 称为蝶形因子,利用它的对称性和周期性可以减少运算量。

一般而言,FFT 算法分为时间抽取(DIT )和频率抽取(DIF )两大类。

两者的区别是蝶形因子出现的位置不同,前者中蝶形因子出现在输入端,后者中出现在输出端。

本实验以时间抽取方法为例。

时间抽取FFT 是将N 点输入序列x(n) 按照偶数项和奇数项分解为偶序列和奇序列。

偶序列为:x(0), x(2), x(4),…, x(N-2);奇序列为:x(1), x(3), x(5),…, x(N-1)。

这样x(n) 的N 点DFT 可写成:()()∑++∑=-=+-=12/0)12(12/02122)(N n kn NN n nkNW n x Wn x k X考虑到W N 的性质,即2/)2//(22/)2(2][N N j N j N W e e W ===--ππ因此有:()()∑++∑=-=-=12/02/12/02/122)(N n nkN k NN n nkN W n x WWn x k X或者写成:()()12()kN X k X k W X k =+由于X 1(k) 与X 2(k) 的周期为N/2,并且利用W N 的对称性和周期性,即:kNNkNWW-=+2/可得:()()12(/2)kNX k N X k W X k+=-对X1(k) 与X2(k)继续以同样的方式分解下去,就可以使一个N点的DFT最终用一组2点的DFT来计算。

快速傅立叶变换(FFT)算法-DSP实验

快速傅立叶变换(FFT)算法-DSP实验

快速傅立叶变换(FFT)算法实验摘要:FFT(Fast Fourier Transformation),即为快速傅里叶变换,是离散傅里叶变换的快速算法,它是根据离散傅里叶变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。

这种算法大大减少了变换中的运算量,使得其在数字信号处理中有了广泛的运用。

本实验主要要求掌握在CCS环境下用窗函数法设计FFT快速傅里叶的原理和方法;并且熟悉FFT快速傅里叶特性;以及通过本次试验了解各种窗函数对快速傅里叶特性的影响等。

引言:快速傅里叶变换FFT是离散傅里叶变换DFT的一种快速算法。

起初DFT的计算在数字信号处理中就非常有用,但由于计算量太大,即使采用计算机也很难对问题进行实时处理,所以并没有得到真正的运用。

1965年J.W.库利和T.W.图基提出快速傅里叶变换,采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。

从此,对快速傅里叶变换(FFT)算法的研究便不断深入,数字信号处理这门新兴学科也随FFT的出现和发展而迅速发展。

根据对序列分解与选取方法的不同而产生了FFT的多种算法,基本算法是基2DIT和基2DIF。

FFT 的出现,使信号分析从时域分析向频域分析成为可能,极大地推动了信号分析在各领域的实际应用。

FFT在离散傅里叶反变换、线性卷积和线性相关等方面也有重要应用。

一、 实验原理:FFT 并不是一种新的变换,它是离散傅立叶变换(DFT )的一种快速算法。

由于我们在计算DFT 时一次复数乘法需用四次实数乘法和二次实数加法;一次复数加法则需二次实数加法。

每运算一个X (k )需要4N 次复数乘法及2N+2(N-1)=2(2N-1)次实数加法。

所以整个DFT 运算总共需要4N^2次实数乘法和N*2(2N-1)=2N(2N-1)次实数加法。

如此一来,计算时乘法次数和加法次数都是和N^2成正比的,当N 很大时,运算量是可观的,因而需要改进对DFT 的算法减少运算速度。

应用快速傅里叶变换对信号进行频谱分析实验报告

应用快速傅里叶变换对信号进行频谱分析实验报告

应用快速傅里叶变换对信号进行频谱分析实验报告实验报告:应用快速傅里叶变换(FFT)对信号进行频谱分析摘要:本实验旨在通过应用快速傅里叶变换(FFT)对信号进行频谱分析,探索信号在频域中的特征及其应用。

实验中我们选择了一个特定的信号,并通过FFT将其转换成频谱图。

通过分析频谱图,我们可以了解到信号中的频域信息,并通过此信息进一步分析和研究信号的特性。

实验结果表明,应用FFT对信号进行频谱分析可以提供有关信号频域特性的重要信息。

一、实验目的:通过实验,我们的目标是:1.了解傅里叶变换的原理和概念;2.掌握快速傅里叶变换(FFT)的原理和实现方法;3.应用FFT对特定信号进行频谱分析,并分析信号在频域中的特点;4.了解频谱分析在信号处理中的应用。

二、实验器材:1.计算机;2.信号发生器;3.音频采集设备。

三、实验步骤:1.选择特定信号,可以是音频信号、振动信号等;2.通过信号发生器产生特定信号;3.通过音频采集设备将信号输入到计算机中,采集信号数据;4.利用计算机上的信号处理软件,应用FFT将信号转换为频谱图;5.分析频谱图,观察信号在频域中的特征。

四、实验结果与分析:我们选择了一个简单的音频信号作为实验对象。

通过实验,我们得到了该音频信号的频谱图。

通过观察该频谱图,我们可以看到信号的主要频率成分以及其强度。

在频谱图中,横轴表示频率,纵轴表示信号的强度。

频谱图显示了信号的频率分布情况。

通过观察频谱图,我们可以得到以下结论:1.该音频信号主要包含在低频和高频范围内,中频较少;2.低频和高频范围内的强度较高,中频范围内的强度较低;3.在低频和高频范围内都存在一些峰值,可能代表着信号的主要频率成分。

通过分析频谱图,我们可以了解到信号在频域中的特征。

在实际应用中,频谱分析可以用于不同领域,例如声音处理、图像处理等。

通过频谱分析,我们可以了解到信号的频域信息,从而更好地理解和处理信号。

五、实验总结:实验结果表明,应用快速傅里叶变换对信号进行频谱分析可以提供有关信号频域特性的重要信息。

快速傅立叶变换(FFT)算法实验

快速傅立叶变换(FFT)算法实验

快速傅立叶变换(FFT)算法实验实验目得:1、加深对DFT 算法原理与基本性质得理解;2、熟悉FFT 得算法原理与FFT子程序得算法流程与应用;3、学习用FFT 对连续信号与时域信号进行频谱分析得方法。

程序流程图:傅立叶变换就就是一种将信号从时域到频域得变换形式,就就是声学、语音、电信与信号处理等领域中得一种重要分析工具。

离散傅立叶变换(DFT)就就是连续傅立叶变换在离散系统中得表现形式,由于DFT 得计算量很大,因此在很长时间内其应用受到很大得限制。

快速傅立叶变换(FFT)就就是离散傅立叶变换得一种高效运算方法。

由于我们在计算DFT 时一次复数乘法需用四次实数乘法与二次实数加法;一次复数加法则需二次实数加法。

运算一个X(k)需要4N 次复数乘法及2N+2(N-1)=2(2N-1)次实数加法。

所以整个DFT运算总共需要4N^2 次实数乘法与N*2(2N-1)=2N(2N-1)次实数加法。

如此一来,计算时乘法次数与加法次数都就就是与N^2成正比得,当N 很大时,运算量就就是可观得,因而需要改进对DFT 得算法减少运算速度。

我们可以将DFT 运算中有些项合并。

我们先设序列长度为N=2^L,L为整数。

将N=2^L 得序列x(n)(n=0,1,……,N-1),按N得奇偶分成两组,也就就就是说我们将一个N 点得DFT 分解成两个N/2点得DFT,她们又重新组合成一个如下式所表达得N 点DFT:一般来说,输入被假定为连续得。

当输入为纯粹得实数得时候,我们就可以利用左右对称得特性更好得计算DFT。

这样得RFFT优化算法就就是包装算法:首先2N 点实数得连续输入称为“进包”。

其次N 点得FFT被连续运行。

最后作为结果产生得N 点得合成输出就就是“打开”成为最初得与DFT 相符合得2N 点输入。

使用这一思想,我们可以划分FFT得大小,它有一半花费在包装输入O(N)得操作与打开输出上。

AD原理图源程序#include<math、h>#include"DSP2833x_Device、h"// DSP2833x Header "DSP2833x_Examples、h"// DSP2833x Examples Include Fi#include"m、h"#include"i_cmplx、h"#include"ext_inf、h"/*********************************************************************************/#if (CPU_FRQ_150MHZ) // Default - 150 MHz SYSCLKOUT#defineADC_MODCLK 0x3// HSPCLK =SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25、0 MHz#endif#if (CPU_FRQ_100MHZ)#define ADC_MODCLK 0x2//HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) = 25、0 MHz#endif#define ADC_CKPS 0x1// ADC moduleclock =HSPCLK/2*ADC_CKPS = 25、0MHz/(1*2) = 12、5MHz#defineADC_SHCLK0xf //S/H widthin ADCmodule periods = 16 ADC clocks#defineAVG 1000 // Average sample limit#define ZOFFSET 0x00 // Average Zero offset#define BUF_SIZE160// Sample buffer size/*********************************************************************************//////////////////unsignedintSampleLong;#define SAMPLELONG 3////////////////////unsigned int Ad_data[1536]={0};unsignedint Ad_data1[1536]={0};unsigned int convcount = 0;volatile unsigned intadconvover =0;////////////////int m=0;double n;double p,q;PLEX DDataBuffer[512]={0};Uint32 mod[512];//////////////////////unsignedint i;/*********************************************************************************/// Prototype statements for functionsfound within this file、interruptvoidadc_isr(void);/*********************************************************************************/void main(void){ﻩ#if SAMPLELONG==1ﻩSampleLong =256;#endif#if SAMPLELONG==2ﻩSampleLong=512;ﻩ#endif#ifSAMPLELONG==3ﻩSampleLong=1024;ﻩ#endif// Step 1、Initialize System Control:// PLL,WatchDog, enable Peripheral Clocks//This example function isfound in the DSP2833x_SysCtrl、c file、InitSysCtrl();// Step 2、 Initialize GPIO:// Thisexample function is found in the DSP2833x_Gpio、c// illustrates how to setthe GPIOto it's default state、InitGpio(); //Skipped for this example// Step3、Clearall interrupts and initialize PIE vector table://Disable CPUinterruptsDINT;//Initialize the PIEcontrol registers totheir defaultstate、// The defaultstate is all PIE interrupts disabled and flag s// are cleared、// This function isfoundin the DSP2833x_PieCtrl、c file、InitPieCtrl();// Disable CPU interrupts and clear all CPUinterrupt flags: IER = 0x0000;IFR = 0x0000;// Initialize the PIE vector table with pointers to the shell Int errupt// Service Routines (ISR)、// Thiswill populatethe entire table, even if theinterrupt// is not usedin this example、 This is useful for debug purpose s、//The shell ISR routines are found in DSP2833x_DefaultIsr、c、// Thisfunctionis found inDSP2833x_PieVect、c、InitPieVectTable();//Interrupts thatare used inthisexample are re-mapped to// ISRfunctions found within this file、EALLOW; //This is neededto write to EALLOW protected regi sterPieVectTable、ADCINT= &adc_isr;EDIS; // This is needed to disable write to EALLOW prote cted registers// Step 4、 Initialize all theDevice Peripherals:// This function is found in DSP2833x_InitPeripherals、c// InitPeripherals();// Notrequired for this exampleInitAdc();// For this example, init the ADC// Step5、User specific code,enable interrupts://Enable ADCINTin PIEPieCtrlRegs、PIEIER1、bit、INTx6 = 1;IER|= M_INT1; //Enable CPU Interrupt1EINT;// Enable Global interrupt INTMERTM;// EnableGlobal realtime interrupt DBGMAdcRegs、ADCTRL1、bit、ACQ_PS =ADC_SHCLK;AdcRegs、ADCTRL3、bit、ADCCLKPS = ADC_CKPS;AdcRegs、ADCTRL1、bit、SEQ_CASC =1; // 0 Non-Cas caded Mode; 1 Cascaded ModeAdcRegs、ADCTRL2、bit、INT_ENA_SEQ1 = 0x1;AdcRegs、ADCTRL2、bit、RST_SEQ1= 0x1;AdcRegs、ADCCHSELSEQ1、bit、CONV00 = 0x6;AdcRegs、ADCMAXCONV、bit、MAX_CONV1 = 15;AdcRegs、ADCTRL2、bit、SOC_SEQ1 =0x1;for(;;){ﻩif(adconvover==1){ﻩﻩﻩfor(i=0;i<(SampleLong/2);i++)ﻩﻩﻩ{ﻩﻩDDataBuffer[i]、real=Ad_data[2*i];//short intﻩﻩDDataBuffer[i]、imag=Ad_data[2*i+1];//short intﻩﻩ}ﻩﻩswitch(SampleLong)ﻩﻩﻩ{ﻩﻩcase256:/*256point*/ﻩfft256(DDataBuffer,256);m=0;ﻩfor(i=0;i<128;i++)ﻩﻩ{ﻩﻩp=DDataBuffer[i]、real;ﻩq=DDataBuffer[i]、imag;ﻩﻩﻩﻩn=(long)p*(long)p+(long)q*(long)q;mod[m]=sqrt(n);ﻩm++;ﻩﻩ}ﻩﻩbreak;case 512: /*512 point*/ﻩ fft512(DDataBuffer,512);m=0;ﻩfor(i=0;i<256;i++)ﻩﻩﻩﻩ{ﻩp=DDataBuffer[i]、real;ﻩq=DDataBuffer[i]、imag;ﻩﻩﻩﻩn=(long)p*(long)p+(long)q*(long)q;ﻩﻩmod[m]=sqrt(n);ﻩﻩm++;ﻩﻩﻩﻩ}ﻩﻩbreak;ﻩﻩcase 1024:/*1024point*/ﻩﻩfft1024(DDataBuffer,1024);ﻩm=0;for(i=0;i<512;i++)ﻩ{p=DDataBuffer[i]、real;ﻩﻩq=DDataBuffer[i]、imag;n=(long)p*(long)p+(long)q*(long)q;ﻩﻩﻩmod[m]=sqrt(n);ﻩﻩm++;}ﻩbreak;}ﻩadconvover=0;ﻩ convcount=0;ﻩﻩﻩﻩ}ﻩ}}interrupt void adc_isr(void){//If40 conversions have been logged, start overif(convcount == SampleLong){adconvover = 1;}else{Ad_data[convcount]= AdcRegs、ADCRESULT0 >>4;convcount++;}// Reinitialize fornext ADC sequenceAdcRegs、ADCTRL2、bit、RST_SEQ1 = 1; //Reset SEQ1AdcRegs、ADCST、bit、INT_SEQ1_CLR =1;//Clear INT SEQ1 bitPieCtrlRegs、PIEACK、all = PIEACK_GROUP1;// Acknowledge in terruptto PIEAdcRegs、ADCTRL2、bit、SOC_SEQ1 = 0x1;return;}。

数字信号处理实验快速傅里叶变换

数字信号处理实验快速傅里叶变换

数字信号处理实验——快速傅里叶变换一、概述数字信号处理是一门涉及数字信号采集、处理和分析的学科。

在数字信号处理中,傅里叶变换是一个非常重要的工具,可以将时域信号转换为频域信号,帮助我们理解信号的频谱特性。

而快速傅里叶变换(FFT)是一种高效的计算傅里叶变换的算法,广泛应用于信号处理领域。

本文将介绍数字信号处理实验中快速傅里叶变换的基本原理、算法实现和实验过程。

二、快速傅里叶变换的原理快速傅里叶变换是一种通过递归分治策略减少计算量的傅里叶变换算法。

对于长度为N的离散信号序列,其快速傅里叶变换可以分解为若干个长度为N/2的子序列的快速傅里叶变换的线性组合。

通过这种分治的方法,可以将原始的傅里叶变换计算复杂度从O(N^2)降低到O(NlogN)。

三、快速傅里叶变换的算法实现快速傅里叶变换的算法实现主要分为递归方法和迭代方法两种。

递归方法是一种自顶向下的计算方法,通过将长度为N的信号序列分解为两个长度为N/2的子序列,并利用子序列的快速傅里叶变换计算原始序列的傅里叶变换。

迭代方法则是一种自底向上的计算方法,通过不断合并较短序列的傅里叶变换结果来计算较长序列的傅里叶变换。

在实际应用中,迭代方法通常比递归方法更加高效,特别是对于长度为2的幂次方的信号序列。

四、数字信号处理实验在数字信号处理实验中,快速傅里叶变换通常作为一种重要的信号处理工具使用。

实验过程中,我们首先需要准备一段离散的时域信号序列,然后利用快速傅里叶变换算法将其转换为频域信号序列。

通过对频域信号序列的分析,我们可以获取信号的频谱特性,包括频率成分、谐波分量等信息。

五、实验流程1. 准备一段离散的时域信号序列,可以是从传感器获取的实际物理信号,也可以是由数学函数生成的合成信号。

2. 对时域信号序列进行快速傅里叶变换,得到频域信号序列。

3. 分析频域信号序列,获取信号的频谱特性,如主要频率成分、谐波分量等。

4. 对频域信号序列进行反变换,将其恢复为时域信号序列进行进一步分析。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CENTRAL SOUTH UNIVERSITY 数字信号处理实验报告
题目快速傅里叶变换
学生姓名
学院物理与电子学院
专业班级电子信息科学与技术1105班
学号140411072
实验五快速傅里叶变换
一、实验仪器
PC机一台、JQ—SOPC开发系统实验箱及辅助软件(DSP Builder、Matlab/Simulink、QuartusII、Modelsim)。

二、实验目得
1、了解快速傅里叶变换得基本结构组成、
2、学习使用DSP Builder设计FFT。

三、实验原理
1、FFT得原理:
快速傅里叶变换(FFT)就是离散傅里叶变换(DFT)得一种高效运算方法,它大大简化了DFT得运算过程,使运算时间缩短几个数量级、FFT算法可以分为按时间抽取(DIT)与按频率抽取(DIF)两类,输入也可分为实数与复数两种情况。

八点时间抽取基—2FFT算法信号流图如图1示:
图18点基-2 DIT-FFT信号流图
四、实验步骤
1、将桌面得my_fft_8。

mdl拷贝到“D:\Program Files\MATLAB71\work”(MATLAB安装目录下得work文件夹)处,并双击打开。

图5-1快速傅里叶变换系统图
图5—2 快速傅里叶变换子系统1图
图5—3快速傅里叶变换子系统2图
图5—3 快速傅里叶变换子系统3图
2、点击工具栏即可开始系统级simulink仿真,以验证该模型得正确性、在仿真进行过程中分别将三个输入控制开关打到000、001、010、011、100以选择五组输入数据进行FFT运算。

(1)当开关打到000时选择第一组数据{2.0,2.0,4。

0,7。

0,3.0,5。

0,5、0,8.0},其运算结果应为36、-2、41+3.84i、—4+8i、0、4219+1.844i、—8、0。

4102-1、84i、-4-8i、-2、422-3.844i。

(2)当开关打到001时选择第二组数据{1。

1,5。

0,10.5,15、3,20。

2,25。

7,30、6,40。

1},其运算结果应该为148、5、-16、1+52、35i、-19.8+24、7i、-22、02+12。

25i、—23.7、-22、1-12。

15i、-19.8-24。

7i、-16.9—52、45i、
(3)当开关打到010时选择第三组数据{5.6,5、0,15、8,20.4,25、2,35、1,40、2,45。

0},其运算结果结果应该为192。

3、-23.39+63、19i、—25。

2+25、3i、-15.69+14。

49i、—18、7、-15。

81—14、39i、-25。

2-25。

3i、-23。

51-63、29i。

(4)当开关打到011选择第四组数据{10、2,15。

3,18。

1,20。

3,24.2,30、0,35.2,42、3},
其运算结果应该为195.6、—8、755+43、11i、—18。

9+17.3i、-19。

19+8、992i、-20、2、-19、25-8。

906i、-18。

9-17、3i、-8、812-43、2i。

(5)当开关打到100选择第五组数据{4。

0,10.5,15。

6,20、3,25。

2,35、7,40.5,45。

0},其运算结果应该为196、8、-21。

45+60.28i、—26。

9+19。

1i、-20。

85+10、58i、—26、2、—20、94—10、48i、—26.9-19.1i、—21、55—60、38i、3、双击模型图中得Testbench模块弹出类似如图7所示对话框。

依次单击Gener ate HDL、Run Simulink、Run Modelsim三个选项。

其中Run Modelsim选项后得Launch GUI前得选项框一定要选,这样可以观瞧modelsimRTL级仿真结果。

4、双击模型图中得SignalComplier模块弹出类似如图8所示对话框。

在parameters栏下得family选项选择cyclone II ,device选项选择默认得auto,然后点击simple下得plie,编译完后关闭该页。

5、关闭MATLAB。

在位置“D:\Program Files\MATLAB71\work\ my_fft_8_dspb uilder” (MATLAB安装目录下得work\ my_fft_8_dspbuilder)打开文件my_fft_8。

qpf。

6、工具栏中点击Assignments,选中Device,在器件family中选择CycloneⅡ,选择下拉菜单中得EP2C35F672C6、,点击finish。

7、执行Assignmets—〉AssignmentEditor,将Category设为Pin,并按照下图对Pin进行设置并保存。

图5-1管脚分配图
8、执行Tools->SignalTapⅡLogic Analyzer,在Data窗口中得空白处双击,在弹出得对话框中将Fiter设为all&registers:post fittings,点击List,将Output添加至右边得窗口中,点击【OK】确认、在右边得对话框中将Clock设为Clock信号;Sample depth设置为1K;点选Trigger in,Source设为Clock信号,Pattern设为Rising edge。

保存该文件,若弹出对话框询问就是否将文件添加至工程,选择Yes。

点击菜单栏中得,重新对工程进行编程。

9、打开实验箱,接入电源,用USBBlaster线将电脑与实验箱连接起来,选择菜单栏中得图标。

10、点击Hardware Setup,选择USB—0,点击【OK】确认。

选中my_fft_8.sof文件,点击Start,将文件下载到实验板上。

11、将实验箱上得开关SW[3]拨至高电平,SW[2]、SW[1]、SW[0]拨至低电平点击。

点击开始运行工程,10s后,点击结束运行、依次使(SW[2], SW[1], SW[0])=(0, 0,1)~(1, 1,1),重复上一步得操作,并与理论值进行比较。

五、实验结果
1、Simulink仿真波形:
(1)当开关打到000时
(2)当开关打到001时
(3)当开关打到100时
2、RTL级仿真波形
3、硬件实现波形[(SW[2], SW[1] , SW[0])=(0,0, 1)~(1, 1,1)] (1)(SW[2],SW[1],SW[0])=(0,0,1)
(2)(SW[2],SW[1],SW[0])=(0,1,0)
(3)(SW[2],SW[1],SW[0])=(0,1,1)
(4)(SW[2],SW[1],SW[0])=(1,0,0)
(5)(SW[2],SW[1],SW[0])=(1,0,1)
六、讨论分析
1、实验中遇到得问题与解决方法。

FFT实现对我们来说比较困难,FFT得算法还能瞧得懂,但就是怎么用软件实现FFT算法,我们了解得并不多,所以对这次实验得各子系统都不大明白其工作方式与功能,但就是实验时
间有限,我们暂且抛下这些不管,等以后有时间与兴趣时再去深究,直接按照实验步骤进行实验。

2、2013年美国《技术评论》评选出了10项改变世界得新技术,一种由MIT四名学生提出得比FFT快上10至100倍得稀疏傅里叶变换(SFT)算法、关于SFT您知道些什么?(SFT得内容,SFT对信息时代得意义)(原文:“Nearly Optimal Sparse FourierTr ansform")
FFT得基本原理就是,所有信号,例如录音,都可以表现为一系列不同频率与波幅得正弦与余弦波组合。

进行变换之后,对这组波得处理会相对容易些—-比方说,可以压缩一段录音或消除噪音。

20世纪60年代中期,研究人员创造出了一种利用计算机实现得算法,称之为快速傅里叶变换(FFT)。

相比未压缩得录音版本,MP3格式文件得体积之小简直令人惊叹,这让我们真正见识到了快速傅里叶变换得威力。

而利用被称为稀疏傅里叶变换(SFT)得新算法,数据流得处理速度会比快速傅里叶变换还要快上10倍至100倍。

之所以能够如此大幅地提速,就是因为我们关注得信息大多拥有大量得结构:例如音乐与不规则噪声就完全不就是一回事。

这些有意义得信号通常只能取一小部分可能值;用技术术语来表达,即这些信息就是“稀疏”得、由于稀疏傅里叶变换算法不需要对所有可能得数据流都进行处理,因此它可以使用其她算法无法做
到得某些快捷处理方式。

从理论上瞧,如果一种算法只能用来处理稀疏信号,它受到得限制会比快速傅里叶变换多得多、但正如该算法得共同发明者、电子工程与计算机科学教授卡塔比所指出得那样,“稀疏性无处不在”,“它存在于大自然中,存在于视频信号中,存在于音频信号中。

”。

相关文档
最新文档