欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

有限长离散变换(DFT)理解

程序员文章站 2022-06-08 18:42:31
...

有限长离散变换(DFT)理解

DTFT与DFT的关系

之前在Signals And Systems里学傅里叶变换时讲到了几种傅里叶变换,留下了DFT放在DSP里深入学习。本质上来说DFT就是DTFT的频域采样过程,也是DSP的关键步骤。可是在学习中还是对DFT很多性质不明白
我们知道计算机能处理的都是离散的值,DTFT中得到的频谱仍然是连续的,因此需要对频谱进行一个采样的过程使之能够被计算机处理。
有限长离散变换(DFT)理解
首先对模拟信号进行采样,对一个以2π为周期的COS函数用适当的冲激串采样后如左图所示,这里采用N=64,采样了两个周期。然后采样了一个指数函数,右图所示。
有限长离散变换(DFT)理解
在查看DFT结果之前,先看看DTFT的结果是什么样的:由DTFT计算公式很容易推出上图,这就是理想情况下使用DFT在频域上采样后应该得到的图形。这里的横坐标应该是一个周期内的w。进行DFT的目的其实就是为了在计算机内能够得到这样一幅曲线,但是实际上DTFT的频谱是连续的,计算机只能逼近DTFT的结果,这就需要DFT对频域进行采样,将连续的频域离散化。

对频域进行采样就有了另外一个问题:频域相乘对应时域卷积,也就是说采样这个过程实际上相当于时域上卷积了一个东西,它可能改变了原有的输入信号,分别以上面两个函数为例。首先是COS函数:
有限长离散变换(DFT)理解
左图N=64,右图N=80。

// DFT MATLAB实现
r=2;
N=64;
n=[0:63];

Xn=cos(2*pi*r*n/N);
Xr=1*exp(-n);

subplot(2,2,1);
Xk1=fft(Xn,64);
stem(abs(Xk1))
subplot(2,2,2);
Xk2=fft(Xn,80);
stem(abs(Xk2));

可以看到,MATLAB内置函数fft要求你提供两个参数,第一个是原有序列,第二个是采样点数N。他的含义就是拿这N个点去采样原来的那个COS函数。一开始学的时候这里非常容易弄混,因为DFT实现频域离散化的原理实质上就是在时域上加窗,这里的N就是加矩形窗的长度。当N=64或其他周期的整倍数时,矩形窗正好截取到了完整的COS函数,因此在这基础上的DFT与DTFT就相同了,因为他们两个此时变换的其实是同一个序列。

可是当N=80或其他非周期的数值时,矩形窗截取的周期性就被打断了,此时时域加窗截取到的是不完整的COS函数。而DFT的分析中将这个不完整的COS函数当作基波周期,换句话说就是DFT分析认为现在截取到的这个不懂是什么东西的80个点它本来是周期的,对这个函数进行了DFT变换。而DTFT没有加窗这一步,它分析的是整个时域上的离散信号,COS函数在整个时域上是周期的,因此差别就体现出来了。频域上的抖动是因为时域的加矩形窗这个操作相当于频域上COS与SINC函数相乘,得到了这个结果。

接下来就很容易想到另一个问题:实际中根本不会有这种这么完美的周期信号,那么他们的DFT是什么样的呢?接着对指数函数进行DFT:
有限长离散变换(DFT)理解
左图N=64,右图N=180。

可以看到随着N的增大,整个图像并没有出现明显失真,反而是随着N的增大越来越逼近DTFT的频域曲线。这也可以用时域加窗的思路来理解。指数函数本身并没有周期,时域上加的窗越长就能获得越多的信息,图像就越逼近理想DTFT曲线,这其实也是计算机内部模拟DTFT计算的原理:增大N值使用DFT来逼近DTFT的结果。

可以想到,当信号频率成分复杂时,从时域加窗的角度,使用DFT也会有很多限制,N取得较小时,频谱很容易泄漏,也就就是所谓的频谱分辨率不够。此时一般两种做法:要么提高N点数,要么使用更高级的滤波器,这就是DSP的后续内容了。

相关标签: 数字信号处理