SOGO論壇

標題: 數位訊號處理入門---傅立葉分析 [列印本頁]

作者: alphi    時間: 2012-7-8 14:12:42     標題: 數位訊號處理入門---傅立葉分析

本帖最後由 alphi 於 2012-7-8 14:38 編輯

一、前言:
法國數學家傅立葉(Fourier)在1830年提出的傅立葉級數理論(Fourier Series),大意是講任意週期函數可以用正弦波(Sin)與餘弦波(Cos)級數和表示。
如今已經成為頻譜解析(Spectrum Analysis)的基礎理論在通訊與機率、統計、物理許多領域都會使用到該理論。那有何謂傅立葉轉換(Fourier Transformation)就是具 有週期性不規則波形(例如ECG:心電圖)利用傅立葉級數的原理(任意週期性波形是由該週期的基本頻率與整數倍頻率的高次正弦波與餘閒波所組成)可以求得波形的特徵 與資訊。
二、傅立葉級數
傅立葉級數(Fourier Series)就是[有一個隨時間而變化的訊號x(t)具有週期T之連續級數時,x(t)為直流成分與週期T的倒數1/T(Hz)頻率成分與其整數倍的頻率成分n/T(Hz)所組成]。

x(t)傅立葉級數展開=(直流成分)+(係數1*基本波)+(係數2*2次高諧波)+(係數3*3次高諧波)+....(係數n*n次高諧波),其公式如下
  

  直流成分:表示輸入訊號的平均值
  高頻率成分:表示各高次諧波所占比率,由這些係數可以了解輸入波形的特徵。因此可以供各種波形分析之用。

三、傅立葉分析
  對被取樣後有限個數訊號做傅立葉轉換稱為離散傅立葉轉換(DFT:Discrete Fourier Transformation)。傅立葉轉換是求傅立葉級數之係數所做的處裡,針對傅立葉轉
  換要處裡的訊號可以用下列複數(Complex Number)表示
  
  
  
  因此做DFT(離散傅立葉轉換)之後轉換結果也為複數,如以下表示
  

四、程式碼
  由於此程式碼強調可讀性而非效能
  1.   #include <stdio.h>
  2.   #include <stdlib.h>
  3.   #include <math.h>
  4.   #define PI 3.14159265358
  5.   
  6.   typedef struct Complex
  7.   {
  8.      double r;
  9.      double i;
  10.   }Complex

  11.   void DFT(Complex *x,unsigned int N);
  12.   int main(int argc,char **argv)
  13.   {
  14.   }
  15.   void DFT(double *x,unsigned int N)
  16.   {
  17.       Complex X;

  18.       unsigned int n,k;
  19.       
  20.       for(k=0;k<N;k++)
  21.       {
  22.          x[k].i=0;
  23.       }
  24.       for(n=0;n<N;n++)
  25.       
  26.            X.r=0;
  27.            X.i=0;

  28.            for(k=0;k<N;k++)
  29.            {
  30.                X.r+=x[k].r*cos(2.0*PI*n*k/N)+x[k].i*sin(2.0*PI*n*k/N);
  31.                X.i+=x[k].r*cos(2.0*PI*n*k/N)-x[k].i*sin(2.0*PI*n*k/N);
  32.            }
  33.            printf("%f %f",X.r,X.i);
  34.       }
  35.   }
  36.   
複製代碼
頻譜分析
   頻譜分析(Spectrum Analysis)就是將訊號從時域轉換成頻域之後要分析的資料,如著眼在振幅就成為振幅頻譜(Amplitude Specturm),目前常見的三種頻譜
   為
   (a)功率頻譜(Power Spectrum)
      
   (b)振幅頻譜(Amplitude Spectrum)
        
   (c)相位頻譜(Phase Spectrum)

   功率頻譜的函式
  1.    void Power(Complex *x,const unsigned int N)
  2.    {
  3.             Complex X;
  4.             unsigned int k;
  5.             for(k=0;k<N/2;k++)
  6.             {
  7.                  X.r=pow(x[k].r,2.0);
  8.                  X.i=pow(x[k].i,2.0);

  9.                 printf("%f %f",X.r,X.i);         
  10.             }
  11.    }
  12.    
複製代碼
振幅頻譜的函式
  1.    void Amplitude(Complex *x,const unsigned int N)
  2.    {
  3.             Complex X;
  4.             unsigned int k;
  5.             for(k=0;k<N/2;k++)
  6.             {
  7.                  X.r=sqrt(pow(x[k].r,2.0));
  8.                  X.i=sqrt(pow(x[k].i,2.0));

  9.                 printf("%f %f",X.r,X.i);         
  10.             }
  11.    }
  12.    
複製代碼
相位頻譜的函式
  1.    void Amplitude(Complex *x,const unsigned int N)
  2.    {
  3.             Complex X;
  4.             unsigned int k;
  5.             for(k=0;k<N/2;k++)
  6.             {
  7.                  X.r=atan((x[k].r/x[k].i));
  8.                  X.i=atan(x[k].r/x[k].i));

  9.                 printf("%f %f",X.r,X.i);         
  10.             }
  11.    }
  12.    
複製代碼


附件: fouries1.png (2012-7-8 13:43:28, 5.02 KB) / 下載次數 59
https://oursogo.com/forum.php?mod=attachment&aid=MjU4MjU4N3wyYzAwMDRjYnwxNzUzMTkwNzk5fDB8MA%3D%3D

附件: fourier2.png (2012-7-8 13:53:17, 982 Bytes) / 下載次數 51
https://oursogo.com/forum.php?mod=attachment&aid=MjU4MjY2Mnw5NDhmMjdjM3wxNzUzMTkwNzk5fDB8MA%3D%3D

附件: fourier3.png (2012-7-8 13:59:43, 2.66 KB) / 下載次數 55
https://oursogo.com/forum.php?mod=attachment&aid=MjU4MjcwNHxmYzJhODIxNHwxNzUzMTkwNzk5fDB8MA%3D%3D

附件: fourier4.png (2012-7-8 14:24:43, 824 Bytes) / 下載次數 52
https://oursogo.com/forum.php?mod=attachment&aid=MjU4Mjg3OXxmNzk2OWI0NnwxNzUzMTkwNzk5fDB8MA%3D%3D

附件: fourier5.png (2012-7-8 14:34:08, 874 Bytes) / 下載次數 59
https://oursogo.com/forum.php?mod=attachment&aid=MjU4MjkxNXw0Zjg0YjVkNnwxNzUzMTkwNzk5fDB8MA%3D%3D

附件: fourie6.png (2012-7-8 14:35:36, 1.21 KB) / 下載次數 55
https://oursogo.com/forum.php?mod=attachment&aid=MjU4MjkyM3xmYzNhMTBjNHwxNzUzMTkwNzk5fDB8MA%3D%3D
作者: mm117777    時間: 2012-7-8 14:22:48

支持加1希望能多看到您的文章感恩合十
作者: didolin    時間: 2012-9-9 01:55:24

接下來就要玩調變了
傅立葉轉換真的非常重要
尤其是在通訊原理或訊號處理中
個人認為傅立葉是19世紀最偉大的數學家之一
作者: q2399    時間: 2014-10-26 17:11:37

感謝大大的分析加上程式,提供驗證的方法




歡迎光臨 SOGO論壇 (https://oursogo.com/) Powered by OURSOGO.COM