对傅里叶变换的重新认识

         对于傅里叶变换,以前在大学时期就接触过,从高数中的傅里叶级数,到工程数学中学的傅里叶变换,拉普拉斯变换及Z变换,最后到大学专业课里学到的离散傅里叶变换,快速傅里叶变换(FFT),感觉整个大学都是一路傅里叶变换过来的。不过大学时不以为而然,当时认为小小傅里叶变换不掌握也没关系,其他高大上的理论多的是,可是没想到它却是那么的重要。研一刚刚上完,体会最为深刻,无数门学科都在研究傅里叶变换,各种应用有木有。整的我们这种学渣心里好难过啊,在图像处理,图像压缩中你会看到傅里叶变换的魅力,在阵列信号估计中你会看到傅氏变换快速求解自相关函数的神奇,在随机信号功率谱估计中又是一大推的傅氏变换变性应用。深深懊悔以前没有学好,学透傅里叶变换。

       今天特意来梳理一下傅里叶家族的各种理论。从信号周期性角度来看,傅里叶家族分为傅里叶级数与傅里叶变换,傅里叶级数是专门针对周期性信号来说的,傅里叶变换是针对有限非周期信号来说的。不管是级数还是变换,其本质是任意信号用正余弦信号来表示。大学里学到sin与cos有种正交性,类似2维向量空间的x轴单位向量i和y轴单位向量j,我们知道任何2维向量都可以用ai+bj来表示。由此来理解傅里叶变换(广义)也就不难了。对于这种正交性其实特别重要,别看它简单,其实恰恰是许多深奥理论的核心。上学期学的自适应滤波中,维纳滤波与卡尔曼滤波都很好的体现了正交原理的应用,维纳霍夫方程是其核心,Rw=P,用期望可以表示为E{u(n-i)e(n)} = 0,其中i = 0,1,...,M-1。可以看出估计误差e(n)与n时刻的每个抽头的输入样本在统计意义下相互正交。由此可以更清楚的看出误差e,估计值d0,期望值d,这三者正好在统计意义下构成一个完美的直角三角形。饶了一大圈你会发现这些难懂的理论背后却是一个简单的正交原理,一个简单的勾股定理,而勾股定理又不需要文字证明,真的很神奇。这是让我想起了本学院万大牛上课时说的一句话,“往往一个复杂的理论,其本身是非常简单的,而一个看似特别简单,特别直觉的理论,其数学背景却是非常宏大的”。。。。嘿嘿,扯远了,要说傅氏变换的,居然扯到维纳滤波去了。。。

        言归正传,傅里叶变换从信号的连续与离散,周期与非周期总共有4种形式。

1.非周期连续时间信号的傅里叶变换

2.周期连续时间信号的傅里叶级数及傅里叶变换表示

3.非周期序列的傅里叶变换

4.周期序列的离散傅里叶级数

         (具体的公式就不打了,网上一查就知道。)

      由于计算机只能处理离散型数据,所以一般要求时域离散,频域离散,这就是DFT。对于DFT的计算量还是挺大的,这也是为什么早期傅里叶变换发展很慢的原因,直到近代两位科学家提出了FFT(快速傅里叶变换)才使傅里叶变换发挥巨大作用。FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。一般现实生活的信号多为模拟信号,必须通过ADC采用转变成离散信号才能给计算机处理。FFT的具体实现过程在这里就不多说了,蝶形运算具体实现方式可以在别的地方找到,这里只是介绍一下FFT的具体使用(MATLAB)。一个频率为100HZ的正弦信号,用采样频率fs=1000HZ用采样,采N=1000个点,相当于采样一秒钟。信号un有N的值,对于FFT变换后的N个频率值,FFT变换后的频率范围为0~(N-1)/N*fs,间隔为1/N*fs。所以傅里叶变换的频率分辨率为fs/N。要想提高频率分辨率就必须要增加N。大学时候老师也会提一下,在un后面补零不能增加频率分辨率,只是单纯增加图像分辨率而已。有一点非常重要,就是FFT变换后个频率点的幅值怎么求。假设FFT之后某点n用复数a+bi表示,那么这个复数的模就是An=根号a*a+b*b,相位就是Pn=atan2(b,a)。根据以上的结果,就可以计算出n点(n≠1,且n<=N/2)对应的信号的表达式为:
An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn)。对于n=1点的信号,是直流分量,幅度即为A1/N。简单来说就是除第一个点外其他点各除N/2,第一个点除N。

      举个小例子来看一下:
     %三个正弦信号加高斯白噪声
     %采样频率fs=2048HZ
     %三个信号的频率分别为f1=60HZ,f2=500HZ,f3=1500HZ
     %采样点数为N=2028
      N = 512;
      f1 = 60;
      f2 = 500;
      f3 = 800;
      fs = 2048;
      n = linspace(0,(N-1)/fs, N);
      signal1 = 10*sin(2*pi*f1*n);
      signal2 = 20*sin(2*pi*f2*n);
      signal3 = 5*sin(2*pi*f3*n);
      noise = randn(1, N);
      un = signal1 + signal2 + signal3 + noise;

      在时域中,我们一般是很难分辨这些正弦信号的,不信你看:

对傅里叶变换的重新认识_第1张图片

     

      Uk = fft(un);

      Uk = Uk / (N/2);    %由于直流分量为0,所以直接全部除以N/2

对傅里叶变换的重新认识_第2张图片

可以看到三个信号频率的分布。但是为什么是6根线呢,因为信号频谱相对于fs/2对称。一般我们只用左边一半的数据。

如果你觉得看着麻烦,也可以利用fftshift()来转变一下。将频率范围变成 -(N-1)/N*fs/2到(N-1)/N*fs/2。

Uk = fftshift(Uk);

figure(1);
x = linspace(-(N-1)/N*fs/2, (N-1)/N*fs/2, N);
plot(x, abs(Uk));
hold on;
对傅里叶变换的重新认识_第3张图片

     这只是FFT最最基本的应用,在功率谱估计中,还有阵列信号的DOA估计和波束形成中应用更加深入。好啦,今天就先写到这里吧,基本的傅里叶变换知识都说到了,至于一下细节以后遇到哪里看哪里吧。

你可能感兴趣的:(Algorithm)