毕业设计报告(论文)
报告(论文)题目:分段卷积的MATLAB仿真 与DSP实现 作者所在系部: 电子工程系 作者所在专业: 通信 作者所在班级: 作 者 姓 名 : 作 者 学 号 : 指导教师姓名: 完 成 时 间 : 2012年6月15日
北华航天工业学院教务处制
1
北华航天工业学院
毕业设计(论文)任务书(理工类) 学生姓名: 专 业: 通信 班 级: 学 号: 指导教师: 职 称: 完成时间: 2012.6 毕业设计(论文)题目: 分段卷积的MATLAB仿真与DSP实现 教师科研纵向课题( )课 题 横向课题( ) 题目来源 理论研究( ) 应用研究( ) 题目类型 注:请直接在所属项目括号内打“√” 教师自拟课题(√) 学生自拟课题( ) 应用设计(√) 其 他( ) 总体设计要求及技术要点: 基本设计要求: 分段卷积采用两种方法实现,即重叠相加法和重叠保留法。基于matlab完成分段卷积,并以图形方式演示分段卷积过程。 较高设计要求: 1、 分别用重叠相加法和重叠保留法,基于DSP编程实现分段卷积; 2、 分段卷积的新方法、快速算法设计及仿真。 1
工作环境及技术条件: 硬件:计算机,DSP实验箱 软件:MATLAB,CCS 工作内容及最终成果: 利用FFT实现线性卷积方法要求两个输入序列的长度基本相同,但在实际工程中经常会遇到某个输入序列具有较长持续时间的情况,而另一序列较短,理论上可以将输入序列(长序列)存储起来,利用快速线性卷积方法进行处理,但无法达到信号“实时”处理的要求。在这种情况下,分段卷积是一种有效的解决方案。 主要工作:基于matlab完成分段卷积,并以图形方式演示分段卷积过程;基于DSP编程实现分段卷积。 最终成果: 基于matlab完成分段卷积,并以图形方式演示分段卷积过程; 分别用重叠相加法和重叠保留法,基于DSP编程实现分段卷积 时间进度安排: 1、第七学期第6周~第15周,查阅资料,完成开题报告、文献综述、外文文献翻译 2、第七学期第16周~第17周,开题报告审阅、答辩 3、第八学期第1周~第4周,重叠相加法和重叠保留法分段卷积研究 4、第八学期第5周~第9周,matlab完成分段卷积,并以图形方式演示分段卷积过程 5、第八学期第10周~第12周,DSP编程实现分段卷积 2
6、第八学期第13周~第15周,整理资料,完成毕业设计论文 指导教师签字: 年 月 日 教研室主任意见: 教研室主任签字: 年 月 日 3
北华航天工业学院
本科生毕业设计(论文)原创性及知识产权声明
本人郑重声明:所呈交的毕业设计(论文) 分段卷积的MATLAB仿真与
DSP实现
是本人在指导教师的指导下,独立进行研究工作取得的成果。除文中已经注明引用的内容外,本设计(论文)不含任何其他个人或集体已经发表或撰写过的作品或成果。对本设计(论文)的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。因本毕业设计(论文)引起的法律结果完全由本人承担。
本毕业设计(论文)成果归北华航天工业学院所有。本人遵循北华航天工业学院有关毕业设计(论文)的相关规定,提交毕业设计(论文)的印刷本和电子版本。本人同意北华航天工业学院有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;可以采用影印、缩印、数字化或其它复制手段保存论文;在不以营利为目的的前提下,可以公布非涉密毕业设计(论文)的部分或全部内容。
特此声明
毕业设计(论文)作者: 指导教师:
年 月 日 年 月 日
北华航天工业学院毕业论文
摘 要
常用的线性卷积方法要求两个输入序列的持续时间相同,但在实际工程中经常会遇到某个输入序列具有较长持续时间的情况,从而无法达到信号实时处理的要求。在这种情况下,分段卷积是一种有效的解决方案。本论文设计了分段卷积的快速算法模块,分段卷积又可以用两种方法实现,即重叠相加法和重叠保留法。每种方法先对输入序列进行分段,再将各段进行快速傅里叶变换,接着进行傅里叶逆变换得到各段输出,将输出结果进行处理就得到了最终结果。
在DSP中采用流水线结构进行实时处理。经检验该方法正确且能很好地满足对信号进行实时处理的要求。
关键词 分段卷积 重叠相加法 重叠保留法 快速傅里叶变换
I
北华航天工业学院毕业论文
Abstract
Duration of the linear convolution method requires two input sequences, but in practical engineering often encounter an input sequence has a longer duration, thus unable to signal real-time processing requirements. In this case, piecewise convolution is an effective solution. Designed a segmented fast convolution algorithm module, piecewise convolution of two ways, ie, overlap-add method and overlap save method. Each method first segment of the input sequence, then the paragraphs fast Fourier transform, then the inverse Fourier transform of each segment output and output processing to get the final result.
Pipelined architecture for real-time processing in DSP. By inspection that the method correctly and can well meet the requirements of the signal processing in real time.
Key words partition convolution overlap- add method overlap- save method FFT
II
北华航天工业学院毕业论文
目 录
第1章 绪论 ............................................................... 1 1.1 课题背景及国内外研究概况 ............................................. 1 1.2 MATLAB软件概述 ....................................................... 1 1.2.1 MATLAB软件介绍 ................................................... 1 1.2.2 MATLAB软件应用 ................................................... 2 1.3 DSP技术介绍及应用 .................................................... 2 1.4 课题的建立以及本文完成的主要工作 ..................................... 2 第2章 分段卷积技术 ....................................................... 4 2.1 利用FFT计算线性卷积原理及步骤 ....................................... 4 2.2 重叠相加法原理及流程图 ............................................... 4 2.2.1 重叠相加法算法原理 ............................................... 4 2.2.2 流程图 ........................................................... 5 2.3 重叠保留法原理及流程图 ............................................... 6 2.3.1 原理 ............................................................. 6 2.3.2 流程图 ........................................................... 8 2.4 小结 ................................................................. 8 第3章 MATLAB仿真 ....................................................... 10 3.1 重叠相加法 .......................................................... 10 3.2 重叠保留法 .......................................................... 10 3.3 操作步骤 ............................................................ 11 3.4 程序源代码及结果分析 ................................................ 15 3.5 小结 ................................................................ 20 第4章 CCS软件概况 ...................................................... 21 4.1 CCS软件简介 ......................................................... 21 4.1.1 软件概况 ........................................................ 22 4.1.2 CCS软件的使用 ................................................... 22 4.2 程序源代码 .......................................................... 24 4.3 小结 ................................................................ 27 第5章 课题特点 .......................................................... 28
III
北华航天工业学院毕业论文
5.1 MATLAB仿真和DSP实现 ................................................ 28 5.2 采用时域卷积和FFT变换两种方案 ...................................... 28 5.3 C语言和汇编语言混合编程 ............................................. 28 第6章 结论 .............................................................. 29 致 谢 .................................................................. 30 参考文献 .................................................................. 31 附录 ...................................................................... 32
IV
北华航天工业学院毕业论文
分段卷积的MATLAB仿真与DSP实现
第1章 绪论
1.1 课题背景及国内外研究概况
由于 Matlab 具有计算快速准确和使用方便等优点,已经逐渐成为数字信号处理(DSP)应用中分析和设计的主要仿真工具。常用的线性卷积方法要求两个输入序列的持续时间相同, 但在实际工程中经常会遇到某个输入序列具有较长持续时间的情况,理论上可以将整个波形存储起来,利用快速线性卷积方法进行处理。但是利用快速线性卷积变换存在以下问题:(1)需要对那个短序列补充很多零点,从而导致计算量和需要的存储空间无谓的增加;(2)需要获得所有的输入序列,并完全进行处理后,输出序列才是有效的,因此整个系统必然存在较大的延时,不能符合实时处理的要求;(3)实际上,当两个序列长度差距较大时,快速卷积的优势并不能体现出来,从而无法达到信号实时处理的要求。在这种情况下,分段卷积是一种有效的解决方案。
分段卷积快速算法模块,在DSP中采用流水线结构进行实时处理,经检验该方法正确且能很好地满足对信号进行实时处理的要求。
1.2 MATLAB软件概述
1.2.1 MATLAB软件介绍
MATLAB是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
Matlab和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接MATLAB开发工作界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。
1
北华航天工业学院毕业论文
在新的版本中也加入了对C,FORTRAN,C++ ,JAVA的支持。可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户可以直接进行下载就可以使用。
MATLAB具有以下特点:
1.高效的数值计算及符号计算功能,能使用户从繁杂的数学运算分析中解脱出来; 2.具有完备的图形处理功能,实现计算结果和编程的可视化;
3.友好的用户界面及接近数学表达式的自然化语言,使学者易于学习和掌握; 4.功能丰富的应用工具箱,为用户提供了大量方便实用的处理工具。.
1.2.2 MATLAB软件应用
MATLAB 产品族可以用来进行以下各种工作: (1) 数值分析 (2)数值和符号计算 (3)工程与科学绘图 (4)控制系统的设计与仿真 (5)数字图像处理 技术 (6)数字信号处理 技术 (7)通讯系统设计与仿真 (8)财务与金融工程
MATLAB 的应用范围非常广,包括信号和图像处理、通讯、控制系统设计、测试和测量、财务建模和分析以及计算生物学等众多应用领域。附加的工具箱(单独提供的专用 MATLAB 函数集)扩展了 MATLAB 环境,以解决这些应用领域内特定类型的问题。
1.3 DSP技术介绍及应用
数字信号处理是利用计算机或专用处理设备,以数字的形式对信号进行分析、采集、
合成、变换、滤波、估算、压缩、识别等加工处理,以便提取有用的信息并进行有效的传输与应用。与模拟信号处理相比,数字信号处理具有精确、灵活、抗干扰能力强、可靠性高、体积小、易于大规模集成等优点。
DSP是一种特别适合于进行数字信号处理运算的微处理器,主要用于实时快速实现各种数字信号处理的算法。
1.4 课题的建立以及本文完成的主要工作
利用FFT实现线性卷积方法要求两个输入序列的长度基本相同,但在实际工程中经
2
北华航天工业学院毕业论文
常会遇到某个输入序列具有较长持续时间的情况,而另一序列较短,理论上可以将输入序列(长序列)存储起来,利用快速线性卷积方法进行处理,但无法达到信号“实时”处理的要求。在这种情况下,分段卷积是一种有效的解决方案。
本文主要包括以下内容:
1.基于matlab完成分段卷积,并以图形方式演示分段卷积过程; 2.基于DSP编程实现分段卷积;
3.采用重叠相加法和重叠保留法两种方法实现。
3
北华航天工业学院毕业论文
第2章 分段卷积技术
2.1 利用FFT计算线性卷积原理及步骤
设输入信号分别为x(n)和y(n),分别对其进行FFT运算,进而求出Y(k),利用逆FFT得到y(n)。计算步骤如下:
a.计算X(k)=FFT[x(n)] b. 求H(k)=FFT[h(n)]
c. 求Y(k)=H(k)X(k) k=0~L-1 d. 求y(n)=IFFT[Y(k)] n=0~L-1
上述结论适用于x(n)、h(n)两序列长度比较接近或相等的情况,如果x(n)、h(n)长度相差较多,例如:h(n)为某滤波器的单位脉冲响应,长度有限,用来处理一个很长的输入信号x(n),或者处理一个连续不断的信号,按上述方法,h(n)要补许多零再进行计算,计算量有很大的浪费,或者根本不能实现。为了保持快速卷积法的优越性,可将x(n)分为许多段后处理,每小段的长与h(n)接近,其处理方法有两种:即重叠相加法和重叠保留法。
2.2 重叠相加法原理及流程图
2.2.1 重叠相加法算法原理
重叠相加法是将输入序列x(n)进行分段,每段长度为N,分段的结果与h(n)(长度为M)进行卷积,且N不小于M,如图2-1所示。
图2-1 重叠相加法中x(n)分段图
将分段结果代入式(2-1):
4
北华航天工业学院毕业论文
ynxlnh(n)yl(n)lNn(l1)NM2 (2-1)
l0l0其中,yl(n)的长度为N+M-1,有效区间为[lN,(l+1)N+M-2]。
为了提高运算效率,可以用N+M-1点的循环卷积来完成yln的计算,如图2-2所示。
图2-2 重叠相加法中yl(n)之间关系图
2.2.2 流程图
重叠相加法流程图如图2-3所示。
5
北华航天工业学院毕业论文
卷积
重叠相加法
开始 开始 对x1(n)进行FFT运算 对x(2)进行FFT运算 取圆周卷积的周期L 计算每一分段的大小N 频域相乘 Yk=X1k*X2k 将序列按要求填充 对Yk进行反变换得到时域结果y(n) 计算分段数K 调用卷积函数 结束 将各段处理的结果重叠相加输出最终结果 结束
图2-3 重叠相加法流程图
2.3 重叠保留法原理及流程图
2.3.1 原理
对序列y(n)进行分段,每段长度为N,则ynyln,分段结果如式(2-2):
ylnl0y(n)0lNn[(l1)N1]
其他 (2-2)
6
北华航天工业学院毕业论文
重叠保留法中yl(n)的分段结果如图2-4所示,
......(2N-1)y1(n)......n0y0(n)(N-1)Ny2(n)
图2-4 重叠保留法中yl(n)分段图
因h(n)为因果序列且长度为M,由线性卷积的物理含义可知,从点(lN-M+1)到点[(l+1)N-1]范围内的输入将唯一决定序列yl(n)的取值,所以根据输出序列y(n)的分段结果可确定输入序列x(n)的分段方式,如式(2-3)所示,
x(n)lNM1n[(l1)N1]xl(n)0 其他 (2-3)
式中l=1,2....
重叠保留法中xl(n)各段间的关系如图2-5所示。
图2-5 重叠保留法中xl(n)之间关系图
7
北华航天工业学院毕业论文
2.3.2 流程图
重叠保留法流程图如图2-6所示。
开始 输入序列x(n),h(n) 计算各序列长度、分段数、生成临时序列 填入保留值后分段循环卷积 输出前N个点并为t(n) 否
完成所有分段计算? 是 输出序列y(n) 结束 图2-6 重叠保留法流程图
2.4 小结
重叠相加法和重叠保留法都是应用DFT求线性卷积的方法,之所以会改进直接计算线性卷积的时间复杂度,就是因为DFT的快速算法。两种算法都是对原序列进行分组,进行循环卷积后再组合,有相同的时间复杂度,但在执行过程和应用范围上还是有一定的
8
北华航天工业学院毕业论文
区别。重叠相加法是对已知的有限长序列进行分段后与系统序列循环卷积,组合时去掉每段后面重叠的部分;重叠保留法是通过对输出序列进行分段后导出的一种线性卷积方法,分段前对原序列前面进行添零,分段循环卷积后将每段后面未重叠的一部分保留后组合。
两个程序在分段上有差异,但都是对截断的序列进行循环卷积,因而有一定的通用性。在进行本实验的编程上,最主要的是理解两种方法实现的过程,在对数据处理时要注意各个数据的含义和数组的组合过程。
在编程过程中,我曾多次遇到数据长度不匹配的提醒,通常是数组长度后少添了或多添了常数,这种错误必须比对方法的定义耐心仔细的寻找。在数组的组合上本人认为是很有技巧的,力求明确简单,必须经过多次的尝试才能得出较为理想的方式。
9
北华航天工业学院毕业论文
第3章 MATLAB仿真
3.1 重叠相加法
MATLAB实现重叠相加法流程图如图3-1所示。
开始输入进行卷积的序列x(n)和h(n)以及卷积长度N对h(n)进行fft对x(n)分段x1(n)X2(n)X3(n)……fftfftfftfftX1(k)X2(k)X3(k)……****H(k)ifftifftifftiffty1(n)y2(n)y3(n)……组合y(n)终止
图3-1 MATLAB实现重叠相加法流程图
3.2 重叠保留法
MATLAB实现重叠相加法流程图如图3-2所示。
10
北华航天工业学院毕业论文
开始有限长序列xe因果学列hh每段长度N为xe添M-1个零x分组每组为N+M-1个元素x1x2……N+M-1点循环卷积N+M-1点循环卷积N+M-1点循环卷积取点组合yn图3-2 MATLAB实现重叠保留法图
3.3 操作步骤
一、重叠相加法
1.建立一个新文件,名为cdxj.m,如图3-3所示。
图3-3 重叠相加法建立新文件图
11
北华航天工业学院毕业论文
2.输入程序代码
输入重叠相加法程序代码过程如图3-4所示。
图3-4 重叠相加法输入程序代码图
3.保存文件并运行,结果如图3-5、3-6所示。
图3-5 重叠相加法保存运行文件图
图3-6 重叠相加法保存运行文件图
12
北华航天工业学院毕业论文
4.仿真结果
仿真结果如图3-7所示。
图3-7 重叠相加法仿真结果图
运算结果如图3-8所示。
图3-8 重叠相加法运算结果图
二、重叠保留法
程序代码及保存文件如图3-9、3-10所示。
13
北华航天工业学院毕业论文
图3-9 重叠保留法程序代码图
图3-10 重叠保留法保存文件图
仿真结果及运行结果如图3-11、3-12所示。
图3-11 重叠保留法仿真结果图
14
北华航天工业学院毕业论文
图3-12 重叠保留法运行结果图
3.4 程序源代码及结果分析
1.重叠相加法 function [] =cdj(xe,h,N) h=[1 0 -1];xe=[1:10];N=6; k=length( xe );%输入序列长度 t=length(h);%有限长序列长度 g=N+t-1;%进行循环卷积的长度 m=ceil(k/N);%将xe分段
p=m*N+t-1;%序列卷积后的总长度 yn=zeros(1,p);
x=[xe,zeros(1,m*N-k)];%补零 for j=0:m-1
xj=x(N*j+1:N*(j+1));%xe中每段卷积的元素 xak=fft(xj,g); hk=fft(h,g);
yn1=ifft(xak.*hk); %每段的卷积结果 temp=zeros(1,p); temp(N*j+1:N*j+g)=yn1;
yn=yn+temp;%将每段的卷积结果加到yn中 end;
15
北华航天工业学院毕业论文
yn %输出卷积后的结果 n=0:p-1; figure(1) subplot(2,1,1); stem(n,yn);
xlabel('n');ylabel('y(n)');
title('h(n)与xe(n)的线性卷积的时域波形—重叠相加法'); subplot(2,1,2); stem(n,abs(fft(yn))); xlabel('k');ylabel('Y(k)');
axis([0,6*p/5,0,sum(ceil(abs(yn)))]);
title('h(n)与xe(n)的线性卷积的频域特性—重叠相加法'); 运行结果 h=[1 0 -1]; xe=[1:10]; N=6
经过重叠相加法求得线性卷积结果为
yn =
Columns 1 through 11
1.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 -9.0000
Columns 12 through 14
-10.0000 -0.0000 -0.0000 仿真图形如图3-14:
2.0000 2.0000 16
北华航天工业学院毕业论文
图3-13 重叠相加法仿真结果图
可以看出仿真结果与运算结果相同。用以上算法,对长为k的序列x(n)进行分段,每段长度为N,可分为[K/N]段,每段的结果与h(n)(长度为M)进行卷积,
通过FFT运算可以减少运算量,复乘[K/N](N+M-1)log2(N+M-1)次,复加2[K/N](N+M-1)log2(N+M-1)次如图3-14所示:
图3-14 重叠相加法结果分析图
2.重叠保留法
function [] =cdbl(xe,h,N) xe=[1:10];h=[1 0 -1];N=4; k=length(xe);%输入序列长度 M=length(h);%有限长序列长度 g=N+M-1;%进行循环卷积的长度
17
北华航天工业学院毕业论文
m=ceil(k/N);%将xe分段
p=m*N+M-1;%序列卷积后的总长度 xe1=zeros(1,M-1);
x=[xe1,xe,zeros(1,g-(k-(m-1)*N)+M-1)];%在xe前面添(M-1)个零,后面添足零为g的整数倍
yn=zeros(1,p); for j=0:m-1
xj=x(N*j+1:N*(j+1)+M-1);%xe中每段卷积的元素 xak=fft(xj,g); hk=fft(h,g);
yn1=ifft(xak.*hk); %每段的卷积结果 temp=zeros(1,p);
temp(N*j+1:N*(j+1))=yn1(M:g)
yn=yn+temp;%将每段的卷积结果加到yn中 end;
yn %输出卷积后的结果 n=0:p-1; figure(2) subplot(2,1,1); stem(n,yn);
xlabel('n');ylabel('y(n)');
title(' xc(n)与xe(n)的线性卷积的时域波形—重叠保留法'); subplot(2,1,2); stem(n,abs(fft(yn))); xlabel('k');ylabel('Y(k)');
axis([0,6*p/5,0,sum(ceil(abs(yn)))]);
title('xc(n)与xe(n)的线性卷积的幅频特性—重叠保留法'); end % 测试序列 % xe=[1:10]; % h=[1 0 -1]; % N=4;cdbl(xe,h,N) 运行结果 测试序列 xe=[1:10];
18
北华航天工业学院毕业论文
h=[1 0 -1]; N=4; 结果为: yn =
Columns 1 through 11
1.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 -9.0000
Columns 12 through 14
-10.0000 0 0 仿真如图3-16所示。
图3-15 重叠保留法仿真结果图
重叠保留法和重叠相加法是有相同的运算过程,如图3-16所示:
(M-1)点缓存xl(n)后(M-1)点序列衔接(N+M-1)点循环卷积后N点y(n)每N点输入h(n)
图3-16 结果分析图
因而也是进行了复乘[K/N](N+M-1)log2(N+M-1)次,复加2[K/N](N+M-1)log2(N+M-1)次。
19
北华航天工业学院毕业论文
3.5 小结
重叠相加法和重叠保留法都是应用DFT求线性卷积的方法,之所以会改进直接计算线性卷积的时间复杂度,就是因为DFT的快速算法。两种算法都是对原序列进行分组,进行循环卷积后再组合,有相同的时间复杂度,但在执行过程和应用范围上还是有一定的区别。重叠相加法是对已知的有限长序列进行分段后与系统序列循环卷积,组合时去掉每段后面重叠的部分;重叠保留法是通过对输出序列进行分段后导出的一种线性卷积方法,分段前对原序列前面进行添零,分段循环卷积后将每段后面未重叠的一部分保留后组合。
两个程序在分段上有差异,但都是对截断的序列进行循环卷积,因而有一定的通用性。在进行本设计的编程上,最主要的是理解两种方法实现的过程,在对数据处理时要注意各个数据的含义和数组的组合过程。
20
北华航天工业学院毕业论文
第4章 CCS软件概况
4.1 CCS软件简介
CCS(Code Composer Studio数据设计工作室)代码调试器是一种合成开发环境。 它是一种针对标准TMS320调试器接口的交互式方法。CCS目前有CCS1.1, CCS1.2 和CCS2.0等三个不同时期的版本,又有CC2000 ( 针对C2XX ),CCS5000 ( 针对C54XX )和CCS6000 (针对C6X )三个不同的型号。我们所使用的是CCS50002.0的版本。
CCS5000具有以下特性:
TI编译器的完全集成的环境:CCS5000目标管理系统,内建编辑器,所有的调试和分析能力集成在一个Windows环境中。
对C和DSP汇编文件的目标管理:目标编辑器保持对所有文件及相关内容的跟踪。它只对最近一次编译中改变过的文件重新编译,以节省编译时间。
高集成的编辑器调整C和DSP汇编代码:CCS5000的内建编辑器支持C和汇编文件的动态语法加亮显示。使用户能很容易地阅读代码和当场发现语法错误。
编辑和调试时的后台编辑:用户在使用编译器和汇编器时没有必要退出系统到DOS环境中,因为CCS5000会自动将这些工具装载在它的环境中。在其窗口中,错误会加亮显示只要双击错误就可以直接到达出错处。
在含有浮点并行调试管理器(PDM)的原有的MS窗口下支持多处理器CCS5000在 Windows95和Windows-me中支持多处理。PDM(调试管理器)允许将命令传播给所有的或所选择的处理器。
在任何算法点观察信号的图形窗口探针:图形显示窗口使用户能够观察时域或频域内的信号。对于频域图,FFT(快速傅立叶变换)在主机内执行,这样就可以观察所感兴趣的部分而无须改变它的DSP代码。图显示也可以同探针连接,当前显示窗口被更新时,探针被指定,这样当代码执行到达该点时,就可以迅速地观察到信号。
文件探针在算法处通过文件提取或加入信号或数据:CCS5000允许用户从PC机读或写信号流。而不是实时的读信号,这就可以用已知的例子来仿真算法。
图形分析:CCS5000的图形分析能力在其环境中是集成的。 在后台(系统命令)执行用户的DOS程序:
用户可以执行CCS5000中的DOS程序,并将其输出以流水方式送到CCS5000的输出窗口。且允许用户将应用程序集成到CCS5000。
技术状态观察窗口:CCS5000的可视窗口允许用户进入C表达式及相关变量。结构、数组、指针都能很简单地递归扩展和减少,以便进入复杂结构。
代数分解窗口:允许用户选择查看写成代数表达式的C格式,提高可读性 。 目标DSP上的帮助:DSP结构和寄存器上的在线帮助可以使用户不必查看技术手册。
21
北华航天工业学院毕业论文
用户扩展:扩展语言(GEL)使得用户可以将自己的菜单项加到CCS5000的菜单栏中。 主要操作流程如图4-1所示。
图4-1 主要操作流程图
4.1.1 软件概况
CCS提供了环境配置、源文件编译、程序调试、跟踪和分析等工具。可以帮助用户在一个软件环境下完成编译、编译链接、调试和数据分析等工作。与TI提供的早期软件开发工具相比,利用CCS能够加快软件开发进程,提高工作效率:CCS一般工作在两种模式:软件仿真器和与硬件开发板相结合的在线编程。前者可以脱离DSP芯片,在PC机上模拟DSP的指令集与工作机制,主要用于前期算法实现和调试;后者实时运行在DSP芯片上。可以在线编制和调试应用程序。一般的,一种CCS只适用于一种系列的DSP芯片。例如CCS5000适用于C5000系列DSP芯片,包括C54x和C55x。用户只需要在CCS配置程序中设定DSP的类型和开发平台类型即可。
4.1.2 CCS软件的使用
打开CCS5000主程序,打开的主界面如图4-2所示。
图4-2 CCS54xx软件界面
1.新建工程文件
22
北华航天工业学院毕业论文
文件复制完成以后,启动CCS,在主菜单中单击“Project”(设计),会有“new”和“open”选项,创建新工程使用“new”选项。程序会提问新建工程的名字以及保存位置,指定后单击“确定”即可,如图4-3所示。
图4-3 新建工程图
可以使用两种方式向工程添加源文件、CMD文件和库文件添加源文件。
在主菜单中单击“Project”,选择“Add Files to Project”命令,在弹出的添加文件对话框中找到目录“a”,选择文件“a.c”,单击“打开”按钮,如下面左图所示。
另一个方法是在工程名“a.pjt”上单击鼠标右键,选择“Add Files”命令。在弹出的添加文件的对话框中,找到目录“a”,再在添加文件对话框中单击“文件类型”,选择“C Source Files(*.c;*.ccc)”,这样在添加文件对话框里就只显示指定类型的文件。同时选择“load.asm”和“vectors.asm”,单击“打开”按钮,如图4-4所示。
图4-4 添加文件方式图
(1)接着添加必需的内存定位文件“*.cmd”,使用上述任一方式,向工程里添加“a.cmd”,注意在添加文件对话框的“文件类型”下拉列表中要选择“Link Command File(*.cmd)”,该文件定义了各代码段和数据段在存储器中的位置。
(2)因为本实验工程是基于C语言编写的,因此还需要添加运行时支持库(Run-Time-Support Library)。使用上述任何一种方式,向工程添加“rts.lib”文件,该文件存
23
北华航天工业学院毕业论文
放在CCS的安装目录“\\c5400\\cgtools\\lib”下。注意在添加文件对话框的“文件类型”下拉列表中要选择“Object Library Files(*.o*,*.l*)”。
(3)添加头文件。在工程名“a.pjt”上单击鼠标右键,选择“Scan All Dependencies”,这样a.c文件所包含的头文件“a.h”将出现在工程浏览窗中的“Iclude”文件夹中。头文件实际不用人工添加,在Build工程时,CCS本身就会自动完成扫描。
建造和运行程序
建造(Building)在这里指编译、汇编、链接三个独立步骤按顺序联合运行。在主菜单中单击“Project”,选择“Rebuild All”,或者单击工具条图标
,CCS将重新对工程
中所有文件进行编译、汇编、链接,并同步在底部窗口中显示编译连接信息。连接完毕,CCS生成一个“.out”文件,默认存放在目录“a”下的“debug”(除错)目录中。
建造完毕后,再完成装载程序的步骤:在主菜单中单击“File”,选择“Load Program”,在弹出对话框中,找到目录“a”下的“debug”目录,选择“a.out”,并打开。
在主菜单中单击“Debug”,选择“Run”,或单击工具条图标
,让程序全速运行。
,让程序停止
如果能在底部的stdout标准输出窗口看到程序运行的输出信息“a started”,证明程序能够正常运行。在主菜单中单击“Debug”,选择“Run”,或单击工具条图标运行。
2.多种观察窗口帮助调试
查看寄存器:在 CCS中选择View菜单中的CPU Registers命令。
查看数据:选择View菜单中的Memory…命令,弹出设置窗口,按实际需要指定其中的参数,如起始地址等,就可以观察到数据单元中的值,该值可以以多种格式表示。
查看程序中变量的当前值:可以在程序中用光标选中变量名,在鼠标右键菜单中选择Add to Watch Window命令就可以把该变量添加到Watch窗口。随着程序的运行,可以在Watch窗口看到该变量的值的变化。
显示图形:如果要观察的变量太多,例如要观察一个数组的值,那么可以用一种更直观的方法,就是把数据用图形的方式表现出来。选择View菜单中的Graph命令,会有不同类型的图形可供选择。常用的是时域/频域波形,即Time/Frequency…项。在弹出的Graph Property对话框中,可以设定图形的标题、数据的起始地址、采集缓冲区的大小、显示数据的大小、数据类型等属性。
4.2 程序源代码
根据课题要实现的功能及要求,CCS软件进行分段卷积编程部分C语言源程序: 1.重叠相加法
#include main() { 24 北华航天工业学院毕业论文 static float y[600],z[600]; int m,n,L,i,j,k,s,t,t1,p,M; float x[10]={1,2,3,4,5,6,7,8,9,10}; float v[3]={1,0,-1}; M=6;m=10;n=3; L=M+n-1; t=m/M; if (m%M==0) t1=t; else t1=t+1; for (p=0;p<=t1-1;p++) { for(i=p*L;i<=(p+1)*L-1;i++) { s=0; for (j=0;j<=M-1;j++) {k=i-j; s+=x[p*M+j]*v[k-p*L]; y[i]=s;} }} for(p=0;p<=t1-1;p++) { for(i=p*L;i<=(p+1)*L-1;i++) {if(i==0||(0if((L+p*M-nM-1)) z[i]=y[i+p*(n-1)]+y[i+(p+1)*(n-1)]; if((p*L-1=L)) z[i]=y[i+p*(n-1)]; return(z[i]);} } } 2.重叠保留法 #include static float y[600],x1[600],h1[300],h2[300]; 25 北华航天工业学院毕业论文 int M,N,L,Lx,i,j,k,s,t,t1,p; float x[10]={1,2,3,4,5,6,7,8,9,10}; float h[3]={1,0,-1}; Lx=10;M=3;N=6; L=M+N-1; t=Lx/N; if (Lx%N==0) t1=t; else t1=t+1; for(j=M;j for(j=0;j for (k=0;k 3.链接文件 MEMORY 26 北华航天工业学院毕业论文 { PAGE 0: EPROG: origin = 0x1400, len = 0x7c00 VECT: origin = 0xff80, len = 0x80 PAGE 1: USERREGS: origin = 0x60, len = 0x1c BIOSREGS: origin = 0x7c, len = 0x4 IDATA: origin = 0x80, len = 0x1380 EDATA: origin = 0x1400, len = 0x8000 EDATA1: origin = 0x9400, len = 0x4c00 } SECTIONS { .vectors: {} > VECT PAGE 0 .sysregs: {} > BIOSREGS PAGE 1 .trcinit: {} > EPROG PAGE 0 .gblinit: {} > EPROG PAGE 0 frt: {} > EPROG PAGE 0 .text: {} > EPROG PAGE 0 .cinit: {} > EPROG PAGE 0 .pinit: {} > EPROG PAGE 0 .sysinit: {} > EPROG PAGE 0 .bss: {} > IDATA PAGE 1 .far: {} > IDATA PAGE 1 .const: {} > IDATA PAGE 1 .switch: {} > IDATA PAGE 1 .sysmem: {} > IDATA PAGE 1 .cio: {} > IDATA PAGE 1 .MEM$obj: {} > IDATA PAGE 1 .sysheap: {} > IDATA PAGE 1 .stack: {} > IDATA PAGE 1 } 4.3 小结 重叠相加法和重叠保留法计算分段卷积与线性卷积完全相同,且能很好的解决实际工程中利用快速线性卷积变换经常会遇到的以下问题:(1)需要对那个短序列补充很多零点,从而导致计算量和需要的存储空间无谓的增加;(2)需要获得所有的输入序列,并完全进行处理后,输出序列才是有效的,因此整个系统必然存在较大的延时,不能符合实时处理的要求;(3)实际上,当两个序列长度差距较大时,快速卷积的优势并不能体现出来,从而无法达到信号实时处理的要求。分段卷积快速算法模块,在DSP中采用流水线结构进行实时处理,经检验该方法正确且能很好地满足对信号进行实时处理的要求。 27 北华航天工业学院毕业论文 第5章 课题特点 5.1 MATLAB仿真和DSP实现 MATLAB将一个优秀软件的易用性与可靠性、通用性与专业性 、一般目的的应用与高深的科学技术应用有机的相结合。MATLAB是一种直译式的高级语言,比其它程序设计语言容易。它集科学计算、图象处理;声音处理于一身,并提供了丰富的Windows图形界面设计方法。 MATLAB语言是功能强大的计算机高级语言,它以超群的风格与性能风靡全世界,成功地应用于各工程学科的研究领域。 在具体编程实现某个DSP算法之前,一般首先需要对其进行模拟仿真。MATLAB目前已经成为非常优秀的仿真工具、现行的版本已经包含了许多强大的工具软件包。被各个学科广泛使用。单独使用MATLAB语言就可以实现C、FORTRAN等语言的许多功能,并且实现起来更加简洁方便,同时它也提供同C语言的接口。 5.2 采用时域卷积和FFT变换两种方案 为了解决在实际过程中线性卷积会遇到的无法满足实时性要求的问题,可采用分段卷积方案,分段卷积可采用两种方案:(1)采用是与直接卷积方法;(2)采用FFT变换得到Y(K),再进行IFFT得到y(n)。 5.3 C语言和汇编语言混合编程 用C语言开发DSP程序不仅使DSP开发的速度大大加快,而且开发出来的DSP程序的可读性和可移植性都大大增加,程序修改也极为方便。虽然C编译器的优化功能可以使C代码的效率大大增加,但在某些情况下,C代码的效率还是无法与手工编写的汇编代码的效率相比,如FFT程序。此外,用C语言实现DSP芯片的某些硬件控制也不如汇编程序方便,有些甚至无法用C语言实现。因此,在很多情况下,DSP应用程序往往需要用C语言和汇编语言的混合编程方法来实现,以达到最佳地利用DSP芯片软硬件资源的目的。 用C语言和汇编语言的混合编程方法主要有以下三种: (1)独立编写C程序和汇编程序,分开编译或汇编形成各自的目标代码模块,然后用链接器将C模块和汇编模块链接起来。 (2)直接在C语言程序的相应位置嵌入汇编语句; (3)对C程序进行编译生成相应的汇编程序,然后对汇编程序进行手工优化和修改。 本设计采用第一种方法。 28 北华航天工业学院毕业论文 第6章 结论 分段卷积方法是实际数字信号处理中经常用到的方法。它能够灵活的计算长输入序列对IIR的滤波响应,并且不会引入很大的延时,通常可以节约%50的计算时间,因此是一种很有效的方法。 利用重叠相加法和重叠保留法计算分段卷积的结果不但与线性卷积结果相同。而且很好地解决了常用的线性卷积方法要求两个输入序列的持续时间相同, 但在实际工程中经常会遇到某个输入序列具有较长持续时间的情况,从而无法达到信号实时处理的要求的问题。经检验该方法正确且能很好地满足对信号进行实时处理的要求。 重叠相加法和重叠保留法都是应用DFT求线性卷积的方法,之所以会改进直接计算线性卷积的时间复杂度,就是因为DFT的快速算法。两种算法都是对原序列进行分组,进行循环卷积后再组合,有相同的时间复杂度,但在执行过程和应用范围上还是有一定的区别。重叠相加法是对已知的有限长序列进行分段后与系统序列循环卷积,组合时去掉每段后面重叠的部分;重叠保留法是通过对输出序列进行分段后导出的一种线性卷积方法,分段前对原序列前面进行添零,分段循环卷积后将每段后面未重叠的一部分保留后组合。 两个程序在分段上有差异,但都是对截断的序列进行循环卷积,因而有一定的通用性。在进行本设计的编程上,最主要的是理解两种方法实现的过程,在对数据处理时要注意各个数据的含义和数组的组合过程。 在编程过程中,我曾多次遇到数据长度不匹配的提醒,通常是数组长度后少添了或多添了常数,这种错误必须比对方法的定义耐心仔细的寻找。在数组的组合上本人认为是很有技巧的,力求明确简单,必须经过多次的尝试才能得出较为理想的方式。 29 北华航天工业学院毕业论文 致 谢 本文研究工作是在我的导师李利教授的指导和悉心关怀下完成的,从开题到论文结束,我的导师李利教授给与了我极大的帮助,才是我的设计得以在规定的期限内完成。导师严谨的治学态度、渊博的各科知识、无私的奉献精神使我受益匪浅为我今后的学习打下了坚实基础。尤其是导师认真负责的态度让我钦佩不已。在此我要向我的导师李利教授致以最衷心的感谢和深深的敬意! 衷心感谢在百忙之中评阅论文和参加答辩的各位专家、教授。 30 参考文献 [1] ProakisJ G,Manolakis D G.Introduction to Digital Signal Processing[M].New York:Macmillan Publishing Company,1988. [2] Sophocles J O.Introduction to Signal Processing[M].Prentice-Hall,1996. [3] 胡广书.数字信号处理[M].北京:清华大学出版社,2004. [4] 邵朝,阴亚芳,卢光跃。数字信号处理[M].北京:北京邮电大学出版社,2003. [5] 刘敏,魏玲.Matlab通信仿真与应用[M].北京:国防工业出版社,2001. [6] 张志涌.精通Matlab6.5版[M].北京:北京航空航天大学出版社,2003. [7] 潘炳松,许明,潘锦.DDS芯片AD9852及其应用[J].电子技术,2002(4):46- 48. [8] 曾芳,李勇.基于DDS芯片AD9852的正弦信号发生器及其在通信中的应用[J].电子测量技术,2007,30(9):150-152. [9] 陈风,波冒燕,李海鸿.基于FPGA的直接数字频率合成器的设计[J].微计算机信息,2006(2):189-190. [10] 赖昭胜,管立新.基于DSP Builder的DDS实现及其应用[J].微计算机信息, 2006(11Z):186-188. [11] 李金晶,蔡雪君,李杰.基于软核Nios的宽谱正弦发生器设计[EB/OL].http://w ww.a-ltera.com.cn/education/univ/local/events/articles/march-01.pdf,2008.2.10 [12] 刘晨,王森章.直接数字频率合成器的设计及FPGA实现[J].微电子与计算机, 2004,21(5):63-65. [13] 王玉萍,付源.基于DSP Builder的DDS设计与应用[J].煤炭技术,2006,25(4): 26-28. 31 附录 FFT代码 #include #define N 8 //64 输入样本总数 #define M 3 //DFT运算层数 //2^m=N #define PI 3.1415926 float twiddle[N/2] = {1.0, 0.707, 0.0, -0.707}; float x_r[N] = {1, 1, 1, 1, 0, 0, 0, 0}; //输入数据,此处设为8个float x_i[N]; //N=8 /** * 初始化输出虚部 */ static void fft_init( void ) { int i; for(i=0; i static void bitrev( void ) { int p=1, q, i; int bit_rev[ N ]; float xx_r[ N ]; bit_rev[ 0 ] = 0; while( p < N ) { for(q=0; q bit_rev[ q ] = bit_rev[ q ] * 2; 32 bit_rev[ q + p ] = bit_rev[ q ] + 1; } p *= 2; } for(i=0; i { fp = fopen(\"log2.txt\此处 int cur_layer, gr_num, i, k, p; //cur_layer代表正要计算的当前层,gr_num代表当前层的颗粒数 float tmp_real, tmp_imag, temp; // 临时变量, 记录实部 float tw1, tw2;// 旋转因子,tw1为旋转因子的实部cos部分, tw2为旋转因子的虚部sin部分. int step; // 步进 int sample_num; // 颗粒的样本总数(各层不同, 因为各层颗粒的输入不同) /* 对层循环 */ for(cur_layer=1; cur_layer<=M; cur_layer++) { /* 求当前层拥有多少个颗粒(gr_num) */ gr_num = 1; i = M - cur_layer; while(i > 0) { i--; gr_num *= 2; } /* 每个颗粒的输入样本数N' */ sample_num = (int)pow(2, cur_layer); /* 步进. 步进是N'/2 */ step = sample_num/2; /* */ k = 0; /* 对颗粒进行循环 */ for(i=0; i /* * 对样本点进行循环, 注意上限和步进 */ for(p=0; p tw1 = cos(2*PI*p/pow(2, cur_layer)); tw2 = -sin(2*PI*p/pow(2, cur_layer)); tmp_real = x_r[k+p]; tmp_imag = x_i[k+p]; temp = x_r[k+p+step]; /* 蝶形算法 */ x_r[k+p] = tmp_real + ( tw1*x_r[k+p+step] - tw2*x_i[k+p+step] ); x_i[k+p] = tmp_imag + ( tw2*x_r[k+p+step] + tw1*x_i[k+p+step] ); /* X[k] = A(k)+WB(k) * X[k+N/2] = A(k)-WB(k) 的性质可以优化这里*/ /*旋转因子, 需要优化... tw1 = cos(2*PI*(p+step)/pow(2, cur_layer)); tw2 = -sin(2*PI*(p+step)/pow(2, cur_layer)); x_r[k+p+step] = tmp_real + ( tw1*temp - tw2*x_i[k+p+step] ); x_i[k+p+step] = tmp_imag + ( tw2*temp + tw1*x_i[k+p+step] );*/ x_r[k+p+step] = tmp_real - ( tw1* temp - tw2*x_i[k+p+step] ); x_i[k+p+step] = tmp_imag - ( tw2* temp + tw1*x_i[k+p+step] ); printf(\"k=%d, x_r[k]=%f, x_i[k]=%f\\n\ printf(\"k=%d, x_r[k]=%f, x_i[k]=%f\\n\ } /* 开跳!:) */ k += 2*step; } } } void display( void ) { printf(\"\\n\\n\"); int i; for(i=0; i int main( void ) 34 { fft_init( ); //初始化 bitrev( ); //将输入直接按FFT计算要求排序,如8点FFT计算,排序为x[0]、x[4]、x[2]、x[6]、x[1]、x[5]、x[3]、x[7] fft( ); //进行FFT计算 display( ); //显示计算结果 system( \"pause\" ); return 1; } 35 北华航天工业学院 本科毕业设计(论文)成绩单 姓名 系别 指导教师 设计(论文)题目 李利 霍金凤 班级 电子工程系 职称 教授 B08233 学号 专业 设计(论文)起止时间 20084023319 入学时间 通信 2012.3.19~2012.6.15 2008.9 分段卷积的MATLAB仿真与DSP实现 指导 教师 评语 成绩1 指导教师签名 年 月 日 评阅 验收 小组 评语 成绩2 评阅人签名 年 月 日 答辩 小组 评语 成绩3 答辩小组负责人签名 年 月 日 综合 评定 成绩 答辩委员会主任签字: 单位(公章) 年 月 日 36 因篇幅问题不能全部显示,请点此查看更多更全内容