云南大学信息学院数字信号处理期末论文基于MATLAB的子带离散傅里叶变换.docx
《云南大学信息学院数字信号处理期末论文基于MATLAB的子带离散傅里叶变换.docx》由会员分享,可在线阅读,更多相关《云南大学信息学院数字信号处理期末论文基于MATLAB的子带离散傅里叶变换.docx(12页珍藏版)》请在冰豆网上搜索。
云南大学信息学院数字信号处理期末论文基于MATLAB的子带离散傅里叶变换
数字信号处理综合实验报告
基于MATLAB的子带离散傅里叶变换
学院信息学院
专业电子信息工程
摘要
在当今的通信信号的传输中,数字信号以其自身简单、适用及保密性强等优势受到越来越多的青睐,于此相关的,对数字信号的处理也就显得越来越重要了。
数字信号处理就是用数值计算的方式对信号进行加工的理论和技术,英文原名叫digitalsignalprocessing,简称DSP。
数字信号处理的目的是对真实世界的连续模拟信号进行测量或滤波。
因此在进行数字信号处理之前需要将信号从模拟域转换到数字域,这通常通过模数转换器实现。
而数字信号处理的输出经常也要变换到模拟域,这是通过数模转换器实现的,数字信号处理的过程中经常要用到离散傅里叶变换(DFT)。
离散傅里叶变换(DFT),是傅里叶变换在时域和频域上都呈现离散的形式,将时域信号的采样变换为在离散时间傅里叶变换(DTFT)频域的采样。
在形式上,变换两端(时域和频域上)的序列是有限长的,而实际上这两组序列都应当被认为是离散周期信号的主值序列。
即使对有限长的离散信号作DFT,也应当将其看作经过周期延拓成为周期信号再作变换。
本实验基于MATLAB研究子带离散傅里叶变换,先要产生一个64长的离散序列,通过离散傅里叶变换的相关算法,画出其二级子带离散傅里叶变换和四级子带离散傅里叶变换的MATLAB图,将二级算法和四级算法得到的结果与对原序列直接用fft得到的离散傅里叶变换作比较。
关键字:
数字信号处理、离散傅里叶变换、MATLAB
一实验目的
编写MATLAB程序,产生一个长度为64的实序列,然后分别用用二级子带离散傅里叶变换程序和四级子带傅里叶变换确定其近似的离散傅里叶变换,将离散傅里叶变换得到的图像与直接用fft函数画出的离散傅里叶变换图像做比较并对结果进行评论。
二实验原理
2.1子带离散傅里叶变换简介
长度为N的序列
,其N点离散傅里叶变换为
,
可由单位圆上的等间隔点z变换
给出:
(1)
其中
。
子带离散傅里叶变换(SB-DFT)算法,可用于近似长度为2的整数次幂的序列的频率范围的一个或多个部分的离散傅里叶变换。
为了说明此方法的思想,首先按照
(2)
即将
分解为两个长度为
的子序列
。
的z变换
可表示为
(3)
其中
的z变换。
的N点离散傅里叶变换
可另外表示为
(4)
其中
分别是子序列
的N/2点离散傅里叶变换。
。
上式(4)即为离散傅里叶变换的子带离散傅里叶变换。
式(4)也可以写成矩阵的形式
(5)
其中
是2x2的哈达玛矩阵。
重复该过程,得到一个二级算法为
(6)
其中,
是4x4的哈达玛矩阵,而
等是N/4点离散傅里叶变换。
通过消除可忽略能量频带的计算,可以简化离散傅立叶变换的算法,例如,对一个基本上是低频成分的序列
,假定
是一个实值序列,通过式(4)消除
的贡献,可得到一个近似离散傅立叶变换:
(7)
同理,对于四级算法,可近似为:
(8)
在算出
后,在本实验中,计算出子带傅里叶变换的均方误差,比较二级算法和四级算法的误差大小来对算法进行评价。
均方误差定义为
其中,
表示用对原序列用fft函数计算出的离散傅里叶变换,
表示用子带傅里叶变换计算出的值。
简而言之,二级子带傅里叶变换就是将产生的长度为64的序列按公式
(2)分为
两部分,分别计算出离散傅里叶变换,再按公式(4)求出它的子带离散傅里叶变换。
四级子带傅里叶变换就是将二级时得到的
再细分为
四个部分,分别计算出离散傅里叶变换,再用公式(6)计算出四级子带离散傅里叶,并比较误差做出评价。
三实验设计
3.1流程图
图1实验流程图
3.2程序
3.2.1二级算法
%二阶
%产生序列
clc
l=0:
63;
x=0.8.^l;
figure,stem(x);title('序列x[n]');
y=fft(x);
figure,subplot(2,1,1)
stem(y);title('x[n]的离散傅里叶变换');
N=length(x);
%分成两级
p=1:
32;
gL=0.5*(x(2*p)+x(2*p-1));
gH=0.5*(x(2*p)-x(2*p-1));
GL=fft(gL);
GH=fft(gH);
%子带离散傅里叶变换部分
k=0:
(N-1);
n=mod(k,N/2);
GLK=GL(n+1);
GHK=GH(n+1);
w=exp(-1i*2*pi*k/N);
X=zeros(1,length(w));
forq=1:
length(w);
X(q)=(1+w(q))*GLK(q);
subplot(2,1,2)
stem(X);title('x[n]的二级子带离散傅里叶变换');
End
forq=1:
length(w);
c=0;
c=c+(y(q)-X(q)).^2;
end
error=abs(c)
图2二级算法结果
error=
6.2457e-04
3.2.2四级算法
%四阶
%产生序列
clc
l=0:
63;
x=0.8.^l;
figure,stem(x);title('序列x[n]');
y=fft(x);
figure,subplot(2,1,1)
stem(y);title('x[n]的离散傅里叶变换')
N=length(x);
%分成两级
p=1:
32;
gL=0.5*(x(2*p)+x(2*p-1));
gH=0.5*(x(2*p)-x(2*p-1));
i=1:
16;
gLL=0.5.*(gL(2*i)+gL(2*i-1));
gLH=0.5.*(gL(2*i)-gL(2*i-1));
gHL=0.5.*(gH(2*i)+gH(2*i-1));
gHH=0.5.*(gH(2*i)-gH(2*i-1));
GLL=fft(gLL);
GLH=fft(gLH);
GHL=fft(gHL);
GHH=fft(gHH);
%子带离散傅里叶变换部分
k=0:
N-1;
n=mod(k,N/4);
GLLK=GLL(n+1)
GLHK=GLH(n+1);
GHLK=GHL(n+1);
GHHK=GHH(n+1);
w=exp(-1i*2*pi*k/N);
X=zeros(1,length(w));
forq=1:
length(w);
X(q)=(1+w(q)+w(q).^2+w(q).^3)*GLLK(q)+(1+w(q)+w(q).^2+w(q).^3)*GHLK(q);
subplot(2,1,2);
stem(X);title('x[n]四级子带离散傅里叶变换');
end
forq=1:
length(w);
c=0;
c=c+(y(q)-X(q)).^2;
end
error=abs(c)
图3四级算法结果
error=
0.2735
四实验结果与分析
从图2可以看出,在用二级子带离散傅里叶算法进行近似拟合时,使用公式(7)进行近似计算,舍去高频部分,消除
的影响,由于二级算法将原序列分成了两个部分,得出的结果与直接用fft函数画出的图相比较,在n=32处有一个微小的跳动。
同理,在四级算法中,用式(8)进行近似计算,用于四级算法把原序列分成了四个部分,所以在n=16,n=32,n=48三个点都出现了微小的跳动。
同时,通过误差可以看出,四级算法的误差远大于二级算法,由此可以得出一个结论,在子带离散傅里叶变换中,级数越高,近似计算出的离散傅里叶变换与结果之间的误差越大。
五参考文献
[1]SanjitK.Mitra著,余翔宇译数字信号处理-基于计算机的方法(第四版)[M]北京电子工业出版社2012年1月版
[2]SanjitK.Mitra著,孙洪余翔宇译数字信号处理实验指导书(MATLAB版)[M]北京电子工业出版社2010年1月版