实验一 利用傅立叶变换计算线性卷积
一、实验目的
1. 掌握MATLAB 的使用。
2. 掌握用直接法计算线性卷积的原理和方法
3. 掌握利用FFT 及IFFT 计算线性卷积的原理和方法
二、实验原理及方法
1、线性卷积的定义
序列)1N n 0(),n (x -≤≤和序列)1M n 0(),n (h -≤≤的线性卷积y(n)=x(n)*h(n)定义为:
10),()()(1
0-+≤≤-⨯=
∑-=M N n m n h m x n y N m 利用直接法计算线性卷积即用线性卷积的定义计算。
2、利用FFT 及IFFT 计算线性卷积的原理和方法
如果将序列x(n)和h(n) 补零,使其成为长度为L 的序列(L>=N+M-1), 则x(n)与h(n)的线性卷积y(n)=x(n)*h(n)与L 点圆周卷积相等,而圆周卷积可采用FFT 及IFFT 完成,即求y(n)=x(n)*h(n)可转化为:
对上式两端取FFT 得: Y(k)=X(k)H(k)
其中:X(k)=FFT[x(n)], H(k)=FFT[h(n)]
则:y(n)=IFFT[Y(k)]
三、实验仪器及材料
⒈ 计算机,并装有MATLAB 程序
⒉ 打印机
四、实验步骤
1、已知两序列: ⎩⎨⎧>≤≤=3n ;
03n 0;)5/3()n (h n 用Matlab 随机生成输入信号X (n ),范围为0~2;
2、得出用直接法(定义)计算线性卷积y(n)=x(n)*h(n)的结果;
3、用Matlab 编制利用FFT 和IFFT (圆周卷积)计算线性卷积y(n)=x(n)*h(n)的程序; 分别令圆周卷积的点数为L=5,7,8,10,打印结果。
4、对比直接法和圆周卷积法所得的结果。
五、实验说明:
1、实验前复习线性卷积,圆周卷积及FFT 内容。
2、利用FFT 计算线性卷积是将x(n)、h(n)用补零的方法延长到N+M-1,再用圆周卷积完成,因此要求x(n)、h(n)延长后的长度满足L>=N+M-1,才能保证用圆周卷积计算结果与直接法计算结果相同。
六、分析整理实验数据,写出实验报告
实验报告要求:
1、 手工计算两序列的线性卷积,并与计算机的结果比较,以验证手工计算的正确性。
2、 令L=5,用已编制好的程序分别采用直接法和FFT 法对两序列计算线性卷积y(n)=x(n)*h(n),并打印结果。
3、 令L=7,8,10,用已编制好的程序分别采用直接法和FFT 法对两序列计算线性卷积y(n)=x(n)*h(n),并对比所得的结果,打印L=7,8,10的结果。
4、 打印程序.
七、思考题
说明为什么L=7,8,10时采用直接法和FFT 法对两序列计算线性卷积y(n)=x(n)*h(n)的结果相同,而与L=5时计算结果不同?
附录:
本实验所用的Matlab函数:
X=rand(r,c) : 用Matlab随机生成输入信号X(n),范围为0~1,r行,c列
Y=conv(x1,x2): 将序列x1(n)与序列x2(n)做线形卷积,结果赋给序列Y(n);
Y=fft(x ,L) : 将序列x (n)做L点傅立叶变换,结果赋给序列Y(n);
Y=ifft(x,L) : 将序列x (n)做L点傅立叶反变换,结果赋给序列Y(n);
Stem(x,y) : 以x为横坐标,y为纵坐标画曲线;
Plot(x,y) : 以x为横坐标,y为纵坐标画曲线;
L=10; % The length of FFT
sizex=4; % The length of the sequence x(n)
sizeh=4; % The length of the sequence h(n)
x=rand(1,4)*2 %x=[1,1,1,1]; x =[1.9003,0.4623,1.2137,0.9720]
h=[0.6^0,0.6^1,0.6^2,0.6^3]
y=conv(x,h); %x*h
X=fft(x,L);
H=fft(h,L);
for i=1:1:L
YK(i)=X(i)*H(i);
end
yFFT=ifft(YK,L);
subplot(2,2,1)
le=0:1:sizex-1; %横标
stem(le,x)
title('x sequence')
xlabel('n')
ylabel('x(n)')
x = 1.9003 0.4623 1.2137 0.9720
y = 1.9003 1.6025 2.1752 2.2771 1.1200 0.6121 0.2100
Yfft=1.9003 1.6025 2.1752 2.2771 1.1200 0.6121 0.2100 0 0 h = 1.0000 0.6000 0.3600 0.2160
L=7;
L=5;
x=[1,1,1,1]; h = 1.0000 0.6000 0.3600 0.2160
y =1.0000 1.6000 1.9600 2.1760 1.1760 0.5760 0.2160
yFFT =1.0000 1.6000 1.9600 2.1760 1.1760 0.5760 0.2160 0.0000 0.0000 0.0000
subplot(2,2,2)
le2=0:1:sizeh; %1
stem(le2,h)
title('h sequence')
xlabel('n')
ylabel('h(n)')
subplot(2,2,3)
le3=0:1:sizex+sizeh-1; % 2 stem(le3,y)
title('y sequence by direct method') xlabel('n')
ylabel('y(n)')
subplot(2,2,4)
le3=0:1:L; %1
stem(le3,yFFT)
title('y sequence by FFT')
xlabel('n')
ylabel('y(n)')。