資源簡(jiǎn)介
快速傅里葉變換算法,支持2的n次方點(diǎn)變換,并支持求相位操作。
代碼片段和文件信息
#include“fft.h“
#include
#include“l(fā)m9033.h“
?
/*********************************************************************
?????????????????????????快速福利葉變換C程序包
函數(shù)簡(jiǎn)介:此程序包是通用的快速傅里葉變換C語(yǔ)言函數(shù),移植性強(qiáng),以下部分不依
??????????賴硬件。此程序包采用聯(lián)合體的形式表示一個(gè)復(fù)數(shù),輸入為自然順序的復(fù)
??????????數(shù)(輸入實(shí)數(shù)是可令復(fù)數(shù)虛部為0),輸出為經(jīng)過(guò)FFT變換的自然順序的
??????????復(fù)數(shù).此程序包可在初始化時(shí)調(diào)用create_sin_tab()函數(shù)創(chuàng)建正弦函數(shù)表,
??????????以后的可采用查表法計(jì)算耗時(shí)較多的sin和cos運(yùn)算,加快可計(jì)算速度.與
??????????Ver1.1版相比較,Ver1.2版在創(chuàng)建正弦表時(shí)只建立了1/4個(gè)正弦波的采樣值,
??????????相比之下節(jié)省了FFT_N/4個(gè)存儲(chǔ)空間
使用說(shuō)明:使用此函數(shù)只需更改宏定義FFT_N的值即可實(shí)現(xiàn)點(diǎn)數(shù)的改變,F(xiàn)FT_N的
??????????應(yīng)該為2的N次方,不滿足此條件時(shí)應(yīng)在后面補(bǔ)0。若使用查表法計(jì)算sin值和
??????????cos值,應(yīng)在調(diào)用FFT函數(shù)前調(diào)用create_sin_tab()函數(shù)創(chuàng)建正弦表
函數(shù)調(diào)用:FFT(s);
**********************************************************************/
?
unsigned?int?angle;
float??SIN_TAB[FFT_N/4+1];???????????????????????????????????????????//定義正弦表的存放空間
?
struct?compx?s[FFT_N];??????????????????????????????????????????????//FFT輸入和輸出:從S[0]開(kāi)始存放,根據(jù)大小自己定義
?
/*******************************************************************
函數(shù)原型:struct?compx?EE(struct?compx?b1struct?compx?b2)?
函數(shù)功能:對(duì)兩個(gè)復(fù)數(shù)進(jìn)行乘法運(yùn)算
輸入?yún)?shù):兩個(gè)以聯(lián)合體定義的復(fù)數(shù)ab
輸出參數(shù):a和b的乘積,以聯(lián)合體的形式輸出
*******************************************************************/
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);
}
?
/******************************************************************
函數(shù)原型:void?create_sin_tab(float?*sin_t)
函數(shù)功能:創(chuàng)建一個(gè)正弦采樣表,采樣點(diǎn)數(shù)與福利葉變換點(diǎn)數(shù)相同
輸入?yún)?shù):*sin_t存放正弦表的數(shù)組指針
輸出參數(shù):無(wú)
******************************************************************/
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);
}
/******************************************************************
函數(shù)原型:void?sin_tab(float?pi)
函數(shù)功能:采用查表的方法計(jì)算一個(gè)數(shù)的正弦值
輸入?yún)?shù):pi?所要計(jì)算正弦值弧度值,范圍0--2*PI,不滿足時(shí)需要轉(zhuǎn)換
輸出參數(shù):輸入值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;
}
/******************************************************************
函數(shù)原型:void?cos_tab(float?pi)
函數(shù)功能:采用查表的方法計(jì)算一個(gè)數(shù)的余弦值
輸入?yún)?shù):pi?所要計(jì)算余弦值弧度值,范圍0--2*PI,不滿足時(shí)需要轉(zhuǎn)換
輸出參數(shù):輸入值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;
}
/*****************************************************************
評(píng)論
共有 條評(píng)論