实验八 快速傅立叶变换(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实验

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)实验报告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实现实验报告的全部内容。

一、实验目的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及其应用实验报告

实验一 离散时间系统的时域分析一、实验目的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 都成立,否则为非线性系统。

  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)。

相关文档
最新文档