傅里叶变换是一种将信号从时域变换到频域的变换形式。
一般用蝶形运算
由
X1(k)、X 2(k)表示
X(k)的运算是一种特殊的运算-碟形运算
void MYFFT(struct Complex *xin,int N)
{int L=0; // 级间运算层
int J=0; // 级内运算层
int K=0,KB=0; // 蝶形运算层
int M=1,Nn=0;// N=2^M
float B=0; // 蝶形运算两输入数据间隔
/* 以下是为倒序新建的局部变量*/
int LH=0,J2=0,N1=0,I,K2=0;
struct Complex T;
/*以下是倒序*/
LH=N/2; // LH=N/2
J2=LH;
N1=N-2;
for(I=1;I<=N1;I++)
{
if(I<J2)
{
T=xin[I];
xin[I]=xin[J2];
xin[J2]=T;
}
K2=LH;
while(J2>=K2)
{
J2-=K2;
K2=K2/2;// K2=K2/2
}
J2+=K2;
}
/* 以下为计算出M */
Nn=N;
while(Nn!=2)// 计算出N的以2为底数的幂M
{
M++;
Nn=Nn/2;
}
/* 蝶形运算 */
for(L=1;L<=M;L++) // 级间
{
B=pow(2,(L-1));
Vn.real=1;
Vn.imag=0;
Wn.real=cos(pi/B);
Wn.imag=-sin(pi/B);
for(J=0;J<B;J++) // 级内
{
for(K=J;K<N;K+=2*B) // 蝶形因子运算
{
KB=K+B;
T=MUL(xin[KB],Vn);
xin[KB].real=xin[K].real-T.real;
xin[KB].imag=xin[K].imag-T.imag;
xin[K].real=xin[K].real+T.real;
xin[K].imag=xin[K].imag+T.imag;
}
Vn=MUL(Wn,Vn);// 旋转因子做复乘相当于指数相加,得到的结果
// 和J*2^(M-L)是一样的,因为在蝶形因子运算
// 层中M与L都是不变的,唯一变x化的是级内的J
// 而且J是以1为步长的,如J*W等效于W+W+W...J个W相加
}
}
}