数字信号处理的课程设计.docx
- 文档编号:27207179
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:19
- 大小:156.05KB
数字信号处理的课程设计.docx
《数字信号处理的课程设计.docx》由会员分享,可在线阅读,更多相关《数字信号处理的课程设计.docx(19页珍藏版)》请在冰豆网上搜索。
数字信号处理的课程设计
摘要
序列x(n)的DFT为X(k),则x(n)的实部和虚部(包括j)的DFT分别为X(k)的共轭反对称分量和共轭对称分量;而x(n)的共轭反对称分量和共轭对称分量的DFT分别为X(k)的实部和虚部乘以j。
快速傅里叶变换FFT是实现DFT的一种快速算法,利用FFT可以大大减少运算量。
然而一般讨论的FFT都是基于复数序列的,在实际应用中,经常遇到的是求实数序列的DFT.利用DFT的共轭对称性,用一个N点FFT的程序来计算两个N点实数序列的DFT.这样不仅是一种高效的FFT算法,而且还减少了FFT运算时所必须的存储量和运算时间。
关键字:
DFT,对称性,FFT,Matlab
1MATLAB基本操作及常用命令介绍
1.1MATLAB的启动
启动MATLAB有多种方式,最常用的方法就是双击系统桌面的MATLAB图标,也可以在开始菜单的程序选项中选择MATLAB快捷方式。
初次启动MATLAB后,将进入MATLAB默认设置的桌面平台。
1.2桌面平台
默认设置情况下的桌面平台包括6个窗口,分别是MATLAB主窗口、命令窗口、历史窗口、当前目录窗口、发行说明书窗口和工作间管理窗口。
下面分别对各窗口做简单介绍。
(1)MATLAB主窗口,与MATLAB的早期版本不同的是,MATLAB6.1增加了一个主窗口,其他的几个窗口都包含在这个大的主窗口中。
(2)命令窗口,在主窗口的“View”菜单下选择“CommandWindow”命令,可以打开或关闭MATLAB的命令窗口。
其中“>>”为运算提示符,表示MATLAB正处在准备状态。
当在提示符后输入一段运算式并按Enter键后,MATLAB将给出计算结果,然后再次进入准备状态。
(3)工作间窗口,在主窗口的“View”菜单下选择“Workspace”命令,可以打开或关闭MATLAB的工作间窗口,工作间窗口是MATLAB的重要组成部分。
MATLAB的程序类型有三种
(1)脚本M文件:
在命令窗口中输入并执行,它所用的变量都要在工作空间中获取,不需要输入输出参数的调用,退出MATLAB后就释放了。
(2)程序M文件:
以.m格式进行存取,包含一连串的MATLAB指令和必要的注解。
需要在工作空间中创建并获取变量,也就是说处理的数据为命令窗口中的数据,没有输入参数,也不会返回参数。
程序运行时只需在命令窗口中键入其名称即可(不需要后缀名)。
(3)函数M文件(常称为M函数):
与在命令窗口中输入命令一样,函数接受输入参数,然后执行并输出结果。
用help命令可以显示它的注释说明。
M函数具有标准的基本结构:
1)函数定义行(关键字function)
function[out1,out2,..]=filename(in1,in2,..)输入和输出(返回)的参数个数分别由nargin和nargout两个MATLAB保的变量来给出。
2)第一行帮助行以(%)开头,作为lookfor指令搜索的行
3)函数体说明及有关注解以(%)开头,用以说明函数的作用及有关内容
4)函数体语句:
函数体内使用的除返回和输入变量这些在function语句中直接引用的变量以外的所有变量都是局部变量,即在该函数返回之后,这些变量会自动在MATLAB的工作空间中清除掉。
如果希望这些中间变量成为在整个程序中都起作用的变量,则可以将它们设置为全局变量。
1.3基本平面图形绘制命令plot
1)plot(X,Y)%当X,Y均为实数向量,且为同维向量,则以x的元素为横坐标,y的元素为纵坐标,绘制曲线。
若X,Y均为同维同型实数矩阵,X=[X(i)],Y=[Y(i)],其中X(i),Y(i)为列向量,则plot(X,Y)依次画出plot(X(i),Y(i)),矩阵有几列就有几条线;
2)plot(X1,Y1,X2,Y2,…),其中Xi与Yi成对出现,plot(X1,Y1,X2,Y2,…)将分别按顺序取两数据Xi与Yi进行画图。
3)plot(X1,Y1,LineSpec1,X2,Y2,LineSpec2…)将按顺序分别画出由三参数定义Xi,Yi,LineSpeci的线条。
其中参数LineSpeci指明了线条的类型,标记符
2理论分析
2.1实验内容
1)编写程序验证DFT的正确性
2)利用DFT的对称性用一次FFT实现两个序列的FFT变换
2.2序列对称性的理论验证
长度为
的有限长序列
若满足
(1.1)
称序列
为共轭对称序列,一般用
来表示。
若满足
(1.2)
称序列
为共轭反对称序列,一般用
来表示
把
代入式(1.1)与式(1.2),得
(1.3)
(1.4)
式(1.3)与式(1.4)说明共轭对称序列与其共轭序列以
成偶对称,共轭反对称序列与其共轭序列
成奇对称
设一长度为
的有限长序列
,令
(1.5)
(1.6)
则有
(1.7)
说明任一有限长序列,都表示成一个共轭对称序列与共轭反对称序列的和,
称为
的共轭对称分量,
称为
的共轭反对称分量。
在频域下同样有类似结论
(1.8)
式中
(1.9)
(1.10)
结论:
如果序列x(n)的DFT为X(k),则x(n)的实部和虚部(包括j)的DFT分别为X(k)的共轭反对称分量和共轭对称分量;而x(n)的共轭反对称分量和共轭对称分量的DFT分别为X(k)的实部和虚部乘以j。
3程序验证
%定义分解函数
function[xec,xoc]=xhfenjie(x)%
%
%该函数实现将信号分解为奇分量和偶分量的功能
%x为输入信号序列
%xec为奇分量序列
%xoc为偶分量序列
%
%首先进行判别
ifany(imag(x)~=0)
error('x不是实序列');
end
%进行信号分解
N=length(x);
n=0:
N-1;
xec=0.5*(x+x(mod(-n,N)+1));
xoc=0.5*(x-x(mod(-n,N)+1));
%定义傅里叶变换DFT函数
function[Xk]=dft(xn,N)
%
%计算离散傅里叶变换
%Xk为在0<=n<=N-1间的DFT系数数组
%xn为N点有限持续时间序列
%N为DFT的长度
%
n=0:
N-1;
k=0:
N-1;
WN=exp(-j*2*pi/N);
nk=n'*k;
WNnk=WN.^nk;
Xk=xn*WNnk;
%初始化序列
n=0:
10;
x=5*(0.4).^n;
[xec,xoc]=xhfenjie(x);
%绘制计算结果
figure
(1)
stem(n,xec);
title('循环偶分量');
xlabel('n');
ylabel('xec');
axis([-0.510.5-0.55.5]);
hold;
plot([010],[00]);
holdoff;
figure
(2)
stem(n,xoc);
title('循环奇分量');
xlabel('n');
ylabel('xoc');
axis([-0.510.5-2.32.3]);
hold;
plot([010],[00]);
holdoff;
%对各个序列进行DFT变换
X=dft(x,11);
Xec=dft(xec,11);
Xoc=dft(xoc,11);
%绘制计算结果
figure
(1)
subplot(2,1,1)
stem(n,real(X));
title('输入序列DFT的实部');
xlabel('k');
axis([-0.510.5-0.510.5]);
hold;
plot([010],[00]);
holdoff;
subplot(2,1,2)
stem(n,imag(X));
title('输入序列DFT的虚部');
xlabel('k');
axis([-0.510.5-44]);
hold;
plot([010],[00]);
holdoff;
figure
(2)
subplot(2,1,1)
stem(n,real(Xec));
title('偶分量的实部');
xlabel('k');
axis([-0.510.5-0.510.5]);
hold;
plot([010],[00]);
holdoff;
subplot(2,1,2);
stem(n,real(Xec));
title('偶分量的虚部');
xlabel('k');
axis([-0.510.5-0.510.5]);
hold;
plot([010],[00]);
holdoff;
figure(3)
subplot(2,1,1)
stem(n,real(Xoc));
title('奇分量的实部');
xlabel('k');
axis([-0.510.5-15.5e-155.5e-15]);
hold;
plot([010],[00]);
holdoff;
subplot(2,1,2)
stem(n,imag(Xoc));
title('奇分量的虚部');
xlabel('k');
axis([-0.510.5-44]);
hold;
plot([010],[00]);
holdoff;
4结果分析
如下图所示,任一有限长序列,都可以表示成一个共轭对称序列与共轭反对称序列的和,也称循环偶分量和循环奇分量。
其中xec表示x(n)的共轭对称分量,xoc表示x(n)的共轭反对称分量。
图4-1循环偶分量示意图
图4-2循环奇分量示意图
共轭对称序列满足:
共轭反对称序列满足:
图4-3输入序列的实部与虚部
上图说明:
共轭对称序列与其共轭序列以
成偶对称,共轭反对称序列与其共轭序列
成奇对称。
图4-4偶分量的实部与虚部
比较图a和上图中的复序列实数部分的离散傅里叶变换是原来序列离散傅里叶变换的共轭对称分量;复序列虚数部分的离散傅里叶变换是原来序列离散傅里叶变换的共轭反对称分量。
图4-5奇分量的实部与虚部
复序列共轭对称分量序列的离散傅里叶变换是原来序列离散傅里叶变换的实数部分;复序列共轭对称分量的离散傅里叶变换是原来序列离散傅里叶变换的虚数部分。
5对称性的应用
5.1FFT算法的基本思想
仔细考察DFT与IDFT的运算发现,利用以下两个特性可减少运算量:
1)系数
是一个周期函数,它的周期性和对称性可利用来改进运算,提高计算效率。
,又如
利用这些周期性和对称性,DFT运算中有些项可合并;
2)利用
的周期性和对称性,把长度为N点的大点数的DFT运算分解为若干个小点数的DFT。
因为DFT的计算量正比于
,N小,计算量也就小。
FFT算法正是基于这样的基本思想发展起来的。
它有多种形式,但基本上可分为两类:
时间抽取法和频率抽取法。
按时间抽取的FFT(N点DFT运算的分解):
先从一个特殊情况开始,假定N是2的整数次方,N=2M,M:
正整数。
将N点的DFT分解为两个N/2点的DFT:
首先将序列x(n)分解为两组,一组为偶数项,一组为奇数项
将DFT运算也相应分为两组:
其中
和
分别是
和
的N/2点DFT。
可见,一个N点的DFT可以分解为两个N/2点的DFT,这两个N/2点的DFT再按照上面
(1)式合成为一个N点DFT,注意到,
,
有N/2个点,即k=0,1,…,N/2-1,由
(1)式得到X(k)只有N/2点,而实际上
有N个点,即k=0,1,…,N-1,要用
,
表示全部
值,还必须应用系数w的周期性和对称性。
快速傅里叶变换FFT是实现DFT的一种快速算法,利用FFT可以大大减少运算量。
然而一般讨论的FFT都是基于复数序列的,在实际应用中,经常遇到的是求实数序列的DFT.利用DFT的共轭对称性,用一个N点FFT的程序来计算两个N点实数序列的DFT.这样不仅是一种高效的FFT算法,而且还减少了FFT运算时所必须的存储量和运算时间。
具体做法如下:
设
与
都为N点实数序列,它们的离散傅里叶变换分别为
与
.构造一个新的复数序列为
x(n)=
+j
然后利用复数序列FFT程序计算
X(k)=DFT[x(n)]=DFT[
]+DFT[j
]
=
+j
利用DFT的共轭对称性得
=Xep(k)=1/2[X(k)+X*(N-k)]
=-jXep(k)-1/2[X(k)-X*(N-k)]
5.2对称性应用的程序实现
程序实现如下:
N=8;n=0:
N-1;k=0:
N-1;
x=[0,3,6,5,4,3,2,1];
n1=mod(N-n,N);
xep=(x+x(n1+1))/2;
xop=(x-x(n1+1))/2;
figure
(1);
subplot(311);stem(n,x);xlabel('n');ylabel('x(n)');
subplot(312);stem(n,xep);xlabel('n');ylabel('xep(n)');
subplot(313);stem(n,xop);xlabel('n');ylabel('xop(n)');
xk=fft(x,N);
rexk=real(xk);
imxk=imag(xk);
xn1=ifft(rexk);
xn2=ifft(imxk);
figure
(2);
subplot(211);stem(k,abs(rexk));xlabel('k');ylabel('|reX(k)|');
subplot(212);stem(k,abs(imxk));xlabel('k');ylabel('|imX(k)|');
figure(3);
subplot(211);stem(n,xn1);xlabel('n');ylabel('xn1');
subplot(212);stem(n,xn2);xlabel('n');ylabel('xn2');
在MATLAB中仿真,其仿真结果如下图:
图5-1实数序列的奇偶分量表示
图5-2两个实数序列
图5-3两个序列的DFT变换
上述程序的思想是:
将一个实数序列分解成共轭对称分量和共轭反对称分量,分别表示原序列x(n)的实部和虚部,用快速傅里叶变换FFT求出原序列的傅里叶变换,则傅里叶变换的实部表示的是共轭对称分量的傅里叶变换,虚部表示共轭反对称分量的傅里叶变换,再用逆傅里叶变换求出其时域表达式
和
,即用一次FFT变换实现了两个序列的DFT变换。
6心得体会
通过这两个星期数字信号处理的课程设计,我对这门课程有了更进一步的了解。
这次课程设计利用了MATLAB编程对傅里叶变换DFT的对称性进行了验证,并利用对称性这一性质说明DFT在计算FFT时可大大减少计算量,用一次FFT即可实现两个序列的FFT运算,从而实现了整体设计。
用新的语言去解决工程问题根本不需要先掌握某一门语言,有效的方法是先了解那门语言的一些基本函数,然后熟悉界面,就可以开始编了。
拿到一个课题,不要急于坐在电脑前开始编程,因为当你坐在电脑前都不知道该干什么时,你就是对课题了解得不够。
你首先需要的是透彻分析课题,把你要解决的问题写下来和列出各种可能情况。
接下来,就考虑看用什么样的算法去解决,等到这一切都定下来后就可以开始着手编程了,如果你不熟悉语言的话,过程中会碰到很多问题,例如,不知道用什么样的函数去实现,这时你就可以根据实际情况去找资料,看帮助文件。
等到程序完成后,调试是非常关键的一步,看到出错没有关系,利用debug去分析,相信一定可以找到问题的所在,然后逐个改正。
经过这么一次以后,你会发现,你已经对本来不熟悉的语言已经有了很大的了解,而且可以解决实际问题,这样你就不会觉得学语言很枯燥,而是觉得很有趣。
相信经过多次反复,一定可以很快掌握一门语言的基本技巧。
本次课设与信号与系统该门知识有关,所以必须掌握该课的基本知识,还要学会怎样利用MATLAB软件和实际结合起来,解决信号与系统中的问题。
通过理论与实际的结合,可以更好的掌握该门学科知识,为后一阶段的进一步学习打下好的基础,同时,通过本次强化训练看出自己运用该软件的不熟练,可以及时的调整自己,认真学号怎样使用该软件以及掌握该门学科。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,由于此次课设我们用到了单片机的相关知识,虽然我们还未学过相关课程。
但我们通过此次课设积极主动去查阅相关资料并向其他同学和学长请教,学到了不少东西,在这个过程中与其他同学积极探讨,培养了我的团队协作精神。
这就是我在这次课程设计中的最大收获。
参考文献
[1]刘泉,江雪梅编.信号与系统.北京:
高等教育出版社,2006.
[2]范世贵编.信号与系统常见题型解析及模拟题.西安:
西北工业大学出版社,1999.
[3]赵红怡,张常年编著.数字信号处理及其MATLAB实现.化学工业出版社.
[4]薛定宇,陈阳泉编.基于MATLAB/Simulink的系统仿真技术与应用.北京:
清华大学出版社,2002.
[5]梁虹,普园媛,梁洁编.信号与线性系统分析基于MATLAB的方法与实现.北京:
高等教育出版社,2006.
[6]程佩青.数字信号处理教程(第二版).北京:
清华大学出版社,2001.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字信号 处理 课程设计