上一篇我们介绍了傅里叶变换,但是也指出了现实情况中不能直接应用傅里叶变换这一缺点,就此我们这一篇来介绍离散傅里叶变换和快速傅里叶变换。
实际上由于我们现在的信号都是数字信号,他们只是一串给定了采样间隔的数据,比如对于一个模拟出的连续信号$f(t)=cost$,可能会按照某个采样间隔$T_s$来进行采样,但是由于许多时候这个间隔都很小,所以我们一般用采样频率$f_s=1/T_s$来进行叙述。这也好理解,因为采样必须要是一个有规律的周期过程。
但是如果我们用直接的想法:把离散的点拟合成连续函数,再傅里叶变换,即使我们现在不考虑无穷积分,直接应用傅里叶变换,结果并不唯一,会发现好几组频率似乎都满足条件。同时为了解释这一现象,我们要先理解采样的这一过程。
采样利用的是狄拉克梳状函数,也叫采样函数:
实际上在我做的事情里给到我手里的就是一组采样以后的数据,介绍这些只是为了给采样这个过程加以数学描述,这样的话才方便引入离散傅里叶变换。
狄拉克函数(右边的那个)有筛选性质,这一点很有用:
同时为了后面的叙述,这里还要给出采样函数的傅里叶变换,显然由于采样函数是周期函数:
放在一起看,如何进行采样就呼之欲出了,即:
这样我们就对一个连续的序列进行了采样,正是利用的狄拉克函数,那么接下来就可以利用连续信号的傅里叶变换来推导出离散情况下的傅里叶变换:(利用改了狄拉克函数的筛选性质)
此时信号序列已经被离散成了$x(nT_s)$,对数字信号来说,采样后的信号是一个类似数列的序列,我们一般将其写成:
但是问题在于,现在虽然信号变成离散的了,但求和上下界还是无穷,计算机还是不能直接计算,所以频谱也要离散化,实际上我们差一点就能解决了这个问题了,我们知道,当我们引入狄拉克函数后,更一般的函数也可以进行傅里叶展开了,我们考虑:对于连续信号$x(t)$按照采样时间$T_s$进行$N$次抽样,将这$N$个数值进行周期延拓,这其实就解决了我们的问题,周期延拓后采样信号被表示为:
由于进行了周期延拓,我们作傅里叶级数:
如果看到这里觉得很困惑,不妨回忆一下傅里叶变换和傅里叶级数,实际上傅里叶级数就是分立的傅里叶变换,傅里叶变换是傅里叶级数向连续情况下的推广。当我们用傅里叶级数展开某个函数时,系数就代表了频率分量,但是此时的频率都是$n\omega$,当在傅里叶变换时,我们得到了连续的频率谱,在这里,我们也是对一个“连续函数”来求傅里叶级数,以来得到离散形式的频率信息,只不过这个“连续函数”是一个真实的连续函数与狄拉克函数的乘积,并且作了周期延拓。
最后的操作是进行整理,记一个序列为$X[k]$:
在这种情况下我们如何获得频率信息呢?过程如下:
所以上面计算出的第$k$个数对应的频率可以由上面的公式计算。
所以实际上,会给人一种开倒车的感觉,离散形式下的傅里叶变换,其实就是某种傅里叶级数,只不过之前计算傅里叶计数时,例如:
形如这样的离散频率的系数,对于我们要处理的数字信号,其实就是$f(x)=x$变为了一个由连续信号和狄拉克函数组成的特殊函数。
在最后留下两个坑,以后有空再填:
①最开始的好几组频率都符合要求,是由于混叠现象,这个问题最终的答案为:如果想避免混叠在对连续信号进行抽样离散时,必须保证采样频率是原连续信号最大频率分量的2倍频率以上。(采样定理),由于我做的工作里大部分时候是处理已经被给定的信号,所以这个部分等后面有空再谈论、
②实际上我们确实得到了离散傅里叶变换的表达式,但是实际上现在实现这个变换的方法是快速傅里叶变换,它已经被集成在了matlab和python的scipy里,它最后的结果和我们推导出的完全一致,但显著的减少了需要的计算时间,后面我们会介绍它的算法原理。