while(1); }
#include
#include
/********************************************************************* 快速傅立叶变换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); 时 间:-2-20 版 本:Ver1.2 参考文献:
**********************************************************************/ #include
#define FFT_N 128 //定义傅立叶变换的点数
#define PI 3.1415926535897932384626433832795028841971 //定义圆周率值
struct compx {float real,imag;};
//定义一个复数结构
struct compx s[FFT_N]; //FFT输入和输出:从S[0]开始存放,根据大小自己定义 float SIN_TAB[FFT_N/4+1]; //定义正弦表的存放空间
/******************************************************************* 函数原型:struct compx EE(struct compx b1,struct compx b2) 函数功能:对两个复数进行乘法运算 输入参数:两个以联合体定义的复数a,b 输出参数:a和b的乘积,以联合体的形式输出
*******************************************************************/ struct compx EE(struct compx a,struct 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&&nn-=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 a,pi2; pi2=pi+PI/2; if(pi2>2*PI) pi2-=2*PI; a=sin_tab(pi2); return a;
}
/***************************************************************** 函数原型:void FFT(struct compx *xin,int N)
函数功能:对输入的复数组进行快速傅里叶变换(FFT) 输入参数:*xin复数结构体组的首地址指针,struct型 输出参数:无
*****************************************************************/ void FFT(struct compx *xin) {
int f,m,nv2,nm1,i,k,l,j=0; struct compx u,w,t;
nv2=FFT_N/2; //变址运算,即把自然顺序变成倒位序,采用雷德算法
nm1=FFT_N-1;
for(i=0;i{
if(it=xin[j]; xin[j]=xin[i]; xin[i]=t;
}
k=nv2; //求j的下一个倒位序
while(k<=j) //如果k<=j,表示j的最高位为1 {
j=j-k; //把最高位变成0
k=k/2; //k/2,比较次高位,依次类推,逐个比较,直到某个位为0 }
j=j+k; //把0改为1
以上是由77cn范文大全为大家整理的C语言实现FFT(快速傅里叶变换)的相关范文,本文关键词为语言,实现,FFT,快速,傅里叶,变换,函数,原型,void,您可以从右上方搜索框检索更多相关文章,如果您觉得有用,请继续关注我们并推荐给您的好友,您可以在综合文库中查看更多范文。
C语言实现FFT(快速傅里叶变换).doc
免费范文网为全国范文类知名网站,下载全文稍作修改便可使用,即刻完成写稿任务。
已有11人下载
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库C语言实现FFT(快速傅里叶变换)在线全文阅读。
本文来自:免费范文网() 转载请注明出处!