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

合集下载

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

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

应用快速傅里叶变换对信号进行频谱分析2.1 实验目的1、通过本实验,进一步加深对DFT 算法原理和基本性质的理解,熟悉FFT 算法原理和FFT 子程序应用2、掌握应用FFT 对信号进行频谱分析的方法。

3、通过本次实验进一步掌握频域采样定理。

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

确应用FFT 。

2.2实验原理与方法对于有限长序列我们可以使用离散傅里叶变换(DFT )。

这一变换不但可以好地反映序列的频域特性,而且易于用快速傅里叶变换在计算机上实现当序列x(n)的长度为N 时,它的离散傅里叶变换为:10()[()]()N knN n X k DFT x n x n W -===∑其中(2/)j N N W e π-=,它的反变换定义为:11()[()]()N kn Nk x n IDFT X k X k WN--===∑比较Z 变换公式,令k N z W -=则10()|()[()]k NN nkN z W n X z x n W DFT x n --====∑因此有()()|k Nz W X k X z -==。

所以,X(k)是x(n)的Z 变换在单位圆上的等距采样,或者说是序列傅里叶变换的等距采样。

DFT 是对序列傅里叶变换的等距采样,因此可以用于对序列的频谱分析。

在运用DFT 进行频谱分析的过程中有可能产生三种误差: 1、混叠现象序列的频谱是原模拟信号频谱的周期延拓,周期为2/T π。

因此,当采样频率小于两倍信号的最大频率时,经过采样就会发生频谱混叠,使采样后的信号序列频谱不能真实反映原信号的频谱。

2、泄漏现象实际中信号序列往往很长,常用截短的序列来近似它们,这样可以用较短的DFT 对信号进行频谱分析,这种截短等价于给原信号序列乘以一个矩形函数。

这样得到的频谱会将原频谱扩展开。

3、栅栏效应DFT 是对单位圆上Z 变换的均匀采样,所以它不可能将频谱视为一个连续函数。

快速傅立叶变换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〕logN 步,极大2的提高了运算的速度。

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 变换的结果。

