📄 fft.cpp
字号:
#include "FFT.h"
#include<math.h>
#include<stdlib.h>
#include<iostream.h>
FFT::FFT()
{
re=new double [N];
im=new double [N];
nere=new double[N];
neim=new double[N];
}
FFT::~FFT()
{
delete [] re;
delete [] im;
delete [] nere;
delete [] neim;
}
//---------------------FFT---------------------------
void FFT::fft(double *a,double *b,int Ssize)//Ssize:the length of stream for every channel
{
form(a,b,Ssize,1); // 1:fft
}
//---------------------IFFT--------------------------
void FFT::ifft(double *a,double *b,int Ssize)
{
form(a,b,Ssize,2); // 2:ifft
for(i=0;i<Ssize*N;i++)
{
*(a+i)=*(a+i)/N;
*(b+i)=*(b+i)/N;
}
}
//---------------------FFT form(yy=1:fft,yy=2:ifft)-------------------------
void FFT::form(double *a,double *b,int Ssize, int yy)
{
double *revalue,*imvalue;
revalue=new double[Ssize*N];
imvalue=new double[Ssize*N];
for(Num=0;Num<Ssize;Num++)
{
//--------------change the input order------------------
for(i=0;i<N;i++)
{
sum=0;
temp=i;
for(j=1;j<Order+1;j++)
{
sum+=(temp%2)*(1<<(Order-j));
temp=temp>>1;
}
*(re+i)=*(a+sum+N*Num);// sereial to parallel
*(im+i)=*(b+sum+N*Num);//serial to parallel
}
//---------------radix 2 algorithm-------------------------
for(order=1;order<=Order;order++)
{
for(i=0;i<N/pow(2,order);i++)
{
index=(int)(i*pow(2,order));
for(j=0;j<N/pow(2,Order-order+1);j++)
{
index1=index+j;
index2=(int)(index1+N/pow(2,Order-order+1));
arg[0]=cos(pow(2,Order-order)*j*2*pi/N);
arg[1]=sin(pow(2,Order-order)*j*2*pi/N);
if(yy==2)
arg[1]=-arg[1];
*(nere+index1)=*(re+index1)+arg[0]*(*(re+index2))+arg[1]*(*(im+index2));
*(neim+index1)=*(im+index1)+arg[0]*(*(im+index2))-arg[1]*(*(re+index2));
*(nere+index2)=*(re+index1)-arg[0]*(*(re+index2))-arg[1]*(*(im+index2));
*(neim+index2)=*(im+index1)-arg[0]*(*(im+index2))+arg[1]*(*(re+index2));
*(re+index1)=*(nere+index1);
*(im+index1)=*(neim+index1);
*(re+index2)=*(nere+index2);
*(im+index2)=*(neim+index2);
}
}
}
for(i=0;i<N;i++)
{
*(revalue+i+Num*N)=*(re+i);
*(imvalue+i+Num*N)=*(im+i);
}
}
for(i=0;i<Ssize*N;i++)
{
*(a+i)=*(revalue+i);
*(b+i)=*(imvalue+i);
}
delete [] revalue;
delete [] imvalue;
}
//------------------------end of file-----------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -