日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java fft 频谱算法_快速傅里叶变换(FFT)算法原理及代码解析

發(fā)布時間:2025/4/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java fft 频谱算法_快速傅里叶变换(FFT)算法原理及代码解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

FFT與DFT關系:

快速傅里葉變換(Fast Fourier Transform)是離散傅里葉(DFT)變換的一種快速算法,簡稱FFT,通過FFT可以將一個信號從時域變換到頻域;FFT(快速傅里葉變換)其本質(zhì)就是DFT,只不過可以快速的計算出DFT結果,它只是傅立葉變換算法實現(xiàn)過程的一種改進。

要弄懂FFT,必須先弄懂DFT,DFT(DiscreteFourier Transform) 離散傅里葉變換的縮寫,咱們先來簡單討論一下DFT。DFT(FFT)的作用:可以將信號從時域變換到頻域,而且時域和頻域都是離散的,通俗的說,可以求出一個信號由哪些正弦波疊加而成,求出的結果就是這些正弦波的幅度和相位。

DFT的公式:

其中X(k)表示DFT變換后的數(shù)據(jù),x(n)為采樣的模擬信號,公式中的x(n)可以為復信號,實際當中x(n)都是實信號,即虛部為0,此時公式可以展開為:

那么,對于一個 的序列進行不斷分解,就可以得出如下所謂的蝶形圖:

FFT處理蝶形運算

蝶形運算的規(guī)律:同一級中所有蝶形的輸入點在同一豎直線上,意味著我們可以按級來運算,對于M級的蝶形,編個M次循環(huán)就好了;所有數(shù)據(jù)點在運算后不會竄位,即計算后可以將結果存入原來的地址空間。

每級N/2個蝶都需要用到系數(shù)WN,這里稱它為旋轉因子。我們來觀察旋轉因子WN的規(guī)律。以8點的蝶形圖為例:

可見,第L級的旋轉因子為:

可以看到,每個蝶的兩個輸入點下標跨度是不一樣的。比如第一級中是相鄰兩個數(shù)據(jù)作蝶運算,第二級中是兩個輸入點隔開一個點,而第三級隔開三個點。不難找到規(guī)律:第L級中,第二個輸入點的坐標是第一個點的坐標+space,space=Math.Pow(2, L)=num。

FFT的算法是寫一個三重循環(huán):第一重循環(huán)對每一級運算(每級含num=Math.Pow(2, L)個蝶形);

第二重對每一個旋轉因子對應的蝶運算, 那么有幾個蝶呢?很簡單,每級都應該有N/2個蝶,而每個因子對應N/2 / num個蝶;

第三重循環(huán)對每個蝶進行計算,需要注意的一是循環(huán)下標起始點的位置,二是每次計算需要申明臨時變量來保存輸入數(shù)據(jù)點。

實現(xiàn)代碼:

FFT算法的原理是通過許多小的更加容易進行的變換去實現(xiàn)大規(guī)模的變換,降低了運算要求,提高了與運算速度。FFT不是DFT的近似運算,它們完全是等效的。

傅里葉變換的C語言編程

對于快速傅里葉變換FFT,第一個要解決的問題就是碼位倒序。假設一個N點的輸入序列,那么它的序號二進制數(shù)位數(shù)就是t=log2N。碼位倒序要解決兩個問題:將t位二進制數(shù)倒序;

將倒序后的兩個存儲單元進行交換。如果輸入序列的自然順序號i用二進制數(shù)表示,例如若最大序號為15,即用4位就可表示n3n2n1n0,則其倒序后j對應的二進制數(shù)就是n0n1n2n3。

代碼如下:

復數(shù)類型定義及其運算

#define N 64 //64點

#define log2N 6 //log2N=6

/*復數(shù)類型*/

typedef struct

{

float real;

float img;

}complex;

complex xdata x[N]; //輸入序列

/*復數(shù)加法*/

complex add(complex a,complex b)

{

complex c;

c.real=a.real+b.real;

c.img=a.img+b.img;

return c;

}

/*復數(shù)減法*/

complex sub(complex a,complex b)

{

complex c;

c.real=a.real-b.real;

c.img=a.img-b.img;

return c;

}

/*復數(shù)乘法*/

complex mul(complex a,complex b)

{

complex c;

c.real=a.real*b.real - a.img*b.img;

c.img=a.real*b.img + a.img*b.real;

return c;

}

/***碼位倒序函數(shù)***/

void Reverse(void)

{

unsigned int i,j,k;

unsigned int t;

complex temp;//臨時交換變量

for(i=0;i

{

k=i;//當前第i個序號

j=0;//存儲倒序后的序號,先初始化為0

for(t=0;t

{

j<>

j|=(k&1);//j左移一位然后加上k的最低位

k>>=1;//k右移一位,次低位變?yōu)樽畹臀?/p>

}

if(j>i)//如果倒序后大于原序數(shù),就將兩個存儲單元進行交換(判斷j>i是為了防止重復交換)

{

temp=x;

x=x[j];

x[j]=temp;

}

}

}

總結:

FFT是離散傅立葉變換的快速算法,可以將一個信號變換到頻域。有些信號在時域上是很難看出什么特征的,但是如果變換到頻域之后,就很容易看出特征了。這就是很多信號分析采用FFT變換的原因。另外,FFT可以將一個信號的頻譜提取出來,這在頻譜分析方面也是經(jīng)常用的。

總結

以上是生活随笔為你收集整理的java fft 频谱算法_快速傅里叶变换(FFT)算法原理及代码解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。