快速傅里叶变换(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 算法能够准确的对信号进行频谱计算。

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

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

一、实验目的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 算法本身的近似处理。

fft实验分析实验报告

fft实验分析实验报告

fft实验分析实验报告FFT实验分析实验报告一、引言傅里叶变换(Fourier Transform)是一种重要的信号分析工具,它能够将一个信号分解成不同频率的成分。

快速傅里叶变换(Fast Fourier Transform,FFT)是一种高效的计算傅里叶变换的算法。

本实验旨在通过实际操作,探究FFT在信号分析中的应用。

二、实验设备与方法1. 实验设备:本实验使用的设备包括示波器、信号发生器和计算机。

2. 实验方法:(1)将信号发生器的输出接入示波器的输入端。

(2)调节信号发生器的参数,如频率、振幅等,产生不同的信号。

(3)通过示波器观察信号的波形,并记录相关数据。

(4)将示波器与计算机通过USB接口连接,将示波器上的数据传输到计算机上。

(5)使用计算机上的软件进行FFT分析,得到信号的频谱信息。

三、实验结果与分析1. 实验一:正弦波信号的FFT分析(1)设置信号发生器的频率为1000Hz,振幅为5V,产生一段正弦波信号。

(2)通过示波器观察信号的波形,并记录相关数据。

(3)将示波器上的数据传输到计算机上,进行FFT分析。

实验结果显示,正弦波信号的频谱图呈现出单个峰值,且峰值位于1000Hz处。

这说明FFT能够准确地分析出信号的频率成分,并将其可视化展示。

2. 实验二:方波信号的FFT分析(1)设置信号发生器的频率为500Hz,振幅为5V,产生一段方波信号。

(2)通过示波器观察信号的波形,并记录相关数据。

(3)将示波器上的数据传输到计算机上,进行FFT分析。

实验结果显示,方波信号的频谱图呈现出多个峰值,且峰值位于500Hz的倍数处。

这说明方波信号由多个频率成分叠加而成,FFT能够将其分解出来,并显示出各个频率成分的强度。

3. 实验三:复杂信号的FFT分析(1)设置信号发生器的频率为100Hz和200Hz,振幅分别为3V和5V,产生一段复杂信号。

(2)通过示波器观察信号的波形,并记录相关数据。

(3)将示波器上的数据传输到计算机上,进行FFT分析。

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

(完整)快速傅里叶变换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及其应用实验报告

实验一 离散时间系统的时域分析一、实验目的1. 运用MA TLAB 仿真一些简单的离散时间系统,并研究它们的时域特性。

2. 运用MA TLAB 中的卷积运算计算系统的输出序列,加深对离散系统的差分方程、冲激响应和卷积分析方法的理解。

二、实验原理离散时间系统其输入、输出关系可用以下差分方程描述:∑=∑=-=-M k k N k k k n x p k n y d 00][][当输入信号为冲激信号时,系统的输出记为系统单位冲激响应 ][][n h n →δ,则系统响应为如下的卷积计算式:∑∞-∞=-=*=m m n h m x n h n x n y ][][][][][ 当h[n]是有限长度的(n :[0,M])时,称系统为FIR 系统;反之,称系统为IIR 系统。

在MA TLAB 中,可以用函数y=Filter(p,d,x) 求解差分方程,也可以用函数 y=Conv(x,h)计算卷积。

例1clf;n=0:40;a=1;b=2;x1= 0.1*n;x2=sin(2*pi*n);x=a*x1+b*x2;num=[1, 0.5,3];den=[2 -3 0.1];ic=[0 0]; %设置零初始条件y1=filter(num,den,x1,ic); %计算输入为x1(n)时的输出y1(n)y2=filter(num,den,x2,ic); %计算输入为x2(n)时的输出y2(n)y=filter(num,den,x,ic); %计算输入为x (n)时的输出y(n)yt= a*y1+b*y2;%画出输出信号subplot(2,1,1)stem(n,y);ylabel(‘振幅’);title(‘加权输入a*x1+b*x2的输出’);subplot(2,1,2)stem(n,yt);ylabel(‘振幅’);title(‘加权输出a*y1+b*y2’);(一)、线性和非线性系统对线性离散时间系统,若)(1n y 和)(2n y 分别是输入序列)(1n x 和)(2n x 的响应,则输入)()()(21n bx n ax n x +=的输出响应为)()()(21n by n ay n y +=,即符合叠加性,其中对任意常量a 和b 以及任意输入)(1n x 和)(2n x 都成立,否则为非线性系统。

快速傅立叶变换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单可视化后一直是白色的点,解决办法是用可视化算子进行可视化,在实现的过程中一直修改的都是像素点的第一个灰度值即蓝色的灰度值,在用可视化算子可视化之后,再用蓝色的分量值进行灰度化即让其他的红色绿色灰度值都等于蓝色灰度值。

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

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

[实验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 Headerfile Include File #include"DSP2833x_Examples.h"// DSP2833x Examples Include Fi #include"comm.h"#include"i_cmplx.h"#include"ext_inf.h"/*********************************************************************************/#if (CPU_FRQ_150MHZ) // Default - 150 MHz SYSCLKOUT#define ADC_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 module clock = HSPCLK/2*ADC_CKPS = 25.0MHz/(1*2) = 12.5MHz#define ADC_SHCLK 0xf // S/H width in ADC module periods = 16 ADC clocks#define AVG 1000 // Average sample limit#define ZOFFSET 0x00 // Average Zero offset#define BUF_SIZE 160 // Sample buffer size/*********************************************************************************//////////////////unsignedint SampleLong;#define SAMPLELONG 3////////////////////unsignedint Ad_data[1536]={0};unsignedint Ad_data1[1536]={0};unsignedint convcount = 0;volatileunsignedint adconvover =0;////////////////int m=0;double n;double p,q;COMPLEX DDataBuffer[512]={0};Uint32 mod[512];//////////////////////unsignedint i;/*********************************************************************************/// Prototype statements for functions found within this file.interruptvoid adc_isr(void);/*********************************************************************************/void main(void){#if SAMPLELONG==1SampleLong =256;#endif#if SAMPLELONG==2SampleLong =512;#endif#if SAMPLELONG==3SampleLong =1024;#endif// Step 1. Initialize System Control:// PLL, WatchDog, enable Peripheral Clocks// This example function is found in the DSP2833x_SysCtrl.c file.InitSysCtrl();// Step 2. Initialize GPIO:// This example function is found in the DSP2833x_Gpio.c file and // illustrates how to set the GPIO to it's default state.InitGpio(); // Skipped for this example// Step 3. Clear all interrupts and initialize PIE vector table:// Disable CPU interruptsDINT;// Initialize the PIE control registers to their default state.// The default state is all PIE interrupts disabled and flags// are cleared.// This function is found in the DSP2833x_PieCtrl.c file.InitPieCtrl();// Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000;IFR = 0x0000;// Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR).// This will populate the entire table, even if the interrupt// is not used in this example. This is useful for debug purposes. // The shell ISR routines are found in DSP2833x_DefaultIsr.c.// This function is found in DSP2833x_PieVect.c.InitPieVectTable();// Interrupts that are used in this example are re-mapped to// ISR functions found within this file.EALLOW; // This is needed to write to EALLOW protected registerPieVectTable.ADCINT = &adc_isr;EDIS; // This is needed to disable write to EALLOW protected registers// Step 4. Initialize all the Device Peripherals:// This function is found in DSP2833x_InitPeripherals.c// InitPeripherals(); // Not required for this exampleInitAdc(); // For this example, init the ADC// Step 5. User specific code, enable interrupts:// Enable ADCINT in PIEPieCtrlRegs.PIEIER1.bit.INTx6 = 1;IER |= M_INT1; // Enable CPU Interrupt 1EINT; // Enable Global interrupt INTMERTM; // Enable Global realtime interrupt DBGMAdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 0 Non-Cascaded Mode; 1 Cascaded Mode AdcRegs.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 intDDataBuffer[i].imag=Ad_data[2*i+1]; //short int}switch(SampleLong){case 256:/*256 point*/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: /*1024 point*/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;}}}interruptvoid adc_isr(void){// If 40 conversions have been logged, start overif(convcount == SampleLong){adconvover = 1;}else{Ad_data[convcount] = AdcRegs.ADCRESULT0 >>4;convcount++;}// Reinitialize for next ADC sequenceAdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0x1 ;return;}。

快速傅里叶变换实验报告

快速傅里叶变换实验报告

快速傅里叶变换实验报告机械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 ,故不满足采样定理,会发生混叠现象。

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

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

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

fft实验分析实验报告

fft实验分析实验报告

fft实验分析实验报告
实验报告主要包括实验目的、实验原理、实验步骤、实验结果分析和结论等内容。

以下是一个关于FFT实验分析的实验报告示例:
实验报告
实验目的:
1. 了解傅里叶变换(FFT)的基本原理和应用;
2. 学会使用FFT算法对信号进行频谱分析。

实验设备和材料:
1. 计算机;
2. 音频文件或实时采集的音频信号。

实验原理:
傅里叶变换是一种将时域信号转换为频域信号的数学变换方法,可以将信号表示为不同频率的复指数函数的叠加。

而FFT(快速傅里叶变换)是一种高效的傅里叶变换算法,可以快速计算信号的频谱。

实验步骤:
1. 准备音频文件或实时采集的音频信号;
2. 将音频信号输入计算机中的FFT算法进行处理,得到信号的频谱;
3. 对频谱进行可视化表示,如绘制频谱图;
4. 根据频谱图分析信号的频率分布和能量分布等特征。

实验结果分析:
通过实验,我们得到了音频信号的频谱图。

根据频谱图可以得到信号的频率分布情况,即哪些频率的分量相对强,哪些频率的分量相对弱。

频谱图还可以展示信号的能量分
布情况,能量较高的频率分量对应着声音的主要特征。

结论:
通过本次实验,我们学习了傅里叶变换(FFT)的基本原理和应用,并掌握了使用FFT 算法进行信号频谱分析的方法。

频谱分析是一种常用的信号处理方法,可以帮助我们
了解信号的频率特征和能量分布情况,对于音频、图像等领域的信号处理具有重要的
应用价值。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

fft实验报告

fft实验报告

快速傅里叶变换实验报告一、实验目的(一)加深对几个特殊概念的理解:“采样”——“混叠”;“窗函数”(截断)——“泄漏”;非整周期截取”——“栅栏”。

(二)加深理解如何才能避免“混叠”,减少“泄漏”,防止“栅栏”的方法和措施以及估计这些因素对频谱的影响。

(三)对利用通用微型计算机及相应的FFT 软件,实现频谱分析有一个初步的了解。

二、实验原理为了实现信号的数字化处理,利用计算机进行频谱分析——计算信号的频谱。

由于计算机只能进行有限的离散计算(即DFT ),因此就要对连续的模拟信号进行采样和截断。

而这两个处理过程可能引起信号频谱的畸变,从而使DFT 的计算机过于信号的实际频谱有误差。

有时由于采样和截断的处理不当,使计算出来的频谱完全失真。

因此在时域处理信号时要格外小心。

在信号数字化处理中应十分注意以下几点:(一)为了避免“混叠”,要求在采样时必须满足采样定理。

(二)为了减少“泄漏”,应适当增加截断长度和选择合适的窗。

(三)对信号进行整周期截取,则能消除“栅栏效应”。

(四)增加截断长度,则可提高频率分辨率。

三、实验内容及步骤(一)基本信号的FFT 变换1、()000sin(sin 2cos36x t w t w t w t π=+++第1组:采样频率,截断长度N=1608s f f =程序清单:n=16;%截取长度multi=8;%采样频率倍数x=0;%初始化向量,维数待定w0=2*pi;%设定基准频率for var=1:1:nx(var)=sin(w0/multi*(var-1)+pi/6)+sin(2*w0/multi*(var-1))+cos(3*w0/multi*(var-1));endy=fft(x);y=fftshift(y);ang=angle(y)/pi*180;altitude=abs(y)/n;var=1:1:n;subplot(1,2,1);bar(var,altitude,0.3);title('幅频图');xlabel('w');ylabel('幅值');subplot(1,2,2);bar(var,ang,0.3);colormap ([0 1 1]);title('相频图');xlabel('w');ylabel('相位');ang =Columns 1 through 80 -24.1998 0.0000 -155.8595 90.0000 81.2485 60.0000 157.9674 Columns 9 through 16180.0000 -157.9674 -60.0000 -81.2485 -90.0000 155.8595 -0.0000 24.1998altitude=Columns 1 through 80.0000 0.0000 0.5000 0.0000 0.5000 0.0000 0.5000 0.0000 Columns 9 through 160.0000 0.0000 0.5000 0.0000 0.5000 0.0000 0.5000 0.0000分析:1、频率分辨率是00.5sf f Nδ==2、x(t)的信号频率成分中的最高频率,满足采样定理,所以DFT 结果没有频率032sf f <混叠现象。

实验八-快速傅立叶变换(FFT)实验

实验八-快速傅立叶变换(FFT)实验

实验七 快速傅立叶变换(FFT )实验一 实验目的1. 熟悉CCS 集成开发环境;2. 了解FFT 的算法原理和基本性质;3. 熟悉DSP 中cmd 文件的作用及对它的修改;4. 学习用FFT 对连续信号和时域信号进行频谱分析的方法;5. 利用DSPLIB 中现有的库函数;6. 了解DSP 处理FFT 算法的特殊寻址方式;7. 熟悉对FFT 的调试方法。

二 实验内容本实验要求使用FFT 变换对一个时域信号进行频谱分析,同时进行IFFT 。

这里用到时域信号可以是来源于信号发生器输入到CODEC 输入端,也可以是通过其他工具计算获取的数据表。

本实验使用Matlab 语言实现对FFT 算法的仿真,然后将结果和DSP 分析的结果进行比较,其中原始数据也直接来自Matlab 。

三 实验原理一个N 点序列][k x 的DFT ][m X ,以及IDFT 分别定义为:1,,1,0,][][10-==∑-=N m W k x m X km NN k 1,,1,0,][1][10-==--=∑N k W m X N k x km N N m如果利用上式直接计算DFT,对于每一个固定的m,需要计算N 次复数乘法,N-1次加法,对于N 个不同的m,共需计算N 的2次方复数乘法,N*(N-1)次复数加法.显然,随着N 的增加,运算量将急剧增加, 快速傅里叶算法有效提高计算速度(本例使用基2 FFT 快速算法),利用FFT 算法只需(N/2)logN 次运算。

四 知识要点 .1、 CMD 文件的功能及编写2、 一种特殊的寻址方式:间接寻址间接寻址是按照存放在某个辅助寄存器的16位地址寻址的。

C54x 的8个辅助寄存器(AR0—AR7)都可以用来寻址64K 字数据存储空间中的任何一个存储单元。

3、 TMS320C54x DSPLIB 中关于FFT 变换的一些函数的调用(SPRA480B.pdf )利用DSPLIB 库时,在主程序中要包含头文件:54xdsp.lib4、 FFT 在CCS 集成开发环境下的相关头文件#include <type.h> //定义数据类型的头文件#include <math.h> //数学函数的头文件,如sqrt.#include <tms320.h> //定义数据类型的头文件#include <dsplib.h> // DSPLIB库文件五实验程序说明1、实验主要函数/***************************正变换*************************************/cbrev(x,x,NX/2); //倒序rfft(x,64,0); //实数FFT变换//求频谱由于FFT程序计算得到的数据只是频谱的实部和虚部,不包含计算幅度谱的//成分(所以描述DSP的参数中给出计算N点FFT的时间,是指不含计算幅度谱的时间),//因此要得到幅度频谱,必须另外增加程序语句来实现。

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

实验七 快速傅立叶变换(FFT )实验一 实验目的1. 熟悉CCS 集成开发环境;2. 了解FFT 的算法原理和基本性质;3. 熟悉DSP 中cmd 文件的作用及对它的修改;4. 学习用FFT 对连续信号和时域信号进行频谱分析的方法;5. 利用DSPLIB 中现有的库函数;6. 了解DSP 处理FFT 算法的特殊寻址方式;7. 熟悉对FFT 的调试方法。

二 实验内容本实验要求使用FFT 变换对一个时域信号进行频谱分析,同时进行IFFT 。

这里用到时域信号可以是来源于信号发生器输入到CODEC 输入端,也可以是通过其他工具计算获取的数据表。

本实验使用Matlab 语言实现对FFT 算法的仿真,然后将结果和DSP 分析的结果进行比较,其中原始数据也直接来自Matlab 。

三 实验原理一个N 点序列][k x 的DFT ][m X ,以及IDFT 分别定义为:1,,1,0,][][10-==∑-=N m W k x m X km NN k 1,,1,0,][1][10-==--=∑N k W m X N k x km N N m如果利用上式直接计算DFT,对于每一个固定的m,需要计算N 次复数乘法,N-1次加法,对于N 个不同的m,共需计算N 的2次方复数乘法,N*(N-1)次复数加法.显然,随着N 的增加,运算量将急剧增加, 快速傅里叶算法有效提高计算速度(本例使用基2 FFT 快速算法),利用FFT 算法只需(N/2)logN 次运算。

四 知识要点 .1、 CMD 文件的功能及编写2、 一种特殊的寻址方式:间接寻址间接寻址是按照存放在某个辅助寄存器的16位地址寻址的。

C54x 的8个辅助寄存器 (AR0—AR7)都可以用来寻址64K 字数据存储空间中的任何一个存储单元。

3、 TMS320C54x DSPLIB 中关于FFT 变换的一些函数的调用(SPRA480B.pdf ) 利用DSPLIB 库时,在主程序中要包含头文件:54xdsp.lib4、 FFT 在CCS 集成开发环境下的相关头文件#include <type.h> //定义数据类型的头文件#include <math.h> //数学函数的头文件,如sqrt.#include <tms320.h> //定义数据类型的头文件#include <dsplib.h> // DSPLIB 库文件五实验程序说明1、实验主要函数/***************************正变换*************************************/cbrev(x,x,NX/2); //倒序rfft(x,64,0); //实数FFT变换//求频谱由于FFT程序计算得到的数据只是频谱的实部和虚部,不包含计算幅度谱的//成分(所以描述DSP的参数中给出计算N点FFT的时间,是指不含计算幅度谱的时间),//因此要得到幅度频谱,必须另外增加程序语句来实现。

for(i=0;i<NX;i=i+2){p=x[i]; //实部q=x[i+1]; //虚部n=p*p+q*q; //实部平方加虚部平方f[m]=sqrt(n); //开方后存到f数组中m++;}/**************************反变换************************************/unpacki(x,NX); //还原cbrev(x,x,NX/2); //倒序rifft(x,NX,1); //实数IFFT变换2、各个函数的说明(详情见SPRA480B.pdf)(1)void cbrev(DATA *x,DATA*r,unshort n)功能:为了FFT/IFFT得到一个正确顺序的变换结果,对他们的输入数据进行倒序。

入口参数:x[2*n] x是一个2*n项的一维数组,数组中数据定义为短整型(16位有符号整型)。

数组x是作为输入数据,函数对他的数据进行倒序。

r[2*n] r是一个2*n项的一维数组,数组中数据定义为短整型(16位有符号整形)。

数组r是作为输出数据,函数对x倒序后的结果存到r中。

n 定义为数组中复数的个数(两个实数表示一个复数),即为数组大小的1/2。

函数的使用:函数是对复数进行倒序的,即把数组x中的数据认为是复数。

有两个相邻的实数表示一个复数,偶地址为复数的实部,奇地址为复数的虚部。

如下式,函数对X[0]+j*X[1],X[2]+j*X[3],………X[2n]+j*X[2n+1]…………X[2*N-2]+j*X[2*N-1] 这些数据进行倒序。

倒序后的结果也是按复数的实部、虚部依次存到r数组中的。

注意:数组中的元素个数必须为偶数。

倒序时采用间接寻址,所以数组的首地址的末log(n)+1必须为0。

(2)void cfft(x,n,scale)原理及源程序说明:功能:对复数进行FFT变换。

各项参数:x[2*n] x是一个2*n项的一维数组,数组中数据定义为短整形(16位有符号整形)。

数组x既作为输入数据,又存放变换后的输出数据。

n 定义为数组中复数的个数(两个实数表示一个复数),,即为数组大小的1/2。

Scale 变换系数,如果为0,变换后结果乘以1/nx;否则结果乘以1。

函数的使用:函数cfft(x,n,scale)是经过以下俩个宏定义而来的:#define dummy(x,n,scale) cfft##n(x,scale)#define cfft(x,n,scale) dummy(x,n,scale)原始函数为cfft##n(x,scale),n可取值为16,32,64,128,256,512,1024。

函数Cfft()要求输入数据为倒序,即经过cbrev()处理之后的数据。

同cbrev()一样,cfft()也是对X[0]+j*X[1],X[2]+j*X[3],………X[2n]+j*X[2n+1]…………X[2*N-2]+j*X[2*N-1] 进行的FFT变换,结果按实部/虚部存放。

注意:数组中的元素个数必须为偶数。

数组的首地址的末log(n)+1必须为0。

(3)rfft(x,n,scale) ;实数FFT变换:原理及源程序说明:实数FFT变换涉及到下面两个算法。

(1)、利用N点复序列的FFT算法计算两个N点实序列FFT设x[k]和y[k]都是N点实序列,X[m]和Y[m]分别表示他们对应的N点DFT。

设h[k]=x[k]+ j y[k],已知求得h[k]的DFT为H[k],根据DFT的性质可得X[m]=1/2 {H[m]+H*[(-m)N ]}Y [m]=1/(2j) {H[m]-H*[(-m)N ]}(2)、利用N点复序列计算2N点是序列FFT。

(如rfft)设y[k]是一个长度为2N的实序列,Y[M]是 DFT。

定义如下两个数组x[k]=y[2k],h[k]=y[2k+1],由上一个算法可以得到Y[m]=X[m]+W2N m H[m]Y[m+N]=X[m]-W2N m H[m]功能:对实数进行FFT变换。

各项参数:x[n] x是一个n(n必须为偶数)项的一维数组,数组中数据定义为短整型(16位有符号整型)。

数组x既作为输入数据,又存放变换后的输出数据。

n 定义为数组中实数的个数,即等于数组大小。

Scale 变换系数,如果为0,变换后结果乘以1/nx;否则结果乘以1。

函数的使用:实数fft变换实际上也是把数组中的数据当成n/2个复数进行cfft 变换,之后再调用一个调整的函数unpack( )。

所以可以把rfft(x,n,scale)看成cfft(x,n/2,scale)+ unpack(x,n )。

其它与cfft()一样。

N点实序列的频谱是N点复序列,需要2N个存储空间(实部、虚部分别占相邻两个存储空间),但由于实序列的频谱存在共轭对称的关系,已知前N/2点复序列,就可以通过共轭对称性求的后N/2点复序列,因此只要求N个存储空间(存放前N/2个复序列)就可以存放频谱。

(4)cifft(x,n,scale) / rifft(x,2*n,scale);复数iFFT/riFFT变换:功能:对复数进行IFFT变换。

各项参数:x[2*n] x是一个2*n项的一维数组,数组中数据定义为短整型(16位有符号整形)。

数组x既作为输入数据,又存放变换后的输出数据。

n 定义为数组中复数的个数(两个实数表示一个复数),,即为数组大小的1/2。

Scale 变换系数,如果为0,变换后结果乘以1/nx;否则结果乘以1。

函数的使用:函数cifft(x,n,scale) 与函数 rifft(x,2*n,scale)其实是一个函数,实现同样的功能,使用同cfft()一样。

如果要进行实数fft变换(变换结果实数),则还需调用一个unpacki(x,n)函数。

(5)unpacki(x,n)函数功能:对rfft变换后的结果进行变换,为了rifft()得到原始实数的值。

各项参数:x[n] x是一个n(n必须为偶数)项的一维数组,数组中数据定义为短整型(16位有符号整形)。

数组x既作为输入数据,又存放变换后的输出数据。

n 定义为数组中实数的个数,即等于数组大小。

函数的使用:可以把这个函数看成unpack()函数的逆变换,具体原理同上。

五、数据测试与实验调试原始数据:为了便于观察,我们对已知信号或已知频谱进行分析。

可以利用matlab算出一个63阶低通滤波器单位脉冲响应h[k]的64点值存放到数组x[ ]。

利用N点复序列计算2N点实序列频谱(rfft)之前,2N(即64)点实序列被认为是N 点复序列。

例如:x[NX]={13, -32, -31, 22, 52, -16, -84, -9, 117,55,-142, -128, 147, 225, -115, -339, 30, 455, 123, -551, -359, 597, 691, -549, -1143, 341, 1775,176, -2825, -1578,5900, 13543, 13543, 5900, -1578, -2825, 176,1775, 341,-1143, -549, 691, 597, -359, -551,123, 455,30, -339,-115,225, 147, -128, -142, 55,117, -9,-84, -16, 52,22, -31, -32, 13 }1、实域的波形和理论的频域波形如下:实验的时域波形数据的理论频谱(未经FFT运算)2、倒序:调用函数: cbrev(x,x,NX/2); 函数运行的结果如下:在CCS界面下,点击View/ Watch Window,然后在Watch 1中的name中键入观察的变量(如变量f)。

相关文档
最新文档