实验二 DFTFFT的应用利用FFT实现快速卷积.docx

上传人:b****6 文档编号:4361842 上传时间:2022-11-30 格式:DOCX 页数:13 大小:120.59KB
下载 相关 举报
实验二 DFTFFT的应用利用FFT实现快速卷积.docx_第1页
第1页 / 共13页
实验二 DFTFFT的应用利用FFT实现快速卷积.docx_第2页
第2页 / 共13页
实验二 DFTFFT的应用利用FFT实现快速卷积.docx_第3页
第3页 / 共13页
实验二 DFTFFT的应用利用FFT实现快速卷积.docx_第4页
第4页 / 共13页
实验二 DFTFFT的应用利用FFT实现快速卷积.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

实验二 DFTFFT的应用利用FFT实现快速卷积.docx

《实验二 DFTFFT的应用利用FFT实现快速卷积.docx》由会员分享,可在线阅读,更多相关《实验二 DFTFFT的应用利用FFT实现快速卷积.docx(13页珍藏版)》请在冰豆网上搜索。

实验二 DFTFFT的应用利用FFT实现快速卷积.docx

实验二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取共轭。

要求:

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

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

分析实验结果。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1