- 註冊時間
- 2004-10-30
- 最後登錄
- 2024-7-27
- 主題
- 查看
- 積分
- 265
- 閱讀權限
- 50
- 文章
- 219
- 相冊
- 0
- 日誌
- 0
狀態︰
離線
|
本帖最後由 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(離散傅立葉轉換)之後轉換結果也為複數,如以下表示
四、程式碼
由於此程式碼強調可讀性而非效能- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #define PI 3.14159265358
-
- typedef struct Complex
- {
- double r;
- double i;
- }Complex
- void DFT(Complex *x,unsigned int N);
- int main(int argc,char **argv)
- {
- }
- void DFT(double *x,unsigned int N)
- {
- Complex X;
- unsigned int n,k;
-
- for(k=0;k<N;k++)
- {
- x[k].i=0;
- }
- for(n=0;n<N;n++)
-
- X.r=0;
- X.i=0;
- for(k=0;k<N;k++)
- {
- X.r+=x[k].r*cos(2.0*PI*n*k/N)+x[k].i*sin(2.0*PI*n*k/N);
- X.i+=x[k].r*cos(2.0*PI*n*k/N)-x[k].i*sin(2.0*PI*n*k/N);
- }
- printf("%f %f",X.r,X.i);
- }
- }
-
複製代碼 頻譜分析
頻譜分析(Spectrum Analysis)就是將訊號從時域轉換成頻域之後要分析的資料,如著眼在振幅就成為振幅頻譜(Amplitude Specturm),目前常見的三種頻譜
為
(a)功率頻譜(Power Spectrum)
(b)振幅頻譜(Amplitude Spectrum)
(c)相位頻譜(Phase Spectrum)
功率頻譜的函式- void Power(Complex *x,const unsigned int N)
- {
- Complex X;
- unsigned int k;
- for(k=0;k<N/2;k++)
- {
- X.r=pow(x[k].r,2.0);
- X.i=pow(x[k].i,2.0);
- printf("%f %f",X.r,X.i);
- }
- }
-
複製代碼 振幅頻譜的函式- void Amplitude(Complex *x,const unsigned int N)
- {
- Complex X;
- unsigned int k;
- for(k=0;k<N/2;k++)
- {
- X.r=sqrt(pow(x[k].r,2.0));
- X.i=sqrt(pow(x[k].i,2.0));
- printf("%f %f",X.r,X.i);
- }
- }
-
複製代碼 相位頻譜的函式- void Amplitude(Complex *x,const unsigned int N)
- {
- Complex X;
- unsigned int k;
- for(k=0;k<N/2;k++)
- {
- X.r=atan((x[k].r/x[k].i));
- X.i=atan(x[k].r/x[k].i));
- printf("%f %f",X.r,X.i);
- }
- }
-
複製代碼 |
-
總評分: 威望 + 2
查看全部評分
|