FFT的代码:
#include <iom128.h>
#include <intrinsics.h>
#include <directive>
/*********************************************************************
快速福利叶变换C函数
函数简介:此函数是通用的快速傅里叶变换C语言函数,移植性强,以下部分不依赖硬件。此函数采用联合体的形式表示一个复数,输入为自然顺序的复数(输入实数是可令复数虚部为0),输出为经过FFT变换的自然顺序的复数
使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_N的应该为2的N次方,不满足此条件时应在后面补0
函数调用:FFT(s);
时 间:2010-2-20
版 本:Ver1.0 参考文献: **********************************************************************/
#include<math.h>
#include<complex>
#include <iostream>
#define PI 3.1415926535897932384626433832795028841971 //定义圆周率值
#define FFT_N 128 //定义福利叶变换的点数
struct compx {float real;float imag;}compx; //定义一个复数结构
struct compx s[FFT_N]; //FFT输入和输出:从S[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 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<nm1;i++)
{
if(i<j) //如果i<j,即进行变址
{
t=xin[j];
xin[j]=xin;
xin=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
}
{
int le,lei,ip; //FFT运算核,使用蝶形运算完成FFT运算
f=FFT_N;
for(l=1;(f=f/2)!=1;l++) //计算l的值,即计算蝶形级数 ;
for(m=1;m<=l;m++) // 控制蝶形结级数
{ //m表示第m级蝶形,l为蝶形级总数l=log(2)N
le=2<<(m-1); //le蝶形结距离,即第m级蝶形的蝶形结相距le点
lei=le/2; //同一蝶形结中参加运算的两点的距离
u.real=1.0; //u为蝶形结运算系数,初始值为1
u.imag=0.0;
w.real=cos(PI/lei); //w为系数商,即当前系数与前一个系数的商
w.imag=-sin(PI/lei);
for(j=0;j<=lei-1;j++) //控制计算不同种蝶形结,即计算系数不同的蝶形结
{
for(i=j;i<=FFT_N-1;i=i+le) //控制同一蝶形结运算,即计算系数相同蝶形结
{
ip=i+lei; //i,ip分别表示参加蝶形运算的两个节点
t=EE(xin[ip],u); //蝶形运算,详见公式
xin[ip].real=xin.real-t.real;
xin[ip].imag=xin.imag-t.imag;
xin.real=xin.real+t.real;
xin.imag=xin.imag+t.imag;
}
u=EE(u,w); //改变系数,进行下一个蝶形运算
}
}
}
}
/************************************************************
函数原型:void main()
函数功能:测试FFT变换,演示函数使用方法 输入参数:无 输出参数:无 ************************************************************/
void main()
{
int i;
for(i=0;i<FFT_N;i++) //给结构体赋值
{
s.real=sin(2*3.141592653589793*i/FFT_N); //实部为正弦波FFT_N点采样,赋值为1
s.imag=0; //虚部为0
}
FFT(s); //进行快速福利叶变换
for(i=0;i<FFT_N;i++) //求变换后结果的模值,存入复数的实部部分
s[i].real=sqrt(s[i].real*s[i].real+s[i].imag*s[i].imag);
while(1);
}
编译的错误:
root@ly-laptop:~# gcc -lm -o FFT.out FFT.c
FFT.c:2:21: warning: extra tokens at end of #include directive
FFT.c:2:47: error: iom128.h: 没有那个文件或目录
FFT.c:14: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘s’
FFT.c: In function ‘main’:
FFT.c:81: error: ‘s’ undeclared (first use in this function)
FFT.c:81: error: (Each undeclared identifier is reported only once
FFT.c:81: error: for each function it appears in.)
俺是个新手遇到这个问题,求高手帮忙看看,跪谢
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
-
- 帖子: 3
- 注册时间: 2014-04-22 21:55
- 系统: ubuntu
- zhw2101024
- 帖子: 1849
- 注册时间: 2009-03-28 16:10
- 系统: Arch debian win7
- 联系:
Re: 俺是个新手遇到这个问题,求高手帮忙看看,跪谢
iom128.h不属于标准C语言的内容。
要么自己把核心算法解析出来,要么换本参考书
要么自己把核心算法解析出来,要么换本参考书
为什么我的问题总是没有人回答?
金钱、责任与荣誉:OpenSSL主席谈心脏出血
拥有丰富API接口和广泛程序支持的dropbox云同步,点此注册,开始就比别人多500兆,我的空间也会增加。谢啦
==========我的作品==========
我做的一个面向开发者的gnome-shell扩展,有js基础又想自己调整gnome-shell功能的可以尝试一下
gnome-shell扩展开发入门,gnome-shell扩展系统扫盲帖
金钱、责任与荣誉:OpenSSL主席谈心脏出血
拥有丰富API接口和广泛程序支持的dropbox云同步,点此注册,开始就比别人多500兆,我的空间也会增加。谢啦
==========我的作品==========
我做的一个面向开发者的gnome-shell扩展,有js基础又想自己调整gnome-shell功能的可以尝试一下
gnome-shell扩展开发入门,gnome-shell扩展系统扫盲帖
- astolia
- 论坛版主
- 帖子: 6703
- 注册时间: 2008-09-18 13:11
Re: 俺是个新手遇到这个问题,求高手帮忙看看,跪谢
网上搜了一下应该是AVR单片机开发用的,那些头文件需要你去搭建相关的开发环境才有
-
- 帖子: 3
- 注册时间: 2014-04-22 21:55
- 系统: ubuntu
这个是什么问题,求大神指点,跪谢
root@ly-laptop:/home/ly# gcc -lm -o fft1.out fft1.c
fft1.c:6: error: expected identifier or ‘(’ before ‘{’ token
/* 采样来的数据放在dataR[ ]数组中,运算前dataI[ ]数组初始化为0 */
#include<math.h>
#include <stdio.h>
#define N 128
void FFT(float dataR[],float dataI[]);float w[N];
{
int x0,x1,x2,x3,x4,x5,x6;
int L,j,k,b,p,i,xx;
float TR,TI,temp;
/********** following code invert sequence ************/
static int main()
for(i=0;i<128;i++)
{ x0=x1=x2=x3=x4=x5=x6=0;
x0=i&0x01; x1=(i/2)&0x01; x2=(i/4)&0x01; x3=(i/8)&0x01;x4=(i/16)&0x01; x5=(i/32)&0x01; x6=(i/64)&0x01;
xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6;
dataI[xx]=dataR;
}
for(i=0;i<128;i++)
{ dataR=dataI; dataI=0; }
/************** following code FFT *******************/
for(L=1;L<=7;L++)
{ /* for(1) */
b=1; i=L-1;
while(i>0)
{b=b*2;i--;
} /* b= 2^(L-1) */
for(j=0;j<=b-1;j++) /* for (2) */
{ p=1; i=7-L;
while(i>0) /* p=pow(2,7-L)*j; */
{p=p*2; i--;}
p=p*j;
for(k=j;k<128;k=k+2*b) /* for (3) */
{ TR=dataR[k]; TI=dataI[k]; temp=dataR[k+b];
dataR[k]=dataR[k]+dataR[k+b]*cos(p)+dataI[k+b]*sin(p);
dataI[k]=dataI[k]-dataR[k+b]*sin(p)+dataI[k+b]*cos(p);
dataR[k+b]=TR-dataR[k+b]*cos(p)-dataI[k+b]*sin(p);
dataI[k+b]=TI+temp*sin(p)-dataI[k+b]*cos(p);
} /* END for (3) */
} /* END for (2) */
} /* END for (1) */
for(i=0;i<32;i++)
{ /* 只需要32次以下的谐波进行分析 */
w=sqrt(dataR*dataR+dataI*dataI);
w=w[i]/64;
w[0]=w[0]/2;
}
/* END FFT */
fft1.c:6: error: expected identifier or ‘(’ before ‘{’ token
/* 采样来的数据放在dataR[ ]数组中,运算前dataI[ ]数组初始化为0 */
#include<math.h>
#include <stdio.h>
#define N 128
void FFT(float dataR[],float dataI[]);float w[N];
{
int x0,x1,x2,x3,x4,x5,x6;
int L,j,k,b,p,i,xx;
float TR,TI,temp;
/********** following code invert sequence ************/
static int main()
for(i=0;i<128;i++)
{ x0=x1=x2=x3=x4=x5=x6=0;
x0=i&0x01; x1=(i/2)&0x01; x2=(i/4)&0x01; x3=(i/8)&0x01;x4=(i/16)&0x01; x5=(i/32)&0x01; x6=(i/64)&0x01;
xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6;
dataI[xx]=dataR;
}
for(i=0;i<128;i++)
{ dataR=dataI; dataI=0; }
/************** following code FFT *******************/
for(L=1;L<=7;L++)
{ /* for(1) */
b=1; i=L-1;
while(i>0)
{b=b*2;i--;
} /* b= 2^(L-1) */
for(j=0;j<=b-1;j++) /* for (2) */
{ p=1; i=7-L;
while(i>0) /* p=pow(2,7-L)*j; */
{p=p*2; i--;}
p=p*j;
for(k=j;k<128;k=k+2*b) /* for (3) */
{ TR=dataR[k]; TI=dataI[k]; temp=dataR[k+b];
dataR[k]=dataR[k]+dataR[k+b]*cos(p)+dataI[k+b]*sin(p);
dataI[k]=dataI[k]-dataR[k+b]*sin(p)+dataI[k+b]*cos(p);
dataR[k+b]=TR-dataR[k+b]*cos(p)-dataI[k+b]*sin(p);
dataI[k+b]=TI+temp*sin(p)-dataI[k+b]*cos(p);
} /* END for (3) */
} /* END for (2) */
} /* END for (1) */
for(i=0;i<32;i++)
{ /* 只需要32次以下的谐波进行分析 */
w=sqrt(dataR*dataR+dataI*dataI);
w=w[i]/64;
w[0]=w[0]/2;
}
/* END FFT */
-
- 帖子: 3
- 注册时间: 2014-04-22 21:55
- 系统: ubuntu
新手不懂,求大神指点
root@ly-laptop:/home/ly# gcc -lm -o FFT.out FFT.c
输入指令回车后是这样的
root@ly-laptop:/home/ly#
这个编译通过的意思吗??
输入指令回车后是这样的
root@ly-laptop:/home/ly#
这个编译通过的意思吗??