matlab编写dft函数_DFT之泄露

更多经验分享,关注 加油射频工程师 

(1)漫画

01632980c0c1b89c633f2fdf36c4d415.png

c06ff852a63e1cdf1153f55d78b894b3.png

(2)引言

自从同事给推荐Understanding Digital Signal Processing这本书来,断断续续地一直再看。最近,终于看的稍微明白了一点。

这章共看了三遍:

(1) 看第一遍的时候,就是不管懂不懂,先往下看,所以看完后,感觉就像没看一样;

(2) 看第二遍的时候,就边看边翻译成中文,有不懂的,也放过;但是因为有形成文档笔记,所以本身心里还是比较有成就感的。这样就形成了正循环,看的时候,心情比较愉悦,所以理解的东西也会比较容易。

(3) 看第三遍的时候,就尝试着用自己的语言组织,用matlab去仿真验证,不懂的再去查其他资料帮助理解。

不得不说,写公众号确实是一个促进学习的好方式,以写促学。因为想在公众号里发表出来,就会去很认真地去写文档,然后就会把那些似懂非懂的问题去搞懂。

根据书本上的DFT上的内容,共整理了以下几篇文档:

DFT学习笔记,是关于DFT的变换公式以及其的一些特性

DFT之泄露,关于泄露的现象以及产生的原因;

DFT之窗函数,列举了几种窗函数,并进行了相关比较,以及窗函数的一些作用

DFT之扇贝损耗,以矩形函数为例,叙述了扇贝损耗的现象

DFT之零填充,指出进行零填充的原因,以及注意事项;

DFT之处理增益;

第一篇可以从往期文章看到,今天这篇主要是关于泄露。

(3)DFT之泄露

泄露的现象

DFT即是,对具有N个数的输入序列,进行一个N点的DFT变换,产生一个具有N个点的频域序列。而且,这些频域序列的间隔为:

778b227460bb6d51a4f94c1e4f460d47.png

前面的例子DFT学习笔记,之所以能够准确计算出频率,是因为输入信号的频率是fs/N的整数倍。

那如果不是整数倍,会怎么样呢?

还是上面的例子,把第二项的频率从2000改为1500,然后再运行一下程序,可以得到下述结果。并且将频率为2000Hz的计算结果列于左侧。

147d30b9e6482194aa3bfa7a43cca036.png

可以看到:

(1) 在m=1.5处未产生频谱,

(2) m=2,3,4,5处应该是0的,现在也有值了

(3) m=1,7处的值与频率为2000Hz时的结果相比,变小了。

从上面例子可以看出,当输入序列的频率不是fs/N的整数倍时,比如1.5fs/N时,其能量会被泄露到频域上的N个序列点上。

因此,在用DFT处理真实世界中的有限长的时间序列时,泄露是不可避免的。

那为什么会产生泄露呢?

这是因为,在使用DFT时,会不可避免的使用窗口函数。

以下列函数为例:

5d1d3437f6cdb0a8c407f2b37b26fa9b.png

为一连续时间函数。

为了计算其DFT,我们对其以fs=8000对其采样,得到xin[n],即

3854494cc71119e4fbc5c3d324bade64.png

但我们进行DFT运算时,只是使用了其前8个点,记为x[n]。所以可以认为x[n]=xin[n]w[n]。

e45e57a63c515601231624bffac5e7a7.png

绘制上图的matlab程序:

clc;

clear all;

ts=1/8000;

N=64;

n=0:1:(N-1);

m=0:1:7;

Xn=sin(2*pi*1500*n*ts);

Xm=sin(2*pi*1500*m*ts);

subplot(3,1,1)

%画原始的连续函数

plot(n,Xn)

title('原始连续函数')

ylabel('xin(t)')

%绘制采样后的函数

subplot(3,1,2)

stem(n,Xn,'k')

hold on;

stem(m,Xm,'r--')

title('黑色为采样后的点,红色为DFT变换所用的点')

ylabel('xin(n)')

%绘制窗函数

subplot(3,1,3)

stem(m,rectwin(8),'b')

hold on;

k=8:1:70

stem(k,zeros(63),'b')

title('矩形窗函数')

ylabel('w(n)')

也就是说,当我们想通过DFT换算计算xin(t)频谱的时候,我们其实是做了这些步骤:

(1) 对连续信号xin(t)进行采样,得到离散信号xin[n]

(2) 截取离散信号xin[n]中的一段,即与窗函数w[n]相乘,得到x[n]。

所以,我们其实计算的是x[n]=xin[n]•w[n]的频谱,即对xin[n]进行矩形加窗后的函数的频谱。

问题是,加窗后的函数的频谱与原来的频谱有什么区别呢?

要说明DFT计算的频谱的问题,先了解一下DFT与DTFT的关系,以及DTFT变换。

DTFT与DFT之间的关系:

DTFT的变换公式为:

4a7fc858e948018b5d52daf56813d4e6.png 

DFT的变换公式为:

c26252693e1e685baa627615d9c6f7d1.png 

所以,如果x[n]的长度为L,且L≤N,则其N点DFT为DTFT的采样,即:

d3801f7ab50480f29abd22d5ed3c9ed8.png 

而x[n]正好满足这一要求,所以可以对X(w)做以上操作,以得到其DFT。

 时域乘积等于频域卷积。

(1)先计算窗函数的DTFT:

窗函数

38e518e95224d1675bcced83a80195e4.png

w[n]的DTFT的计算结果为:

efff7a1fce91bc0f25d90ee247aa904e.png 

当K=8时,其幅度函数如下图所示:

 edf57ca6f5074d289a594891063accbc.png

(2)计算x[n]的DTFT

l 对xin[n]做如下变换:

41128f069abefa00dbfb3f2e125bf3b3.png 

DTFT具有下列性质:

8c83ef402633d1d92e88cbaae08710fc.png

所以

1ece3adb8fcb075043245e2e63a462aa.png

用matlab画出x[n]的DTFT的幅度函数:

4f1ddc8d7b3bc158fda1fd45dca83f95.png

以上两副图的matlab实现程序:

clc;

clear all;

 K=8

 %计算矩形窗函数DTFT变换的幅度函数

w=-pi:0.01:pi;

Ww=exp(-j*w*(K-1)/2).*sin(w*K/2)./sin(w/2)

figure (1);

plot(w,abs(Ww))

set(gca,'xtick',[-pi:pi/4:pi])

set(gca,'XTickLabel',{'-pi';'-3pi/4';'-pi/2';'-pi/4';'0';'pi/4';'pi/2';'3pi/4';'pi'})

%计算x[n]的DTFT变换

n=0:1:(K-1);

w0=3*pi/8;

xn=sin(w0*n);

ww=0:0.01:2*pi;

w1=ww-w0;

w2=ww+w0;

Ww1=exp(-j*w1*(K-1)/2).*sin(w1*K/2)./sin(w1/2);

Ww2=exp(-j*w2*(K-1)/2).*sin(w2*K/2)./sin(w2/2);

xw=(Ww1-Ww2)/(2*j);

figure (2);

plot(ww,abs(xw));

set(gca,'xtick',[0:pi/4:2*pi])

set(gca,'XTickLabel',{'0';'1pi/4';'pi/2';'3pi/4';'pi';'5pi/4';'3pi/2';'7pi/4';'2pi'})

%计算x[n]的FFT变换,并与x[n]的DTFT变换比较

hold on;

Y=fft(xn,K);

stem(2*pi/K*n,abs(Y))

如果91ac5188e3972f7a0c3ee779a2037a44.png,则可以得到x[n]的DTFT与FFT之间的关系为:

0986212f29f42c3747a9a1a05d1656e9.png

(3)总结说明

  4f1ddc8d7b3bc158fda1fd45dca83f95.png0986212f29f42c3747a9a1a05d1656e9.png

从上面两幅图,我们可以看到:

(1) 加窗函数x[n]计算出来的DTFT是连续频谱,也就是说,其包含了所有的频率分量。(2) DFT是在DTFT上采样的结果,如果输入信号的频率正好等于采样点,则计算出来的频率是精确的。

(3) 如果输入信号的频率与采样频率点不等,则计算出来的频率则不等于输入信号频率,而且会有很多泄露。实际情况,经常是这样,输入信号频率≠采样频率点。

所以说,因为窗函数的存在,其旁瓣导致有泄露;所以可以用泄露小的窗函数来减小其影响。

参考文献:

[1]RICHARD G. LYONS Understanding digital signal processing

[2]J. Fessler, chapter 5, The Discrete Fourier Transform

部分图片及文字来源于网络,如有侵权,麻烦后台留言,立马删除,谢谢!

长按图片关注微信号

f235c8ebb6bb2f20ece9165168754bc9.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值