从傅里叶级数(Fourier series)到离散傅里叶变换(Discrete Fourier transform)
一. 傅里叶级数(FS)
首先从最直观的开始,我们有一个信号(x(t))(满足Dirichelet条件),先假设它是周期的,为了研究它,我们使用级数将之展开,展开方法如下
现在问题就是如何求解(a_k)。因为三角函数是正交系,即
这样我们就可以进行如下操作:
对(1)式左右同时积分:
由于
故(3)积分的结果如下:
于是我们得到了(a_k):
这样我们就把一个周期信号分解成了一系列模为(a_k)的复周期信号的组合,形象表示就是这样:
OK,到这里我们成功将一个周期信号分解成了傅里叶级数。但是这里也有两个问题依然困扰着我:
1.首先(相信大家也注意到了我第一句标黄的内容),非周期有限信号能不能展开成傅里叶级数呢?
比如,如果有一个函数,它是这样的:
我们同样可以在0-T上做积分,并且得到(s(t))的(a_k)和(x(t))的(a_k)是相同的,也就是说,可以把s(t)写成:
但是咱也理解,这样的一个式子大概率不能叫做级数,充其量叫个级数的一部分。不过我们主要研究信号,就不关心这些数学概念了。那么对于这样的一个信号,傅里叶级数还能不能表达它的频谱特性呢?它的频谱跟(x(t))又有什么联系呢?,这两个问题我们在第二部分解答。
2. 三角函数系的正交性强调的是一个周期内的积分,但是没有说一定是最小正周期,如果我们在(2T)、(3T)或者(nT)上积分,会发生什么呢?
回答这个问题之前,我们先对傅里叶级数做一个比较统筹的显示,我们不妨以(w)作为横坐标,以(a_ke^{jkw_0})的强度(也就是(||a_ke^{jkw_0}||=|a_k|))作为纵坐标,构建一个二维直角坐标系(数据大小是随便给的):
分析这个图,我们知道每两个”柱子“之间的距离应该是(Delta w=w_0=frac{2pi}{T}),所以,如果我们增大T,两个数据之间的距离就会变小,如下:
可以看到,(T)越大,两个数据之间的横轴距离就越小,不妨做个猜想:当(Tto infty)时,这个离散的谱就变成了连续谱。是这样吗?应该说对有限信号是这样的,对无限周期信号则不是,这是为什么呢?请看下一节傅里叶变换的解读。
二. 傅里叶变换(FT)
2.1 傅里叶变换的推导
接着前面的猜想进行分析,为了得到可靠结论,我们进行如下数学分析:
接着(5)式开展:
用(w_0=frac{2pi}{T})替代(T),同时将(x(t))表示出来:
当(w_0to 0)时,可用(w_0=mathrm{d} w)表示它,此外,对于(kw_0)的累加就变成了积分(累加步长(kw_0)无限小),故而上式变成了:
这样我们实现了将一个信号分解成连续的频谱,而这个频谱就是:
(6)式就是傅里叶变换的基本形式,当然有些地方可能将系数(frac{1}{2pi})进行了一些变换,比如:
这些都是小细节,咱们就不在意了。
2.2 周期函数的傅里叶变换
观察(8)这个式子,我们很快又发现了另外一个问题,积分区域是无穷,而周期函数在无穷区间积分,那必然是发散的,怎么解呢?
我们是这样处理的:
-
首先将(x(t))表示成傅里叶级数:
[x(t)=sum_{k} a_ke^{jkw_ot} ] -
对级数做傅里叶变换,也就是:
[X(w)=sum_{k} F(a_ke^{jkw_ot})=a_ksum_{k} F(e^{jkw_0t})tag{9} ]
于是问题转化成了如何求(e^{jkw_0t})的傅里叶变换,这个就要使用傅里叶变换的基本性质了:信号乘以(e^{jw_0t})相当于傅里叶变换(X(w))进行频移(w_0), 这个我们也可以顺便证明一下:
又由于:
所以:
把(10)代入(9),就得到了周期函数的傅里叶变换:
可以看出,周期函数的傅里叶变换是一系列冲击串,这个倒也符合我们的直觉:
傅里叶变换每个(X(w))可以理解为信号频率为(w)的分量的大小,对于周期信号,它的每一个频率分量都是一个无限长信号,所以每一个分量的能量都是无穷的,所以在频谱上就表示为冲击串了。
2.3 有限长非周期信号的傅里叶变换
好了,现在我们来解答第一节中的第二个问题:有限长非周期信号的傅里叶变换和周期信号频谱的关系。
对于有限长信号:
可以换一种表达方式:
要求(F[s(t)]),我们首先需要以下几个结论:
-
时域相乘等于频域卷积,证明:
[若Z(w)=X(w)*Y(w),则\ begin{split} z(t)&=F^{-1}(Z(w))\ &=int_infty [int_infty X(m)Y(w-m)mathrm{d}m]e^{jwt}mathrm{d}t \ &=int_infty X(m)[int_{infty}Y(w-m)e^{jwt}mathrm{d}t]mathrm{d}m\ &=int_infty X(m)y(t)e^{jmt}mathrm{d}m\ &=x(t)y(t)\ 得证 end{split} ]注:如果从采用(z(t)=x(t)y(t)出发,去证明Z(w)=X(w)*Y(w))会比较麻烦。
-
(F[u(t)-u(t-T)]=frac{1-e^{-jwt}}{jw}),这个就很好证明了:
[begin{split} F[u(t)-u(t-T)]&=int_{0}^{T}x(t)e^{-jwt}mathrm{d}t\ &=frac{1-e^{-jwt}}{jw} end{split} ]这个函数展现的频谱图像如下:
好了,我们现在可以开始计算(6)式(s(t))的傅里叶变换了:
及(sum_{k}delta(w-kw_0)*frac{1-e^{-jwt}}{jw})就是(F[u(t)-u(t-T)])以(kw_0)移位叠加,一些一组图表示这个过程:
简单起见,我们令|X(w)|为:
对它进行卷积,也就是将下面两个信号叠加:
于是得到|S(w)|:
图不咋好看,可能是频率分辨率没调好,但是大概样子大家能看清楚了,也就是在周期信号的频谱里的冲击串变得平滑了,或者换句话说,原来集中在某个(kw_0)频率的能量一部分泄露到了全频域。
这个在物理意义上也比较好理解,把周期信号截断了,实际上是把一部分信号值变成了0,从某个值突然变到0(x(T)->0),这里没有平滑过渡,是一个突变,而我们知道,突变包含所有频率分量。
至此,我们完成了傅里叶级数到傅里叶变换的推导。
三、时域离散化
在实际应用中,我们大多处理的是数字信号,也就是时域离散的信号,我们来看看时域离散对信号频谱的影响。
这个时候,我们可以把信号表示为
根据(10),利用傅里叶变换的对偶性,可以得出:
所以(x(t))的傅里叶变换为:
也就是说,(x(n))的傅里叶变换就是下(x(t))的傅里叶变换以(w_s)为周期,移位叠加。
如上图,假设中间的三角形就是(X(w)),则它经过移位叠加后得到的上图就是(F(x(n)))。
从这张图我们也可以看出一个重要的定理——奈奎斯特采样定理:采样频率需要高于信号最高频率的两倍,因为如果不能满足
就会发生频谱混叠(上图的两个相邻三角形叠在一起了)。
这样我们就得到了时域离散信号的傅里叶变换,但是显然,这样得到的频谱也是连续的,计算机存储的是离散信号,那么如何将频域也离散化呢?请看下节。
四、DFT
回顾前面的内容,我们发现,满足频域离散的只有一种信号,那就是周期信号。于是让信号离散化的方法就呼之欲出了:
假设我们采集到的N个数据其实是一个周期信号的一个周期,或者换句话说,我们把这N点数据以N为周期进行延拓,那么接下来要做的就是对一个周期信号的傅里叶变换了,又时域是离散的,傅里叶变换就退化成了傅里叶级数形式:
现在好了,时域和频域都是离散的了,而且频域和时域一样只有N个点。并且通过上面时域离散造成频域以采样角频率(w_s)拓展的结论,我们可以知道,这个数字频谱,其实就是在长度为(w_s)的区间内插入了N个点,所以没两个点之间的频率间隔为
这个(Delta w)也叫做频率分辨率,也就是通过这个频谱能区分的两个频率最小的间隔。
这里我们再对模拟角频率(Omega)和数字角频率做一个区分:
在模拟域,频率(f)表示的是一个信号每秒重复变化的次数,模拟角频率(Omega=2pi f)表示的就是单位时间内信号相位角变换的弧度。可以把一个重复的信号想象成一个点做圆周运动,(f)表示它单位时间绕了多少圈,(w)表示它单位时间转过多少弧度。
在数字域,我们同样可以通过单位时间信号相位角的该变量来表示角频率,但是数字域只有单位1,无连续时间的概念,长度为N的序列,两个点相隔的时间是(frac{1}{f_s}),所以数字域的“时间”每改变1,角度改变应该是:
上式还可以写作(w=2pi frac{f}{f_s}),又由采样定理知(f_s>2f),所以(w<pi),但是我们常常取数字频域的(0-f_s)进行研究,也就是说(w)最大取到(2pi)(实际上是0移位一个周期得到的),可见:(w)被限制在了[0 (2pi)],所以我们也称数字角频率(w)为归一化频率。
其实上述所有的推导都能在《信号与系统》和《数字信号处理》教材里找到,我只是做了一个整理和总结,建议大家还是精读课本,写书的人一般比写博客的人强。