求助,下面是一个FFT的代码函数,在调用的时候出了一些问题,哪位高手帮帮忙!!!
[code=C/C++][/code]
typedef struct
{
float re;
float im;
}COMPLEX;
//复数乘法
COMPLEX Mul(COMPLEX c1,COMPLEX c2)
{
COMPLEX c;
c.re=c1.re*c2.re-c1.im*c2.im;
c.im=c1.im*c2.re+c1.re*c2.im;
return c;
}
//复数减法
COMPLEX Sub(COMPLEX c1,COMPLEX c2)
{
COMPLEX c;
c.re=c1.re-c2.re;
c.im=c1.im-c2.im;
return c;
}
//复数加法
COMPLEX Add(COMPLEX c1,COMPLEX c2)
{
COMPLEX c;
c.re=c1.re+c2.re;
c.im=c1.im+c2.im;
return c;
}
/************快速傅立叶变换**************************
*****************************************************/
//TD为时域值,FD为频域值,power为变换点数对2取的对数
void FFT(COMPLEX *TD,COMPLEX *FD,int power)
{
/*******************定义数据*********************/
int count;//时域或频域变换的点数
int i,j,k,bfsize,p;
//k是叠代次数,j第几个分组,bfsize是蝶距,p是第j个
//分组在整个数据点数组中的相对位置
double angle; //相角
COMPLEX *W,*X1,*X2,*X;//存放数据点的空间地址
//W是存放加权系数的地址
//从X1到X2是进行了一次叠代,X1是叠代前数据点的地址,
//X2是叠代后的数据点的地址,X是临时存放数据点的地址
/******************计算fft点数*******************/
count=1<<power;
/*****************分配运算所需的存储器***********/
W=(COMPLEX*)malloc(sizeof(COMPLEX)*count/2);
X1=(COMPLEX*)malloc(sizeof(COMPLEX)*count);
X2=(COMPLEX*)malloc(sizeof(COMPLEX)*count);
/*********************计算加权系数****************/
for(i=0;i<count/2;i++)
{
angle=-i*pi*2/count;
W[i].re=cos(angle);
W[i].im=sin(angle);
}
/*********************写入时域点******************/
memcpy(X1,TD,sizeof(COMPLEX)*count);
/************计算蝶形*****************************/
for(k=0;k<power;k++) //最外的循环是叠代次数的循环
{
for(j=0;j<1<<k;j++) //在某一次叠代中,对j的循环是遍历整个数组的每一个分组
//分组指的是:一个N点DFT变为两个N/2点DFT,分组由一组变成了两组。
//对应第k次叠代分组数为2的k次方。
//另外,分组数乘以蝶距就是变换点的总数:2^k*bfsize=count
{
bfsize=1<<(power-k); //蝶距
for(i=0;i<bfsize/2;i++) //i是每一个分组内第几个点
{
p=j*bfsize; //p是每个分组起始点的序号
//蝶形计算
X2[i+p]=Add(X1[i+p],X1[i+p+bfsize/2]);
X2[i+p+bfsize/2]=Mul(Sub(X1[i+p],X1[i+p+bfsize/2]),W[i*(1<<k)]);
}
}
//为下一次叠代调整存储空间
X=X1;
X1=X2;
X2=X;
}
/*********************重排顺序*******************************/
//j是要反序的数
for(j=0;j<count;j++)
{
p=0;
for(i=0;i<power;i++)//i代表反序的二进制位数
{
if(j&(1<<i)) p+=1<<(power-i-1);
//1<<i是一个二进制表示为第i高位为1,其余位为0的数
//if(j&(1<<i)判断j的二进制表示中第i高位是否为1
//如果是,就计算此位反序后的数值,即1 < <(power-i-1)
//对j的每一个二进制位判断,将每位所得反序数相加,就是总的反序数
}
FD[j]=X1[p];
}
/********************释放存储器*******************************/
free(W);
free(X1);
free(X2);
}
/***********************快速傅立叶反变换****************************/
//FD为频域值,TD为时域值,power为2的幂数
void IFFT(COMPLEX *FD,COMPLEX *TD,int power)
{
int i,count;
COMPLEX *x;
//计算反变换的点数
count=1<<power;
//分配存储器
x=(COMPLEX *)malloc(sizeof(COMPLEX)*count);
//将频域点写入存储器
memcpy(x,FD,sizeof(COMPLEX)*count);
//求频域点的共轭
for(i=0;i<count;i++)
{
x[i].im=-x[i].im;
}
//调用快速傅立叶反变换
FFT(x,TD,power);
//求时域点的共轭
for(i=0;i <count;i++)
{
TD[i].re/=count;
TD[i].im=-TD[i].im/count;
}
//释放存储器
free(x);
}
上面的代码是没问题的
我现在用vector<float>Space;定义了一个数组,相对这个数组做一个FFT和IFFT,但是直接用FFT(Space,FD,power)时会报错error C2664: “FFT” : 不能将参数 1 从“std::vector<_Ty>”转换为“COMPLEX *”with[ _Ty=float]没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符
求帮忙
[解决办法]
请用vector<COMPLEX >Space;
调用FFT(&Space[0],FD,power)