实验二 DFT(FFT)的应用—利用FFT实现快速卷积

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

姓名:高铭遥 班级:16131701 学号:1120171450 成绩:
实验二 DFT/FFT 的应用-利用FFT 实现快速卷积
[实验目的]
1.深刻理解DFT/FFT 的概念和性质,进一步掌握圆周卷积和线性卷积两者之间的关系。

2.掌握DFT/FFT 的应用。

理解FFT 在实现数字滤波(或快速卷积)中的重要作用,更好地利用FFT 进行数字信号处理。

[实验内容及要求]
1.给定两个序列()[]2,1
,1,2x n =,()[]1,1,1,1h n =--。

首先直接在时域计算两者的线性卷积;然后用FFT 快速计算二者的线性卷积,验证结果。

(1)线性卷积 程序代码:
figure(1);
N1=4; N2=4; xn=[2,1,1,2]; hn=[1,-1,-1,1];
N=N1+N2-1;%卷积后的序列长度 yn=conv(xn,hn);%线性卷积 x=0:N-1;
stem(x,yn);title('线性卷积'); 运行结果:
(2)FFT 卷积快速卷积 程序代码: figure(1); n=0:1:3; m=0:1:3;
N1=length(n);%xn 的序列长度 N2=length(m);%hn 的序列长度 xn=[2,1,1,2]; hn=[1,-1,-1,1];
姓名:高铭遥 班级:16131701 学号:1120171450 成绩:
N=N1+N2-1;%卷积后的序列长度
XK=fft(xn,N);%xn 的离散傅里叶变换 HK=fft(hn,N);%hn 的离散傅里叶变换 YK=XK.*HK;
yn=ifft(YK,N);%逆变换
if all(imag(xn)==0)&&(all(imag(hn)==0))%实序列的循环卷积仍为实序列 yn=real(yn); end
x=0:N-1;
stem(x,yn);title('FFT 卷积'); 运行结果:
结果分析:对比(1)和(2)直接线性卷积和FFT 快速卷积的结果可以验证,用FFT 线性卷积的结果是与直接卷积的结果相同的,FFT 可以实现快速卷积,提高运算速度。

2.数字滤波器的冲激响应为()()2
21,2n
N h n R n N ⎛⎫=- ⎪⎝⎭
可自定,本实验取217N =,输入序列x
(n )可选下列几种情况:
①()()1
N x n R n =,1N 可取16
②()()112cos N x n n R n N π⎛⎫
=
⎪⎝⎭
,116N = ③()()113n
N x n R n ⎛⎫
= ⎪⎝⎭
,116N =
(3)实验前,预先编制一个应用FFT 实现数字滤波器的通用程序。

通用程序:
function yn=xian(xn,n,N1) N1=16; N2=17;
N=N1+N2-1; n=0:1:15;
姓名:高铭遥班级:16131701 学号:1120171450 成绩:m=0:1:16;
hn=(-0.5).^m;
XK=fft(xn,N);
HK=fft(hn,N);
YK=XK.*HK;
yn=ifft(YK,N);
if all(imag(xn)==0)&&(all(imag(hn)==0))%实序列的循环卷积仍为实序列
yn=real(yn);
end
x=0:N-1;
stem(x,yn);
end
(4)上机独立调试,并打印或记录试验结果。

①调用程序,在命令行输入:
yn=xian([ones(1,N1)],n,16)
运行结果:
②调用程序,在命令行输入:
yn=xian([cos(2*pi*n/N1)],n,16)
运行结果:
姓名:高铭遥 班级:16131701 学号:1120171450 成绩:
③调用程序,在命令行输入: yn=xian([(1/3).^n],n,16) 运行结果:
(5)将实验结果与预先笔算的结果比较,验证其正确性。

将实验结果与预先笔算的结果对比结果是相同的,验证了程序的正确性。

