資源簡介
快速傅里葉變換算法,支持2的n次方點變換,并支持求相位操作。
代碼片段和文件信息
#include“fft.h“
#include
#include“lm9033.h“
?
/*********************************************************************
?????????????????????????快速福利葉變換C程序包
函數簡介:此程序包是通用的快速傅里葉變換C語言函數,移植性強,以下部分不依
??????????賴硬件。此程序包采用聯合體的形式表示一個復數,輸入為自然順序的復
??????????數(輸入實數是可令復數虛部為0),輸出為經過FFT變換的自然順序的
??????????復數.此程序包可在初始化時調用create_sin_tab()函數創建正弦函數表,
??????????以后的可采用查表法計算耗時較多的sin和cos運算,加快可計算速度.與
??????????Ver1.1版相比較,Ver1.2版在創建正弦表時只建立了1/4個正弦波的采樣值,
??????????相比之下節省了FFT_N/4個存儲空間
使用說明:使用此函數只需更改宏定義FFT_N的值即可實現點數的改變,FFT_N的
??????????應該為2的N次方,不滿足此條件時應在后面補0。若使用查表法計算sin值和
??????????cos值,應在調用FFT函數前調用create_sin_tab()函數創建正弦表
函數調用:FFT(s);
**********************************************************************/
?
unsigned?int?angle;
float??SIN_TAB[FFT_N/4+1];???????????????????????????????????????????//定義正弦表的存放空間
?
struct?compx?s[FFT_N];??????????????????????????????????????????????//FFT輸入和輸出:從S[0]開始存放,根據大小自己定義
?
/*******************************************************************
函數原型:struct?compx?EE(struct?compx?b1struct?compx?b2)?
函數功能:對兩個復數進行乘法運算
輸入參數:兩個以聯合體定義的復數ab
輸出參數:a和b的乘積,以聯合體的形式輸出
*******************************************************************/
struct?compx?EE(struct?compx?astruct?compx?b)?????
{
?struct?compx?c;
?c.real=a.real*b.real-a.imag*b.imag;
?c.imag=a.real*b.imag+a.imag*b.real;
?return(c);
}
?
/******************************************************************
函數原型:void?create_sin_tab(float?*sin_t)
函數功能:創建一個正弦采樣表,采樣點數與福利葉變換點數相同
輸入參數:*sin_t存放正弦表的數組指針
輸出參數:無
******************************************************************/
void?create_sin_tab(float?*sin_t)????????????????????
{
??int?i;
??for(i=0;i<=FFT_N/4;i++)
??sin_t[i]=sin(2*PI*i/FFT_N);
}
/******************************************************************
函數原型:void?sin_tab(float?pi)
函數功能:采用查表的方法計算一個數的正弦值
輸入參數:pi?所要計算正弦值弧度值,范圍0--2*PI,不滿足時需要轉換
輸出參數:輸入值pi的正弦值
******************************************************************/
float?sin_tab(float?pi)
{
??int?n;
??float?a;
???n=(int)(pi*FFT_N/2/PI);
??
??if(n>=0&&n<=FFT_N/4)
????a=SIN_TAB[n];
??else?if(n>FFT_N/4&&n
????{
?????n-=FFT_N/4;
?????a=SIN_TAB[FFT_N/4-n];
????}
??else?if(n>=FFT_N/2&&n<3*FFT_N/4)
????{
?????n-=FFT_N/2;
?????a=-SIN_TAB[n];
???}
??else?if(n>=3*FFT_N/4&&n<3*FFT_N)
????{
?????n=FFT_N-n;
?????a=-SIN_TAB[n];
???}
?
??return?a;
}
/******************************************************************
函數原型:void?cos_tab(float?pi)
函數功能:采用查表的方法計算一個數的余弦值
輸入參數:pi?所要計算余弦值弧度值,范圍0--2*PI,不滿足時需要轉換
輸出參數:輸入值pi的余弦值
******************************************************************/
float?cos_tab(float?pi)
{
???float?api2;
???pi2=pi+PI/2;
???if(pi2>2*PI)
?????pi2-=2*PI;
???a=sin_tab(pi2);
???return?a;
}
/*****************************************************************
評論
共有 條評論