实验二 DFTFFT的应用利用FFT实现快速卷积.docx
- 文档编号:4361842
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:13
- 大小:120.59KB
实验二 DFTFFT的应用利用FFT实现快速卷积.docx
《实验二 DFTFFT的应用利用FFT实现快速卷积.docx》由会员分享,可在线阅读,更多相关《实验二 DFTFFT的应用利用FFT实现快速卷积.docx(13页珍藏版)》请在冰豆网上搜索。
实验二DFTFFT的应用利用FFT实现快速卷积
实验二DFT/FFT的应用-利用FFT实现快速卷积
[实验目的]
1.深刻理解DFT/FFT的概念和性质,进一步掌握圆周卷积和线性卷积两者之间的关系。
2.掌握DFT/FFT的应用。
理解FFT在实现数字滤波(或快速卷积)中的重要作用,更好地利用FFT进行数字信号处理。
[实验内容及要求]
1.给定两个序列
,
。
首先直接在时域计算两者的线性卷积;然后用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];
N=N1+N2-1;%卷积后的序列长度
XK=fft(xn,N);%xn的离散傅里叶变换
HK=fft(hn,N);%hn的离散傅里叶变换
YK=XK.*HK;
yn=ifft(YK,N);%逆变换
ifall(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.数字滤波器的冲激响应为
可自定,本实验取
,输入序列x(n)可选下列几种情况:
,
可取16
,
,
(3)实验前,预先编制一个应用FFT实现数字滤波器的通用程序。
通用程序:
functionyn=xian(xn,n,N1)
N1=16;
N2=17;
N=N1+N2-1;
n=0:
1:
15;
m=0:
1:
16;
hn=(-0.5).^m;
XK=fft(xn,N);
HK=fft(hn,N);
YK=XK.*HK;
yn=ifft(YK,N);
ifall(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)
运行结果:
③调用程序,在命令行输入:
yn=xian([(1/3).^n],n,16)
运行结果:
(5)将实验结果与预先笔算的结果比较,验证其正确性。
将实验结果与预先笔算的结果对比结果是相同的,验证了程序的正确性。
3.设
,
a.计算线性卷积
程序代码:
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);
ifall(imag(xn)==0)&&(all(imag(hn)==0))%实序列的循环卷积仍为实序列
yn=real(yn);
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);
ifall(imag(xn)==0)&&(all(imag(hn)==0))%实序列的循环卷积仍为实序列
yn=real(yn);
end
x=0:
N-1;
stem(x,yn);title('5点圆周卷积');
运行结果:
(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);
ifall(imag(xn)==0)&&(all(imag(hn)==0))%实序列的循环卷积仍为实序列
yn=real(yn);
end
x=0:
N-1;
stem(x,yn);title('6点圆周卷积');
运行结果:
(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);
ifall(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];
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);
ifall(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.编写一个MATLAB函数,用一个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];
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');
运行结果:
结果分析:
对比用MATLAB函数和直接求两个N点的DFT的结果可以知道,两种方法的结果是相同的,因此可以用一个N点的离散傅里叶变换同时计算两个N点实序列的离散傅里叶变换。
遇到的问题及解决办法:
在编写MATLAB函数时,虚数的表示应写成“1i”而不是“j”,序列的反序要用到fliplr函数,conj取共轭。
要求:
列出实验程序清单,包括必要步骤的程序说明。
记录调试运行情况及所遇问题的解决方法。
分析实验结果。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验二 DFTFFT的应用利用FFT实现快速卷积 实验 DFTFFT 应用 利用 FFT 实现 快速 卷积
![提示](https://static.bdocx.com/images/bang_tan.gif)