3.设{
}1 ,2 ,2 ,1)(=n x ,{}5 ,4 ,3 ,2 ,1)(=n h a .计算线性卷积)()(n h n x * 程序代码:
figure(1); N1=4;N2=5;
xn=[1,2,2,1]; hn=[1,2,3,4,5];
N=N1+N2-1;%卷积后的序列长度 yn=conv(xn,hn);%线性卷积 x=0:N-1;
subplot(211);stem(x,yn);title('线性卷积'); n=0:1:3; m=0:1:4;
N1=length(n); N2=length(m); xn=[1,2,2,1,]; hn=[1,2,3,4,5]; N=N1+N2-1; XK=fft(xn,N); HK=fft(hn,N); YK=XK.*HK;
yn=ifft(YK,N);
if all(imag(xn)==0)&&(all(imag(hn)==0))%实序列的循环卷积仍为实序列 yn=real(yn);
姓名:高铭遥班级:16131701 学号:1120171450 成绩:end
x=0:N-1;
subplot(212);stem(x,yn);title('FFT卷积');
运行结果:
b.分别用FFT计算它们的5点、6点、8点和10点圆周卷积。

(1)5点圆周卷积代码:
n=0:1:4;
m=0:1:3;
N=length(n);
M=length(m);
x=[1,2,2,1];
xn=[x(1:M),zeros(1,N-M)];%补0到序列长度为5
hn=[1,2,3,4,5];
XK=fft(xn,N);
HK=fft(hn,N);
YK=XK.*HK;
yn=ifft(YK,N);
if all(imag(xn)==0)&&(all(imag(hn)==0))%实序列的循环卷积仍为实序列
yn=real(yn);
end
x=0:N-1;
stem(x,yn);title('5点圆周卷积');
运行结果:
姓名:高铭遥班级:16131701 学号:1120171450 成绩:
(2)6点圆周卷积代码:
n=0:1:5;m=0:1:3;z=0:1:4;
Z=length(z);
N=length(n);
M=length(m);
x=[1,2,2,1];
xn=[x(1:M),zeros(1,N-M)];%补0到序列长度为6
h=[1,2,3,4,5];
hn=[h(1:Z),zeros(1,N-Z)];%补0到序列长度为6
XK=fft(xn,N);
HK=fft(hn,N);
YK=XK.*HK;
yn=ifft(YK,N);
if all(imag(xn)==0)&&(all(imag(hn)==0))%实序列的循环卷积仍为实序列
yn=real(yn);
end
x=0:N-1;
stem(x,yn);title('6点圆周卷积');
运行结果:
姓名:高铭遥班级:16131701 学号:1120171450 成绩:(3)8点圆周卷积代码:
n=0:1:7;
m=0:1:3;
z=0:1:4;
Z=length(z);
N=length(n);
M=length(m);
x=[1,2,2,1];
xn=[x(1:M),zeros(1,N-M)];%补0到序列长度为8
h=[1,2,3,4,5];
hn=[h(1:Z),zeros(1,N-Z)];%补0到序列长度为8
XK=fft(xn,N);
HK=fft(hn,N);
YK=XK.*HK;
yn=ifft(YK,N);
if all(imag(xn)==0)&&(all(imag(hn)==0))%实序列的循环卷积仍为实序列
yn=real(yn);
end
x=0:N-1;
stem(x,yn,'.');title('8点圆周卷积');
运行结果:
(4)10点圆周卷积代码:
n=0:1:9;
m=0:1:3;
z=0:1:4;
Z=length(z);
N=length(n);
M=length(m);
x=[1,2,2,1];
xn=[x(1:M),zeros(1,N-M)];%补0到序列长度为10
h=[1,2,3,4,5];
姓名:高铭遥班级:16131701 学号:1120171450 成绩:
hn=[h(1:Z),zeros(1,N-Z)];%补0到序列长度为10
XK=fft(xn,N);
HK=fft(hn,N);
YK=XK.*HK;
yn=ifft(YK,N);
if all(imag(xn)==0)&&(all(imag(hn)==0))%实序列的循环卷积仍为实序列
yn=real(yn);
end
x=0:N-1;
stem(x,yn,'.');title('10点圆周卷积');
分析实验结果,思考以下问题:
什么条件下圆周卷积与线性卷积是相同的?
对比试验结果可以知道,当圆周卷积的序列长度L满足:L≧N+M-1(M,N分别为两个序列的长度)时,圆周卷积的结果和线性卷积是相同的。

如果不满足条件结果会怎样?
如果不满足条件的话,x(n)的周期延拓就必然有一部分非零序列值要交叠起来,发生混淆失真。

圆周卷积的结果就与线性卷积不同了。

4.编写一个MA TLAB函数,用一个N点离散傅里叶变换同时计算两个N点实序列的离散傅里叶变换,并将该函数用于求1中x(n)和h(n)的离散傅里叶变换,将结果与直接使用两个N点离散傅里叶变换计算出来的结果进行比较。

(1)MATLAB函数:
function [XK,HK]=juan(xn,hn,N)
k=0:N-1;
yn=xn+1i*hn;%一个作为实部,一个做虚部
YK=fft(yn,N);%求离散傅里叶变换
YK2=conj(YK);%取共轭
YK0=fliplr(YK2(2:N)); %反序
YK1=[YK2(1) YK0];
姓名:高铭遥班级:16131701 学号:1120171450 成绩:XK=(YK+YK1)/2;%求XK
HK=-1i*(YK-YK1)/2;%求HK
subplot(211);stem(k,XK);title('xnFFT');
subplot(212);stem(k,HK);title('hnFFT');
end
实验过程:
调用函数,在命令行输入:
[XK,HK]=juan([2,1,1,2],[1,-1,-1,1],4)
运行结果:
(2)直接求两个N点的离散傅里叶变换
程序代码:
N=4;
k=0:N-1;
xn=[2,1,1,2];
hn=[1,-1,-1,1];
XK1=fft(xn,N);%求xn的离散傅里叶变换
HK1=fft(hn,N);%求hn的离散傅里叶变换
subplot(211);stem(k,XK1);title('xn1FFT');
subplot(212);stem(k,HK1);title('hn1FFT');
运行结果:
姓名:高铭遥班级:16131701 学号:1120171450 成绩:
结果分析:对比用MA TLAB函数和直接求两个N点的DFT的结果可以知道,两种方法的结果是相同的,因此可以用一个N点的离散傅里叶变换同时计算两个N点实序列的离散傅里叶变换。

遇到的问题及解决办法:在编写MATLAB函数时,虚数的表示应写成“1i”而不是“j”,序列的反序要用到fliplr函数,conj取共轭。

要求:列出实验程序清单,包括必要步骤的程序说明。

记录调试运行情况及所遇问题的解决方法。

分析实验结果。

相关文档
最新文档