第一篇:数字信号处理实验二
北京信息科技大学
数字信号处理实验报告
题 目:
数字信号处理课程设计实验
学 院: 信息与通信工程学院 专 业: 通信工程专业 姓 名: 班 级:
学 号: 指导老师:
实验目的
1、熟悉IIR数字滤波器的设计原理与方法。
2、掌握数字滤波器的计算机软件实现方法。
3、通过观察对实际心电图信号的滤波作用,学习数字滤波器在实际中的应用。
实验仪器及材料
计算机,MATLAB软件
实验内容及要求
1.设计巴特沃斯低通数字滤波器对人体心电信号进行滤波
(1)人体心电图信号在测量过程中会受到工业高频干扰,所以必须经过低通滤波处理,才能作为判断心脏功能的有用信息。以下为一个实际心电图信号采样序列x(n),其中存在高频干扰,抽样周期Ts=1秒。在实验中,以x(n)作为输入序列,滤除其中干扰成分。
x(n)=[-4,-2,0,-4,-6,-4,-2,-4,-6,-6,-4,-4,-6,-6,-2,6,12,8,0,-16,-38,-60,-84,-90,-66,-32,-4,-2,-4,8,12,12,10,6,6,6,4,0,0,0,0,0,-2,-4,0,0,0,-2,-2,0,0,-2,-2,-2,-2,0] 对序列x(n)用FFT做频谱分析,生成x(n)的频谱图。
(2)设计一个巴特沃斯低通IIR数字滤波器H(z)。
设计指标参数为:在通带内频率低于0.2π时,最大衰减小于1dB; 在阻带内 [0.3π, π]频率区间上,最小衰减大于15dB。
j|H(e)|。写出数字滤波器H(z)的表达式,画出滤波器的幅频响应曲线
(3)用所设计的滤波器对实际心电图信号采样序列x(n)进行滤波处理,编写程序,求滤波后的序列y(n),并分别画出滤波前后的心电图信号波形图和频谱图。
y(n)= [0,0,0,0, 0,0,0,0,-0.14025,0.40279,-0.56085 ,0.33328,0.023981,-0.18809,0.11843,-0.1038,0.11576,-0.1225,0.099815 ,-0.13769 ,0.095249,-0.0070273,0.018867,0.090543,-0.11257,-0.070884 ,0.17676,-0.55407,0.24813,-0.34732,-0.30428,0.59426,-0.29574,-0.063869,0.34018,-0.73334,1.0293,-0.57107,-0.2461,0.83605,-0.83026,0.45459,0.011551,-0.25667,0.23896,-0.17361,0.20829,-0.28417,0.28765 ,-0.2035,0.02865,0.066164,0.077916,-0.36052, 0.53517,-0.5571]
源程序
clear all,clc
x=[-4,-2,0,-4,-6,-4,-2,-4,-6,-6,-4,-4,-6,-6,-2,6,12,8,0,-16,-38,-60,-84,-90,-66,-32,-4,-2,-4,8,12,12,10,6,6,6,4,0,0,0,0,0,-2,-4,0,0,0,-2,-2,0,0,-2,-2,-2,-2,0];%未经滤波的心电图信号 L=length(x);l=0:L-1;
y=fft(x,L);Wp=0.2*pi;Ws=0.3*pi;Rp=1;Rs=15;
[N,Wn] = buttord(Wp,Ws,Rp,Rs,'s');[b,a] = butter(N,Wn,'s');[numa,dena]=impinvar(b,a,1);w=linspace(0,pi,1024);h=freqz(numa,dena,w);norm=max(abs(h));numa=numa/norm;[z,p]=tf2zp(b,a);figure(1)
plot(w,20*log10(abs(h)/norm));grid;
xlabel('数字频率');ylabel('幅度响应dB');figure(2)plot(w,abs(h));grid;
xlabel('数字频率');
ylabel('幅度响应|H(e^(jw))|');figure(3)zplane(z,p);xx=filter(b,a,x);yy=fft(xx,L);figure(4)subplot(2,1,1)stem(l,x);
title('未经滤波的心电图信号');xlabel('n');subplot(2,1,2)stem(l,xx);
title('经滤波之后的心电图信号');xlabel('n');figure(5)subplot(2,1,1)plot(l,abs(y));
title('未经滤波的心电图信号的频谱');subplot(2,1,2)plot(l,abs(yy));
title('经滤波处理的心电图信号的频谱');
2.用help查看内部函数cheb1ord.m及cheby1.m,了解调用格式。
编程设计教材习题6-2,求模拟滤波器Ha(s)的表达式。
源程序
close all clear all clc
Wp=2*pi*3000;Rp=2;Ws=2*pi*12000;Rs=50;Fs=24000;
w=linspace(0,pi,1024);
[N,Wn]=cheb1ord(Wp,Ws,Rp,Rs,'s');e=sqrt(10^(Rp/10)-1);[b,a]=cheby1(N,e,Wn,'s')[numa,dena]=impinvar(b,a,Fs);h=freqz(numa,dena,w);norm=max(abs(h));
plot(w*Fs/pi,20*log10(abs(h)/norm))title('幅度响应')xlabel('频率(Hz)')ylabel('幅度(dB)')grid
3.模拟滤波器的数字化
用内部函数impinvar及bilinear实现教材习题6-5,求数字滤波器H(z)的表达式。
源程序
close all clear all clc b1=[0 0 1];a1=[1 1 1];b2=[0 0 1];a2=[2 3 1];
[numa1,dena1]=impinvar(b1,a1,0.5)[numa2,dena2]=bilinear(b1,a1,0.5)[numa3,dena3]=impinvar(b2,a2,0.5)
[numa4,dena4]=bilinear(b2,a2,0.5)
本实验所用的部分MATLAB函数
L=length(x):求序列x长度。
y=fft(x,L):将序列x(n)做L点快速傅立叶变换,结果赋给序列y(n)。 [n,Wn] = buttord(Wp,Ws,Rp,Rs,'s'):计算模拟Butterworth滤波器的最小阶次n和截止频率为Wn。
[b,a] = butter(n,Wn,'s'):设计模拟截止频率为Wn(rad/s)的n阶 Butterworth低通滤波器,返回值为模拟滤波器的系数。
y=filter(b,a,x): 将序列x(n)通过滤波器滤波后生成序列y(n),滤波器的分母多项式系数构成a向量,分子多项式系数构成b向量。
[BZ,AZ] = impinvar(B,A,Fs):冲激响应不变法,返回值为数字滤波器的系数。 [BZ,AZ] = bilinear(B,A,fs):双线性变换,返回值为数字滤波器的系数。 [H w]=freqz(b,a):由滤波器分母多项式系数构成的a向量和分子多项式系数构成的b向量求系统频响。
截图
实验体会
这次的实验让这让我看到了理论与实践相结合的优势与用处,让我受益匪浅。我认识到了自己理论知识的不足,也认识到了我们学习的基础知识究竟能运用于什么领域,如何运用。我们在老师的耐心指导下调试电路,直到得到要求的效果。让我们在学习电路、信号等理论知识的同时,明白如何把这些应用于实际。
第二篇:数字信号处理实验5
实验五 FFT 算法的应用
1.进一步加深对离散信号 DFT 的理解。
2.运用其 FFT 算法解决实际问题。
1.微机。
2.Matlab 编程环境。
1.熟悉 Matlab 的编程环境和编程语言。
2.学习教材 P213-227,P249-263,掌握快速傅里叶变换(FFT)的原理。
1.实验重点、难点、特点
快速傅里叶变换(FFT)的原理及应用。难点在 FFT 的应用以及 Matlab 编程中矩阵乘和数乘的应用。
2.实验原理
一、实验目的
二、实验仪器设备
三、实验学时 学时
四、预习要求
五、实验特点及实验原理简介
1.已知 2N 点实数序列
N=64。理论计算 X(k)=DFT[x(n)]2N。
六、实验内容及步骤
N=64;n=0:1:N-1;n2=0:1:2*N-1;k=0:1:2*N-1;xn1=cos(2*pi/N*7*2*n)+1/2*cos(2*pi/N*19*2*n);xn2=cos(2*pi/N*7*(2*n+1))+1/2*cos(2*pi/N*19*(2*n+1));wn=xn1+i*xn2;[wk,kk]=dft_my(wn,N);xk1=1/2*(wk+conj(wk(mod(-kk,N)+1)));xk2=1/2*(wk-conj(wk(mod(-kk,N)+1)))/i;XK1=fft(xn1,N);XK2=fft(xn2,N);%subplot(2,2,1);%stem(kk,abs(xk1));grid on;%subplot(2,2,3);%stem(kk,abs(XK1));grid on;%subplot(2,2,2);%stem(kk,abs(xk2));grid on;%subplot(2,2,4);%stem(kk,abs(XK2));grid on;
xk=[xk1+(exp(-1i*pi/N).^kk).*xk2,xk1-(exp(-1i*pi/N).^kk).*xk2];subplot(2,1,1);stem(k,abs(xk),'r');grid on;xlabel('k');ylabel('2*NFFT');title('n点DFT完成2N点FFT');xn=cos(2*pi/N*7*n2)+1/2*cos(2*pi/N*19*n2);xkk=fft(xn,2*N);subplot(2,1,2);stem(k,abs(xkk),'g');grid on;xlabel('k');ylabel('2*NFFT');title('Matlab2N点FFT');
七、问题思考
1.两次编程计算与理论计算相比较,结果一致吗?说明原因。
2.两次编程计算在编程方面、运算量上的比较。
八、心得体会
第三篇:数字信号处理实验讲稿
邯 郸 学 院
讲 稿
2010 ~2011 学年 第 一 学期
分院(系、部): 信息工程学院 教 研 室: 电子信息工程 课 程 名 称: 数字信号处理
授 课 班 级: 07级电子信息工程
主 讲 教 师: 王苗苗 职
称:
助教(研究生)
使 用 教 材: 《数字信号处理》
制 作 系 统:
Word2003
邯郸学院制
实验一..Matlab仿真软件介绍
一、实验目的
熟悉Matlab仿真软件
二、实验设备和元器件
含Matlab仿真软件的计算机
三、实验内容和步骤
1、学习Matlab仿真软件的安装
2、熟悉Matlab仿真软件的操作环境
3、直接在Matlab仿真软件的命令窗口实现数值计算
4、编写M文件
四、实验报告要求
按照《Matlab程序设计》模板提交实验报告
五、预习要求
1、熟悉Matlab仿真软件
2、参阅Matlab及在电子信息类课程中的应用(第2版)唐向宏 电子工业出版社
实验二 离散信号和系统分析的Matlab实现
一、实验目的
1、Matlab实现离散信号和系统分析
2、进一步熟悉Matlab软件操作
二、实验设备和元器件
含Matlab仿真软件的计算机
三、实验内容和步骤
1、利用Matlab产生离散信号
2、利用Matlab计算离散卷积
3、利用Matlab求解离散LTI系统响应
4、利用Matlab计算DTFT
5、利用Matlab实现部分分式法
6、利用Matlab计算系统的零极点
7、利用Matlab进行简单数字滤波器设计
四、实验报告要求
按照《Matlab程序设计》模板提交实验报告
五、预习要求
预习课本上的相关内容
实验三 利用Matlab实现信号DFT的计算
一、实验目的
1、Matlab实现信号DFT的计算
2、进一步熟悉Matlab软件操作
二、实验设备和元器件
含Matlab仿真软件的计算机
三、实验内容和步骤
1、利用Matlab计算信号的DFT
2、利用Matlab实现由DFT计算线性卷积
四、实验报告要求
按照《Matlab程序设计》模板提交实验报告
五、预习要求
预习课本上的相关内容
实验四 利用Matlab实现滤波器设计
一、实验目的
1、Matlab实现实现滤波器设计
2、进一步熟悉Matlab软件操作
二、实验设备和元器件
含Matlab仿真软件的计算机
三、实验内容和步骤
1、利用Matlab实现模拟低通滤波器的设计
2、利用Matlab实现模拟域频率变换
3、利用Matlab实现脉冲响应不变法
4、利用Matlab实现双线性变换法
5、利用Matlab实现数字滤波器设计
四、实验报告要求
按照《Matlab程序设计》模板提交实验报告
五、预习要求
预习课本上的相关内容
实验五 利用Matlab实现FIR滤波器设计
一、实验目的
1、Matlab实现实现滤波器设计
2、进一步熟悉Matlab软件操作
二、实验设备和元器件
含Matlab仿真软件的计算机
三、实验内容和步骤
1、利用Matlab实现窗函数法
2、利用Matlab实现频率取样法
3、利用Matlab实现优化设计
四、实验报告要求
按照《Matlab程序设计》模板提交实验报告
五、预习要求
预习课本上的相关内容
实验六..随机信号功率谱估计的Matlab实现
一、实验目的
1、Matlab实现实现滤波器设计
2、进一步熟悉Matlab软件操作
二、实验设备和元器件
含Matlab仿真软件的计算机
三、实验内容和步骤
1、利用Matlab实现随机序列
2、利用Matlab计算相关函数的估计
3、利用Matlab进行非参数功率谱估计
4、利用Matlab进行AR模型功率谱估计
四、实验报告要求
按照《Matlab程序设计》模板提交实验报告
五、预习要求
预习课本上的相关内容
实验七..数字滤波器结构的Matlab实现
一、实验目的
1、Matlab实现实现滤波器设计
2、进一步熟悉Matlab软件操作
二、实验设备和元器件
含Matlab仿真软件的计算机
三、实验内容和步骤
1、利用Matlab实现数字滤波器直接型设计
2、利用Matlab实现数字滤波器级联设计
3、利用Matlab实现数字滤波器并联型设计
4、利用Matlab实现数字滤波器格型设计
四、实验报告要求
按照《Matlab程序设计》模板提交实验报告
五、预习要求
预习课本上的相关内容
实验八....利用Matlab实现信号小波分析
一、实验目的
1、Matlab实现实现滤波器设计
2、进一步熟悉Matlab软件操作
二、实验设备和元器件
含Matlab仿真软件的计算机
三、实验内容和步骤
1、小波测试信号
2、分解与重构滤波器组
3、离散小波变换
4、离散小波反变换
5、基于小波的信号去噪
6、基于小波的信号压缩
四、实验报告要求
按照《Matlab程序设计》模板提交实验报告
五、预习要求
预习课本上的相关内容
第四篇:数字信号处理实验
实验一 自适应滤波器
一、实验目的
1、掌握功率谱估计方法
2、会用matlab对功率谱进行仿真
二、实验原理
功率谱估计方法有很多种,一般分成两大类,一类是经典谱估计;另一类是现代谱估计。经典谱估计可以分成两种,一种是BT法,另一种是周期法;BT法是先估计自相关函数,然后将相关函数进行傅里叶变换得到功率谱函数。相应公式如下所示:
1ˆxx(m)rNˆPBTmN|m|1n0x*(n)x(nm)(11)
(12)ˆxx(m)ejwnr周期图法是采用功率谱的另一种定义,但与BT法是等价的,相应的功率谱估计如下所示:
1jwˆ
Pxx(e)N其计算框图如下所示:
观测数据x(n)FFTjwnx(n)en0N120nN1(13)
取模的平方1/N Pxx(ejw)
图1.1周期图法计算用功率谱框图 由于观测数据有限,所以周期图法估计分辨率低,估计误差大。针对经典谱估计的缺点,一般有三种改进方法:平均周期图法、窗函数法和修正的周期图平均法。
三、实验要求
信号是正弦波加正态零均值白噪声,信噪比为10dB,信号频率为2kHZ,取样频率为100kHZ。
四、实验程序与实验结果(1)用周期图法进行谱估计 A、实验程序: %用周期法进行谱估计 clear all;N1=128;%数据长度 N2=256;N3=512;N4=1024;f=2;%正弦波频率,单位为kHZ fs=100;%抽样频率,单位为kHZ n1=0:N1-1;n2=0:N2-1;n3=0:N3-1;n4=0:N4-1;a=sqrt(20);%由信噪比为10dB计算正弦信号的幅度 wn1=randn(1,N1);xn1=a*sin(2*pi*f*n1./fs)+wn1;Pxx1=10*log10(abs(fft(xn1).^2)/N1);%周期法求功率谱 f1=((0:length(Pxx1)-1))/length(Pxx1);wn2=randn(1,N2);xn2=a*sin(2*pi*f*n2./fs)+wn2;Pxx2=10*log10(abs(fft(xn2).^2)/N2);f2=((0:length(Pxx2)-1))/length(Pxx2);wn3=randn(1,N3);xn3=a*sin(2*pi*f*n3./fs)+wn3;Pxx3=10*log10(abs(fft(xn3).^2)/N3);f3=((0:length(Pxx3)-1))/length(Pxx3);wn4=randn(1,N4);xn4=a*sin(2*pi*f*n4./fs)+wn4;Pxx4=10*log10(abs(fft(xn4).^2)/N4);f4=((0:length(Pxx4)-1))/length(Pxx4);subplot(2,2,1);plot(f1,Pxx1);xlabel('频率');ylabel('功率(dB)');title('功率谱Pxx,N=128');subplot(2,2,2);plot(f2,Pxx2);xlabel('频率');ylabel('功率(dB)');title('功率谱Pxx,N=256');subplot(2,2,3);plot(f3,Pxx3);xlabel('频率');ylabel('功率(dB)');title('功率谱Pxx,N=512');subplot(2,2,4);plot(f4,Pxx4);xlabel('频率');ylabel('功率(dB)');title('功率谱Pxx,N=1024');B、实验仿真结果:
(2)采用汉明窗,分段长度L=32,用修正的周期图求平均法进行谱估计 A:实验程序: clear all;N=512;%数据长度 Ns=32;%分段长度
f1=2;%正弦波频率,单位为kHZ fs=100;%抽样频率,单位为kHZ n=0:N-1;a=sqrt(20);%由信噪比为10dB计算正弦信号的幅度 wn=randn(1,N);xn=a*sin(2*pi*f1*n./fs)+wn;w=hamming(32)';%汉明窗
Pxx1=abs(fft(w.*xn(1:32),Ns).^2)/norm(w)^2;Pxx2=abs(fft(w.*xn(33:64),Ns).^2)/norm(w)^2;Pxx3=abs(fft(w.*xn(65:96),Ns).^2)/norm(w)^2;Pxx4=abs(fft(w.*xn(97:128),Ns).^2)/norm(w)^2;Pxx5=abs(fft(w.*xn(129:160),Ns).^2)/norm(w)^2;Pxx6=abs(fft(w.*xn(161:192),Ns).^2)/norm(w)^2;Pxx7=abs(fft(w.*xn(193:224),Ns).^2)/norm(w)^2;Pxx8=abs(fft(w.*xn(225:256),Ns).^2)/norm(w)^2;Pxx9=abs(fft(w.*xn(257:288),Ns).^2)/norm(w)^2;Pxx10=abs(fft(w.*xn(289:320),Ns).^2)/norm(w)^2;Pxx11=abs(fft(w.*xn(321:352),Ns).^2)/norm(w)^2;Pxx12=abs(fft(w.*xn(353:384),Ns).^2)/norm(w)^2;Pxx13=abs(fft(w.*xn(385:416),Ns).^2)/norm(w)^2;Pxx14=abs(fft(w.*xn(417:448),Ns).^2)/norm(w)^2;Pxx15=abs(fft(w.*xn(449:480),Ns).^2)/norm(w)^2;Pxx16=abs(fft(w.*xn(481:512),Ns).^2)/norm(w)^2;Pxx=10*log10((Pxx1+Pxx2+Pxx3+Pxx4+Pxx5+Pxx6+Pxx7+Pxx8+Pxx9+Pxx10+Pxx11+Pxx12+Pxx13+Pxx14+Pxx15+Pxx16)/16);f=((0:length(Pxx)-1))/length(Pxx);plot(f,Pxx);xlabel('频率');ylabel('功率(dB)');title('加窗平均周期图法功率谱Pxx,N=512');grid on;B:实验仿真结果:
五.参考文献:
[1] 丁玉美,阔永红,高新波.数字信号处理-时域离散随机信号处理[M].西安:西安电子科技大学出版社,2002.[2] 万建伟,王玲.信号处理仿真技术[M].长沙:国防科技大学出版社,2008.实验二
卡尔曼滤波器的设计
一.实验目的
1.熟悉并掌握卡尔曼滤波、自适应滤波和谱估计的原理。
2.可以仿真符合要求的卡尔曼滤波器、自适应滤波器和各种谱估计方法。
3.掌握卡尔曼滤波器的递推公式和仿真方法。4.熟悉matlab的用法。二.实验原理
卡尔曼滤波是用状态空间法描述系统的,由状态方程和测量方程所组成。卡尔曼滤波用前一个状态的估计值和最近一个观测数据来估计状态变量的当前值,并以状态变量的估计值的形式给出。其状态方程和量测方程如下所示:
xk1AkxkwkykCkxkvk(11)
(12)其中,k表示时间,输入信号wk是一白噪声,输出信号的观测噪声vk也是一个白噪声,输入信号到状态变量的支路增益等于1,即B=1;A表示状态变量之间的增益矩阵,可随时间变化,Ak表示第k次迭代的取值,C表示状态变量与输出信号之间的增益矩阵,可随时间变化,其信号模型如图1.1所示(k用k1代替)。
vkCk+ykWk-1+XkZ-1Xk-1Ak-1
图1.1 卡尔曼滤波器的信号模型
卡尔曼滤波是采用递推的算法实现的,其基本思想是先不考虑输入信号wk和观测噪声vk的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加权矫正状态变量的估计值,使状态变量估计误差的均方值最小。其递推公式如下所示:
xˆke0.02xˆk1Hk(yke0.02xk1)1HP(P1)kkk
Pke0.04Pk11e0.04Pk(IHk)Pk(112a)(112b)(112c)(112d)假设初始条件Ak,Ck,Qk,Rk,yk,xk1,Pk1已知,其中x0E[x0],P0var[x0],那么递推流程见图1.2所示。
Pk1式(1-5)Pk'式(1-4)Hk式(1-3)式(1-6)
图1.2 卡尔曼滤波递推流程图
三.实验要求
一连续平稳的随机信号x(t),自相关rx()e
xkPk,信号x(t)为加性噪声所干扰,噪声是白噪声,测量值的离散值y(k)为已知。Matlab仿真程序如下:
%编卡尔曼滤波递推程序,估计信号x(t)的波形 clear all;clc;Ak=exp(-0.02);%各系数由前面确定; Ck=1;Rk=0.1;p(1)=20;%各初值; Qk=1-exp(-0.04);
p1(1)=Ak*p(1)*Ak'+Qk;%由p1代表p'; x(1)=0;%设信号初值为0;
H(1)=p1(1)*Ck'*inv(Ck*p1(1)*Ck'+Rk);
zk=[-3.2,-0.8,-14,-16,-17,-18,-3.3,-2.4,-18,-0.3,-0.4,-0.8,-19,-2.0,-1.2,-11,-14,-0.9,0.8,10,0.2,0.5,-0.5,2.4,-0.5,0.5,-13,0.5,10,-12,0.5,-0.6,-15,-0.7,15,0.5,-0.7,-2.0,-19,-17,-11,-14] %zk为测量出来的离散值; N=length(zk);%要测量的点数; for k=2:N
p1(k)=Ak*p(k-1)*Ak'+Qk;%未考虑噪声时的均方误差阵; H(k)=p1(k)*Ck'*inv(Ck*p1(k)*Ck'+Rk);%增益方程; I=eye(size(H(k)));%产生和H(k)维数相同的单位矩阵; p(k)=(I-H(k)*Ck)*p1(k);%滤波的均方误差阵;
x(k)=Ak*x(k-1)+H(k)*(zk(k)-Ck*Ak*x(k-1));%递推公式; end, x %显示信号x(k)的数据; m=1:N;n=m*0.02;
plot(n,zk,'-r*',n,x,'-bo');%便于比较zk和x(k)在同一窗口输出; xlabel('t/s','Fontsize',16);ylabel('z(t),x(t)','fontsize',16);
title('卡尔曼滤波递推——x(t)的估计波形与z(t)波形','fontsize',16)legend('观测数据z(t)','信号估计值x(t)',2);grid;四.实验结果
五.实验小结
通过卡尔曼滤波估计信号与观测信号比较知,卡尔曼滤波输出的估计信号x(t)与实际观测到的离散值z(t)还是存在一定的误差,卡尔曼滤波是从初始状态 就采用递推方法进行滤波,那么在初值迭代后的一段时间内可能会出现较大的误差,随着迭代进行,各参数逐渐趋于稳定,后面的估计值与观察值的误差就减少了。
六.参考文献
[1] 丁玉美,阔永红,高新波.数字信号处理-时域离散随机信号处理[M].西安:西安电子科技大学出版社,2002.[2] 万建伟,王玲.信号处理仿真技术[M].长沙:国防科技大学出版社,2008.
第五篇:数字信号处理实验-FFT的实现
实
验
报
告
学生姓名:
学 号:
指导教师:
一、实验室名称:数字信号处理实验室
二、实验项目名称:FFT的实现
三、实验原理:
一.FFT算法思想:
1.DFT的定义:
对于有限长离散数字信号{x[n]},0 n N-1,其离散谱{x[k]}可以由离散付氏变换(DFT)求得。DFT的定义为:
N1X[k]通常令ej2Nx[n]en0j2Nnk,k=0,1,…N-1 WN,称为旋转因子。
2.直接计算DFT的问题及FFT的基本思想:
由DFT的定义可以看出,在x[n]为复数序列的情况下,完全直接运算N点DFT需要(N-1)2次复数乘法和N(N-1)次加法。因此,对于一些相当大的N值(如1024)来说,直接计算它的DFT所作的计算量是很大的。
FFT的基本思想在于,将原有的N点序列分成两个较短的序列,这些序列的DFT可以很简单的组合起来得到原序列的DFT。例如,若N为偶数,将原有的N
22点序列分成两个(N/2)点序列,那么计算N点DFT将只需要约[(N/2)·2]=N/2次复数乘法。即比直接计算少作一半乘法。因子(N/2)2表示直接计算(N/2)点DFT所需要的乘法次数,而乘数2代表必须完成两个DFT。上述处理方法可以反复使用,即(N/2)点的DFT计算也可以化成两个(N/4)点的DFT(假定N/2为偶数),从而又少作一半的乘法。这样一级一级的划分下去一直到最后就划分成两点的FFT运算的情况。
3.基2按时间抽取(DIT)的FFT算法思想:
设序列长度为N2L,L为整数(如果序列长度不满足此条件,通过在后面补零让其满足)。
将长度为N2L的序列x[n](n0,1,...,N1),先按n的奇偶分成两组:
x[2r]x1[r]x[2r1]x2[r],r=0,1,…,N/2-1 DFT化为:
N1N/21N/21X[k]DFT{x[n]}N/21n0x[n]WnkN2rkr0x[2r]W2rkNr0x[2r1]WN(2r1)kN/21r0N/21x1[r]Wx1[r]W2rkNWWkNr0N/21x2[r]WN
r0rkN/2kNr0x2[r]WN/22rkrk上式中利用了旋转因子的可约性,即:WNN/21NrkN/21rkWN/2。又令
rkX1[k]r0x[1r]W,/X2[k]2r0x[r]WN2,则上式可以写成: /2X[k]X1[k]WNX2[k](k=0,1,…,N/2-1)
k可以看出,X1[k],X2[k]分别为从X[k]中取出的N/2点偶数点和奇数点序列的N/2点DFT值,所以,一个N点序列的DFT可以用两个N/2点序列的DFT组合而成。但是,从上式可以看出,这样的组合仅表示出了X[k]前N/2点的DFT值,还需要继续利用X1[k],X2[k]表示X[k]的后半段本算法推导才完整。利用旋转因子的周期性,有:WN/2WN/2X1[N2N/21rkr(kN/2),则后半段的DFT值表达式:
rkk]r0x1[r]W2N/2r(Nk)N/21r0x1[r]WN/2X1[k],同样,X2[N2k]X2[k]
(k=0,1,…,N/2-1),所以后半段(k=N/2,…,N-1)的DFT值可以用前半段k值表达式获得,中间还利用到WN(N2k)NWN2Wk得到后半段的X[k]值表达式W,k为:X[k]X1[k]WNkX2[k](k=0,1,…,N/2-1)。
这样,通过计算两个N/2点序列x1[n],x2[n]的N/2点DFTX1[k],X2[k],可以组合得到N点序列的DFT值X[k],其组合过程如下图所示:
X1[k] X1[k]WNkX2[k]
X2[k] WNnk-1 X1[k]WNkX2[k]
比如,一个N = 8点的FFT运算按照这种方法来计算FFT可以用下面的流程图来表示:
x(0)W0x(1)W0x(2)W0x(3)W2W0W1W0x(5)W0x(6)W0x(7)W2X(7)W3X(6)W2X(5)X(3)X(2)X(1)X(0)x(4)X(4)
4.基2按频率抽取(DIF)的FFT算法思想:
设序列长度为N2L,L为整数(如果序列长度不满足此条件,通过在后面补零让其满足)。
在把X[k]按k的奇偶分组之前,把输入按n的顺序分成前后两半:
N1N/21nkNN1X[k]DFT{x[n]}N/21N/21x[n]Wn0(nn0N2)kx[n]WnkNnN/2x[n]WNnkn0N/21x[n]WnkNn0x[nNkN2]WNnk
Nn0[x[n]x[nN2NkN2]W2N]WN,k0,1,...,N1因为W2N1,则有WX[k](1),所以:
kkN/21n0[x[n](1)x[nN2]]WN,k0,1,...,N1
nk按k的奇偶来讨论,k为偶数时:
N/21X[2r]n0[x[n]x[nN2]]WN,k0,1,...,N1 N22rnN/21k为奇数时:X[2r1]前面已经推导过WNN/21n0[x[n]x[n]]WN(2r1)n,k0,1,...,N1
2rkWN/2,所以上面的两个等式可以写为:
N2]]WN/2,r0,1,...,N/21 N2rnrkX[2r]n0[x[n]x[nN/21X[2r1]n0{[x[n]x[n]]WN}WN/2,r0,1,...,N/21
nnr通过上面的推导,X[k]的偶数点值X[2r]和奇数点值X[2r1]分别可以由组合而成的N/2点的序列来求得,其中偶数点值X[2r]为输入x[n]的前半段和后半段之和序列的N/2点DFT值,奇数点值X[2r1]为输入x[n]的前半段和后半段之差再与WN相乘序列的N/2点DFT值。
令x1[n]x[n]x[nN/21nN2],x2[n][x[n]x[nN/21N2]]WN,则有:
nX[2r]n0x1[n]WrnN/2,X[2r1]n0x2[n]WrnN/2,r0,1,...,N21
这样,也可以用两个N/2点DFT来组合成一个N点DFT,组合过程如下图所示:
x[n] x[n]x[nN2]
x[nN2]-1 WNn [x[n]x[nN2]]WNn
二.在FFT计算中使用到的MATLAB命令:
函数fft(x)可以计算R点序列的R点DFT值;而fft(x,N)则计算R点序列的N点DFT,若R>N,则直接截取R点DFT的前N点,若R 四、实验目的: 离散傅氏变换(DFT)的目的是把信号由时域变换到频域,从而可以在频域分析处理信息,得到的结果再由逆DFT变换到时域。FFT是DFT的一种快速算法。在数字信号处理系统中,FFT作为一个非常重要的工具经常使用,甚至成为DSP运算能力的一个考核因素。 本实验通过直接计算DFT,利用FFT算法思想计算DFT,以及使用MATLAB函数中的FFT命令计算离散时间信号的频谱,以加深对离散信号的DFT变换及FFT算法的理解。 五、实验内容: a)计算实数序列x(n)cos516n,0n256的256点DFT。 b)计算周期为1kHz的方波序列(占空比为50%,幅度取为+/-512,采样频率为25kHz,取256点长度)256点DFT。 六、实验器材(设备、元器件): 安装MATLAB软件的PC机一台,DSP实验演示系统一套。 七、实验步骤: (1)先利用DFT定义式,编程直接计算2个要求序列的DFT值。 (2)利用MATLAB中提供的FFT函数,计算2个要求序列的DFT值。(3)(拓展要求)不改变序列的点数,仅改变DFT计算点数(如变为计算1024点DFT值),观察画出来的频谱与前面频谱的差别,并解释这种差别。通过这一步骤的分析,理解频谱分辨力的概念,解释如何提高频谱分辨力。 (4)利用FFT的基本思想(基2-DIT或基2-DIF),自己编写FFT计算函数,并用该函数计算要求序列的DFT值。并对前面3个结果进行对比。 (5)(拓展要求)尝试对其他快速傅立叶变换算法(如Goertzel算法)进行MATLAB编程实现,并用它来计算要求的序列的DFT值。并与前面的结果进行对比。 (6)(拓展要求)在提供的DSP实验板上演示要求的2种序列的FFT算法(基2-DIT),用示波器观察实际计算出来的频谱结果,并与理论结果对比。 八、实验数据及结果分析: 程序:(1)对要求的2种序列直接进行DFT计算的程序 (2)对要求的2种序列进行基2-DIT和基2-DIF FFT算法程序(3)对要求的2种序列用MATLAB中提供的FFT函数进行计算的程序 结果:(1)对2种要求的序列直接进行DFT计算的频域波形 (2)对2种要求的序列进行基2-DIT和基2-DIF FFT算法频域波形(3)对2种要求的序列用MATLAB中提供的FFT函数计算的频域波形。(4)(拓展要求)分析利用上面的方法画出的信号频谱与理论计算出来的频谱之间的差异,并解释这种差异。 (5)(拓展要求)保持序列点数不变,改变DFT计算点数(变为1024点),观察频谱的变化,并分析这种变化,由此讨论如何提高频谱分辨力的问题。 九、实验结论: 十、总结及心得体会: 十一、对本实验过程及方法、手段的改进建议: