首页/文章/ 详情

DFT之泄露

1年前浏览3006


(1)漫画

 

(2)引言

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


这章共看了三遍:

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

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

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


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


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

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

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

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

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

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

DFT之处理增益;

 

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

 

(3)DFT泄露

 

泄露的现象

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

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

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

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

 

可以看到:

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

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

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

 

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

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

 

那为什么会产生泄露呢?

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

以下列函数为例:

为一连续时间函数。

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

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

 

绘制上图的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计算的频谱的问题,先了解一下DFTDTFT的关系,以及DTFT变换

 

DTFTDFT之间的关系:

DTFT的变换公式为:

 

DFT的变换公式为:

 

所以,如果x[n]的长度为L,且LN,则其NDFTDTFT的采样,即:

 

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

 

 时域乘积等于频域卷积。

(1)先计算窗函数的DTFT

窗函数

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

 

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

 

 

(2)计算x[n]DTFT

xin[n]做如下变换:

 

DTFT具有下列性质:

所以

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

 

以上两副图的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))


如果,则可以得到x[n]的DTFTFFT之间的关系为:

(3)总结说明

  

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

(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

来源:加油射频工程师
Fourier Transform
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-06-03
最近编辑:1年前
加油射频工程师
分享所学知识
获赞 246粉丝 82文章 559课程 1
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