有限长离散变换(DFT)理解
DTFT与DFT的关系
之前在Signals And Systems里学傅里叶变换时讲到了几种傅里叶变换,留下了DFT放在DSP里深入学习。本质上来说DFT就是DTFT的频域采样过程,也是DSP的关键步骤。可是在学习中还是对DFT很多性质不明白
我们知道计算机能处理的都是离散的值,DTFT中得到的频谱仍然是连续的,因此需要对频谱进行一个采样的过程使之能够被计算机处理。
首先对模拟信号进行采样,对一个以2π为周期的COS函数用适当的冲激串采样后如左图所示,这里采用N=64,采样了两个周期。然后采样了一个指数函数,右图所示。
在查看DFT结果之前,先看看DTFT的结果是什么样的:由DTFT计算公式很容易推出上图,这就是理想情况下使用DFT在频域上采样后应该得到的图形。这里的横坐标应该是一个周期内的w。进行DFT的目的其实就是为了在计算机内能够得到这样一幅曲线,但是实际上DTFT的频谱是连续的,计算机只能逼近DTFT的结果,这就需要DFT对频域进行采样,将连续的频域离散化。
对频域进行采样就有了另外一个问题:频域相乘对应时域卷积,也就是说采样这个过程实际上相当于时域上卷积了一个东西,它可能改变了原有的输入信号,分别以上面两个函数为例。首先是COS函数:
左图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:
左图N=64,右图N=180。
可以看到随着N的增大,整个图像并没有出现明显失真,反而是随着N的增大越来越逼近DTFT的频域曲线。这也可以用时域加窗的思路来理解。指数函数本身并没有周期,时域上加的窗越长就能获得越多的信息,图像就越逼近理想DTFT曲线,这其实也是计算机内部模拟DTFT计算的原理:增大N值使用DFT来逼近DTFT的结果。
可以想到,当信号频率成分复杂时,从时域加窗的角度,使用DFT也会有很多限制,N取得较小时,频谱很容易泄漏,也就就是所谓的频谱分辨率不够。此时一般两种做法:要么提高N点数,要么使用更高级的滤波器,这就是DSP的后续内容了。
来源:CSDN
作者:Hzfzzzi.
链接:https://blog.csdn.net/weixin_42151296/article/details/103484977