1、实验二 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,h
2、n);%线性卷积 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);%逆变换if all(imag(xn)=0)&(all(imag(hn)=0)%实序列的循环卷积仍为实序列
3、 yn=real(yn);endx=0:N-1;stem(x,yn);title(FFT卷积);运行结果:结果分析:对比(1)和(2)直接线性卷积和FFT快速卷积的结果可以验证,用FFT线性卷积的结果是与直接卷积的结果相同的,FFT可以实现快速卷积,提高运算速度。2.数字滤波器的冲激响应为可自定,本实验取,输入序列x(n)可选下列几种情况:,可取16 ,(3)实验前,预先编制一个应用FFT实现数字滤波器的通用程序。通用程序:function yn=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
4、,N);HK=fft(hn,N);YK=XK.*HK;yn=ifft(YK,N);if all(imag(xn)=0)&(all(imag(hn)=0)%实序列的循环卷积仍为实序列 yn=real(yn);endx=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)将实验结果与预先笔算的结果比较,验证其正确性。
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=iff
6、t(YK,N);if all(imag(xn)=0)&(all(imag(hn)=0)%实序列的循环卷积仍为实序列 yn=real(yn);endx=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到序列长度为5hn=1,2,3,4,5;XK=fft(xn,N);HK=fft(hn,N);YK=XK.*HK;yn=i
7、fft(YK,N);if all(imag(xn)=0)&(all(imag(hn)=0)%实序列的循环卷积仍为实序列 yn=real(yn);endx=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到序列长度为6h=1,2,3,4,5;hn=h(1:Z),zeros(1,N-Z);%补0到序列长度为6XK=fft(xn,N);HK=fft(hn,N);Y
8、K=XK.*HK;yn=ifft(YK,N);if all(imag(xn)=0)&(all(imag(hn)=0)%实序列的循环卷积仍为实序列 yn=real(yn);endx=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到序列长度为8h=1,2,3,4,5;hn=h(1:Z),zeros(1,N-Z);%补0到序列长度为8XK=fft(xn,N);H
9、K=fft(hn,N);YK=XK.*HK;yn=ifft(YK,N);if all(imag(xn)=0)&(all(imag(hn)=0)%实序列的循环卷积仍为实序列 yn=real(yn);endx=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到序列长度为10h=1,2,3,4,5;hn=h(1:Z),zeros(1,N-Z);%补0到序列长
10、度为10XK=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);endx=0:N-1;stem(x,yn,.);title(10点圆周卷积);分析实验结果,思考以下问题:什么条件下圆周卷积与线性卷积是相同的?对比试验结果可以知道,当圆周卷积的序列长度L满足:LN+M-1(M,N分别为两个序列的长度)时,圆周卷积的结果和线性卷积是相同的。如果不满足条件结果会怎样? 如果不满足条件的话,x(n)的周期延拓就必然有一部分非零序列值要交
11、叠起来,发生混淆失真。圆周卷积的结果就与线性卷积不同了。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;%
12、求XKHK=-1i*(YK-YK1)/2;%求HKsubplot(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取共轭。要求:列出实验程序清单,包括必要步骤的程序说明。记录调试运行情况及所遇问题的解决方法。分析实验结果。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1