调用DSP库函数实现FFT的运算
更新时间:2023-09-06 02:45:01 阅读量: 教育文库 文档下载
- DSP库函数推荐度:
- 相关推荐
通信与信息工程学院
2014 /2015 学年 第 一 学期
软件设计 实验报告
模 块 名 称 调用DSP库函数实现FFT的运算 专 业 通信工程 学 生 班 级 学 生 学 号 学 生 姓 名 指 导 教 师
设计题目
调用 DSP 库函数实现 FFT 运算
任务要求
利用 CCS 库函数 CFFT 对 sin(40*PI*t)进行 64 点的 FFT 运 算,要求回显结果图形并对其进行分析。
实验设备及 软件
硬件:计算机 软件: WINDOWS 操作系统、CCS 软件和 MATLAB(含 SIMULINK 工具包)软件。
同组人员学 号及姓名
李荣 张宸
参考文献
[1] ICETEK–VC5509-A-USB-EDU 教学实验系统软件实验指 导(电子版) [2] Code Composer StudioProject Management and Editing Tools(电子版) [3] TMS320C55xAssembly Language Tools User’s Guide (电子版) [4] TMS320C55x Optimizing C/C++ CompilerUser’s Guide (电子版) [5] 彭启琮等. TMS320VC55x 系列 DSP 的 CPU 与外设. 北京: 清华大学出版社,2005 [6] 尹勇、欧光军.DSP 集成开发环境 CCS 开发指南.北京: 北京航空航天大学出版社,2004 [7] TMS320C55x DSP Programmer’s Guide(电子版) [8] TMS320C55x DSP Algebraic Instruction Set Reference Guide(电子版)
报告内容
一、实验目的
(1)了解FFT 的原理;
(2)了解在DSP 中FFT 的设计及编程方法; (3)了解在DSP 中CFFT 的设计及编程方法; (4)熟悉对FFT 的调试方法;
(5)了解用窗函数法设计FFT 快速傅里叶的原理和方法; (6)熟悉FFT 快速傅里叶特性;
(7)了解各种窗函数对快速傅里叶特性的影响。
二、实验原理
km
,m 0,1, ,N 1 X[m] x[k]WN
k 0N 1
1
x[k]
N
N 1
X[m]WN km,k 0,1, ,N 1
m 0
如果利用上式直接计算DFT,对于每一个固定的m,需要计算N次复数乘法,N-1次加法,对于N个不同的m,共需计算N的2次方复数乘法,N*(N-1)次复数加法.显然,随着N的增加,运算量将急剧增加, 快速傅里叶算法有效提高计算速度,利用FFT算法只需(N/2)logN次运算。
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 的算法减少运算速度。根据傅立叶变换的对称性和周期性,我们可以将DFT 运算中有些项合并。
我们先设序列长度为N=2^L,L 为整数。将N=2^L 的序列x(n)(n=0,1, ,N-1),按N 的奇偶分成两组,也就是说我们将一个N 点的DFT 分解成两个N/2 点的DFT,一般来说,输入被假定为连续的。当输入为纯粹的实数的时候,我们就可以利用左右对称的特性更好的计算DFT。我们称这样的RFFT 优化算法是包装算法:首先2N 点实数的连续输入称为“进包”。其次N点的FFT 被连续运行。最后作为结果产生的N 点的合成输出是“打开”成为最初的与DFT 相符合的2N 点输入。使用这战略,我们可以划分FFT 的大小,它有一半花费在包装输入O(N)的操作和打开输出上。这样的RFFT 算法和一般的FFT 算法同样迅速,计算速度几乎都达到了两次DFT 的连续输入。
TMS320c5402 有专门的FFT 指令,使得FFT 算法在DSP 芯片上实现的速度更快,更简单。查库函数,使用rfft 或cfft 可快速实现FFT 运算。rfft 函数原型为void rfft (DATA x, nx, short scale)其中DATA x 为数据存放数组,nx 为数组长度,运算完毕后DATA x 中原先数据被冲掉,存进运算完FFT 的数据。cfft 与rfft 不同之处在于cfft 可对复数进行FFT 运算。rifft 和cifft 分别为rfft 和cfft 进行逆运算。在这个实验中我们需要调用cfft库函数对其进行FFT运算。
三、CCS实现 1、各个函数的说明
(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)cifft(x,n,scale) 功能:
对复数进行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)函数。
(4)unpacki(x,n)函数 功能:
对rfft变换后的结果进行变换,为了rifft()得到原始实数的值。 各项参数:
x[n] x是一个n(n必须为偶数)项的一维数组,数组中数据定义为短整型(16位有符号整形)。数组x既作为输入数据,又存放变换后的输出数据。 n 定义为数组中实数的个数,即等于数组大小。
函数的使用:
可以把这个函数看成unpack()函数的逆变换,具体原理同上。 2、库函数的调用 (1)DSPLIB库函数功能
TMS320C54X系列函数库(DSPLIB)是对C语言编程可调用优化的DSP函数库,它含有50个通用目的的信号处理程序,全部由汇编语言编写,并可由C
语言调用,方便C语言与汇编语言混合编程。这些程序用在计算强度大、执行速度重要的实时运算中。通过使用这些程序,可以取得较用C语言编写的相关程序快的多的运行速度,另外通过使用现成的程序可以使开发速度大大加快。DSPLIB可进行的运算有:FFT运算、滤波与卷积运算、自适应滤波运算、相关运算、数学函数运算、三角函数运算、矩阵运算等。 (2)DSPLIB库函数的FFT运算
DSPLIB库函数提供的FFT运算程序全部由汇编语言编写,充分发挥DSP的硬件特性,运算速度很快。下面以复数FFT运算程序为例进行介绍。 快速傅立叶变换在作N点傅立叶变换运算时,输入数据常常是一连串的复数。 不过在许多实际应用上,这些需要被处理的数据都属于实数,即便如此,我们还是可以利用复数运算的DFT。
因为一个简单的方法就可以将实数数据转换成复数数据,原本的实数数据成为复数的实部,而属于复数虚部的部分则全部填上零,如此一来我们就可以直接应用复数FFT了。DSPLIB库函数提供的FFT运算程序可进行8~1024点的FFT运算。输入数据的存放以自然顺序依次排放,实部在前虚部在后。 数进行码位倒序运算形式为:cbrev(X,X,256),即可将采样数据转换成码位倒序形式,并放入X[2N]数组实数部分。为进行实数FFT运算输入数据虚部需置零。 (3) FFT运算的归一化
除非输入信号幅度非常小,否则FFT运算结果可能导致溢出,为防止溢出的发生,FFT运算提供了归一化功能(可选择),就是输出结果被运算长度N所除。在FFT运算进行归一化后,进行FFT逆运算就不需要归一化了。
3、采样波形的产生
void InputWave() {
int i;
float sample_step=1.0/SAMPLEF; float j=0.0;
for ( i=0;i<SAMPLENUMBER;i++ ) {
fInput[i]=sin(PI*2*j*SIGNAL1F)*128+sin(PI*2*j*SIGNAL2F)*32; j=j+sample_step; }
}
四、主程序
#include <math.h>//数学函数的头文件,如sqrt. #include <tms320.h>//定义数据类型的头文件 #include <dsplib.h>// DSPLIB库文件
#include "t4_SCALE.h"//#include "t6_NOSCALE.h"
#define SIGNAL1F 20 #define SAMPLEF 64 #define PI 3.1415926 #define SAMPLENUMBER 128
short INPUT[SAMPLENUMBER],x[SAMPLENUMBER]; float OUTPUT[SAMPLENUMBER]; void MakeWave();
void MakeWave() {
int i;
float sample_step=1.0/SAMPLEF; float j=0.0;
for ( i=0;i<SAMPLENUMBER/2;i++ ) {
INPUT[i]=sin(PI*2*j*SIGNAL1F)*1024; j=j+sample_step; } }
void main() { int i;
MakeWave();
for(i=0;i<SAMPLENUMBER;i=i+2) {
x[i]=INPUT[i/2]; }
for(i=1;i<SAMPLENUMBER;i=i+2)
x[i]=0.0; }
cbrev(x,x,SAMPLENUMBER/2);
cfft(x,SAMPLENUMBER/2, SCALE); //unpacki(x,SAMPLENUMBER/2);
//cbrev(x,x,SAMPLENUMBER/2);
//cifft(x,SAMPLENUMBER/2,SCALE);
for ( i=0;i<SAMPLENUMBER;i++ ) { OUTPUT[i]=x[i];}
while ( 1 ); // break point }
五、实验步骤
1.实验准备 设置软件仿真模式
2.启动CCS,打开工程,浏览程序
3.编译程序
4.导入.out文件并运行
5.分别设置窗口,并出图
六、实验结果
1、正弦输入波形(时域)
分析:由于采样频率为64HZ,相对于正弦函数频率他的采样频率较小,所以产生的时域图片会有失真。
输入波形(频域)
分析:有图可得峰值所在点为20π符合题目要求
经过FFT处理后的波
分析:出现峰值和谷值的地方为20和44且相对称,出现负值的原因是没有取模。另外在出图时设置grath的采样频率为2HZ,因为x[i]中有实数和虚数。
三个图放在一起比较
六、调试过程中遇到的问题和解决办法
1. 在程序运行的过程中会出现dsplib.h和tms320.h文件不存在的现象,
这是由于DSPLIB安装在固定的子目录上,而应用程序在桌面上,程序编译连接时,找不到DSPLIB中相应的程序。所以需要对工程的bulid options选项中的两个地方经行设置。首先是找不到dsplib.h、tms320.h文件时,在compiler标签下选中preprocessor选项,在Include Search Path栏中填入dsplib.h、tms320.h所在子目录,此处为下图所示:
当出现连接时找不到FFT运算相应的汇编程序,此时可在linker标签下选中basic
选项,在Library Search Path栏中填入55xdsp.lib库文件所在路径,本次试验示例如下:
此时完成设置,编译连接时可将应用程序及DSPLIB中的程序连接起来,程序可以
正常编译。
2. 出图的时候,通过view栏进行了出图窗口编辑,但是仍然出不了图,此时需要通过
debug栏中的Animate使程序运行出图。
七、心得体会
通过本次实验我理解了FFT快速傅里叶变化算法和CFFT算法,同时对
DSP课程我也有了更深入的了解,这一段时间的程序设计经历增加了我自主学习的能力。
虽然有参考案例,但是对于第一次接触CCS软件的我来说并不简单,
首先对于程序我需要看懂案例中的内容,然后在相应的地方进行改动,以符合我的实验案例。经过不断的摸索,现在终于能熟练的掌握CCS仿真软件的使用,同时也能就简单的dap问题进行编程运行模拟。
八、参考程序
参考程序:
G:\0f8d8f144f82e50a01dfc89984afbe02\c5500\dsplib\EXAMPLES\CFFT
设计成绩评定
正在阅读:
调用DSP库函数实现FFT的运算09-06
江苏名著阅读高考真题04-03
ABB机器人资料12-17
物业管理服务报价表08-07
人教版高中语文必修五第二单元第4课《归去来兮辞》教学设计(1)11-02
几何辅助线之歌06-08
图层基本操作04-07
设计说明106-25
楼宇智能化综合实习实训报告03-10
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 运算
- 调用
- 函数
- 实现
- DSP
- FFT
- 基于STM32F103的MLX90614驱动
- 某幼儿园工资表
- “植物生长素的发现” 教学设计与反思
- 1 第一章 管理学原理绪论
- CFA金融词汇翻译及解释-金融英语词汇(含解释)
- 地面采暖的施工要求
- 小学二年级下册应用题和奥数题
- 11年财务人员个人年终工作总结范文
- 岳麓版历史选修一 明治维新
- 系统数学模型与仿真集成环境Simulink
- 中小学生转学申请表
- 【采纳品牌定位】上海锦凤兰家纺锦帛尔品牌诊断报告
- 2011高考阅读专题训练文学类文本阅读(散文阅读)
- 2017年陕西师范大学数学与信息科学学院726数学分析考研强化模拟题
- 《国际金融理论与实务(修订版)》第十二章:欧洲货币联盟
- 煤层底板突水评价的新型实用方法_基于GIS的AHP型脆弱性指数法应用
- 2017年聊城大学美术学院333教育综合之中国教育史考研强化模拟题
- 人民法院书记员法律知识试题
- 《10kV及以下电力用户业扩工程技术规范》(标准编制说明)
- 2013年“千人计划”人才申报项目一览表(2013年3月29日截止)