离散傅立叶变换,快速傅立叶变换和傅里叶级数

 

目的:要学习通讯或者从事通讯行业都免不了要接触傅立叶变换,傅立叶变换有很多形式包括积分形式和离散形式的,公式也是各种积分或者累加,我在学习的初始是直接背下来这些公式,并没有想过每个公式里变量和积分以及累加的含义。因此现在有了写一篇关于傅立叶变换的博客的想法。本篇主要以最简单的cos(t)为例,以Matlab为媒介,比较Discrete Fourier Transform(DFT)和Fast Fourier Transform (FFT)。这是因为DFT是我在学习信号处理时老师直接给的公式,而FFT确是Matlab提供的用于傅立叶变换的函数,所以我想用最简单的cos(t)来表示傅立叶变换的含义以及这两种的不同和为什么要用FFT。

 

我们都知道傅立叶变换的作用是将信号从时域变换到频域,频域即横坐标为频率,纵坐标可以是相位也可以是幅值(本篇都用幅值做纵坐标)。具体变换的原理是任何信号都可以由多个不同频率的正弦函数和余弦函数相加组成,而如果我们在以频率为横轴和幅值为纵轴的坐标系里把这些分量表示出来就形成了这个信号的频域图。而对于cos(t),它的角频率是1(为了方便以下的例子会用角频率表示横坐标,角频率和频率的关系为ω=2πf),因此理想的情况下cos(t)经过傅立叶变换后只会在为1的时候幅值不为零。下面会就DFT和FFT两种方法对cos(t)进行傅立叶变换并比较。


首先cos(t)的时域图如下所示

                                              图一

这里显示的是0~2π的cos(t)时域图,其中0~2π中取了63个点,因此采样频率为63/2π,再乘以2π得到角频率63(这里63大于1,也是符合奈奎斯特采样定理的)。即cos(t)的频域图会在63的倍数循环(这是因为信号的频域会在采样频率处循环)。


  1. DFT

离散傅立叶变换:(1)

逆变换为:    (2)

对cos(t)进行DFT变换后得到的频域图如下图所示

                                                   图二

由上图可以看到,在角频率为1,-1以及以63为周期循环的相应点的时候幅值达到最大值,其他的时候幅值虽然很小,但并不为零。理想情况下其他时候应该为零,那么是傅立叶变换出错了吗,其实并不是这样。我们再回到式子(1)和(2),首先这是并不是DFT的公式,这其实是离散时间傅里叶即Discrete-Time Fourier Transform(DTFT)的变换公式。那么DTFT和DFT的区别在哪里,就是 ω 和n的取值。DTFT是要取到 ω 以及n的所有值,这显然是不可能的。而DFT则是等间隔有限的去取值。这也是我在学习的时候被困扰了很久的地方。为了弄清楚这是怎么回事,我们需要了解傅里叶级数。


 

  • 傅里叶级数(Fourier Series)

傅里叶级数指出给定一个周期为T的函数x(t),那么它可以表示为无穷级数:

    (3)

其中,ak可以按照下式计算:

 (4)

在式子(3)中,T为x(t)的周期,那么2π/T即为ω0原函数x(t)的角频率。

那么(3)则可以表示为:

       (5)

但是x(t)其实只是一个求瞬时值的函数关系时,如果要表示一段无穷时间的x(t),我们可以对t在负无穷到正无穷上求和。那么可以表示为下面(6)式:

     (6)

这时如果我们对x(t)进行采样得到了x(n),同时令ω=k*ω0,那么这个时候(6)可以变换为以下(7)式:

     (7)

得到(7)式有点奇怪,需要进行化简。


  • 采样频率

首先我们先来理解(7)中的ω这个变量代表什么意思。我们知道一个信号我们可以用不同频率的采样频率去对这个信号进行采样,那么这个采样频率就是一个变量,他是可以变化的,我们定义为ωs。其实ωs就是(7)中的变量ω。

为什么呢, 下面我们进行进一步分析。

假设一个信号的周期为T,角频率为ω0。我们通过采样得到在一个周期的时间段有M个点。

由此我们得到采样频率的公式 ωs=(M/T)*2*π    

并且由于ω0=2*π/T,得到ωs=M*ω0。可以看到采样频率和信号本身频率的关系。并且M的范围是负无穷到正无穷,为什么呢。首先理论上我们可以无限制的采样,即M可以达到无穷值。负值则是相对于正值,其实不要想的太复杂,如果定义cos(t)采样得到M是正的,那么-cos(t)采样得到的M就是负的,因为很明显cos(t)和-cos(t)式不同的,所以我们要用正负的M来表示不同的情况(也可以根据欧拉公式去理解)。那么到这里就很明显了,在(7)式中的k就是我们这里的M,而ωs就是(7)里定义的ω。


  • 继续i里面的推导

通过化简我们可以得到:

    (8)

这里我们看到(8)式已经跟离散傅立叶变换公式很接近了,我们两遍同时乘以e^(-j*ωs*n),可以得到如下式子:

   (9)

通过(9)我们可以看到为什么傅里叶正变换式乘以e^(-j*ωs*n),而逆变换是乘以e^(j*ωs*n)。但是(9)还是可以进行再次化简,在之前有提到,定义的m是一个信号周期采样得到的点数,因此m可以包含在n里面。

    (10)

终于到了(10),我们得出了DTFT的式子了即最开始给出的(1)。我们先来理解一下(10)是什么意思,一个信号可以由不同频率的分量正余弦函数组成,这是如果我们把这个信号与e^(-j*ωs*n)相乘,即与幅度相反的不同频率的e^(-j*ωs*n)相乘,那么某个真正系数不为零的分量通过这样的变换就可以把系数求出来,而且我们还能得到相应的频率。这就是通过傅里叶变化求解信号的组成信号频率的原理。根据(10)式,理论上来说ωs和n取的值越多即从负无穷到正无穷,我们得到的结果就越准确。但是显然这是不可能的,我们只能取到ωs 和x(n)的一部分值,也就是我们实际上是利用DFT做运算得到了图二,这也是图二得到结果不准确的原因。而且还有一点,这里我们用cos(t)做DTFT得到了图二,本来cos(t)只取了63个点,但经过变换后,我们可以看到在图二中远远多于63个点,当然这也是为了取更多的频率值,同时也增加了复杂程度。


  1. FFT

首先我们利用Matlab里提供的fft函数来求cos(t)的傅立叶变换,得到如下图三

                                              图三

我们可以看到,非常完美而且准确。并且只有63个点跟原信号的长度一样。

这里Fast Fourier Transform(FFT)之所以快的原因,我们知道我们需要去用不同频率的分量去与x(n)相乘,然而当x(n)的长度很大的时候,计算程度就很复杂了。FFT是利用交换相乘因子的顺序,即频率不一定要从等于0开始,通过这样来提高速度。而且FFT的准确度也是很高的,完全符合理论值,果然软件提供的函数就是不一样,哈哈。


总结:最后来一下小小的总结,其实关于傅立叶变换还有很多没有写上来,但是我选择了离散变换是因为我觉得离散变换在数字信号处理中是非常重要的。我在学习的时候,由于不理解公式里每个变量的含义,导致并没有真正理解,这也是我中途全部推了一遍公式的原因。最后一句话,我的感概就是傅立叶变换十分的重要,是无线通讯的基石,而且公式的每个变量都有它存在的意义和含义,只有理解了才能真正弄懂。耶。。。



 

 

 

猜你喜欢

转载自www.cnblogs.com/boublehuang/p/9236783.html