C++实现FFT算法

C++实现FFT算法

#include "iostream.h"
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#include "malloc.h"
#define PI (float)3.1415926//复数结构体
typedef struct{ float re; float im;}complex;//定义旋转因子
complex W(int N,int n){
 complex out; out.re=(float)cos(2*PI*((float)n/(float)N));
 out.im=-(float)sin(2*PI*((float)n/(float)N)); return out;
}
//复数加法,out=a+b
complex add(complex a,complex b){
 complex out;
 out.re=a.re+b.re;
 out.im=a.im+b.im;
 return out;}
//复数减法,out=a-b
complex sub(complex a,complex b){
 complex out;
 out.re=a.re-b.re;
 out.im=a.im-b.im;
 return out;}
//复数乘法,out=a*b
complex mul(complex a,complex b){
 complex out;
 out.re=a.re*b.re-a.im*b.im;
 out.im=a.re*b.im+a.im*b.re;
 return out;
}
//复数赋值
complex comcpy(complex a){
 complex out;
 out.re=a.re;
 out.im=a.im;
 return out;
}

bool DOFFT(complex *x,complex *F,int N){
 int K=(int)(log(N+1)/log(2));// cout<<K;
 int i,j,m; for(m=1;m<=K;m++) {//  cout<<"m="<<m<<endl; 
  for(i=0;i<(1<<K);i+=1<<m)  {//   cout<<"i="<<i<<"\t";  
   for(j=0;j<(1<<(m-1));j++){//    cout<<i+j<<","<<i+j+(1<<(m-1))<<",";   
    F[i+j]=add(x[i+j],mul(x[i+j+(1<<(m-1))],W(1<<m,j)));   
    F[i+j+(1<<(m-1))]=sub(x[i+j],mul(x[i+j+(1<<(m-1))],W(1<<m,j)));  
   } //   cout<<"\t"; 
  }
  //  cout<<endl; 
   for(i=0;i<N;i++)  
    x[i]=comcpy(F[i]);
  }
  return true;
}

int reverse(int n,int j){

  int  i,k,power;
  power=(int)(log(n+1)/log(2));
  k=0;
  for(i=0;i<power;i++)//检查每个为0~power-1 
   if(j&(1<<i))  
    k+=1<<(power-i-1);//如果正序数中位i的值为1,则倒序数中power-i-1的相应位置1。
  return k;

}

void main(){

  int m,i,j;
  int N=4;
  complex *x,*F;
  x=new complex[N];
  F=new complex[N];
  for(i=0;i<N/2;i++){
   x[i].re=1;
   x[i].im=0;
   cout<<"x["<<i<<"]="<<x[i].re<<", ";
  }
  for(i=N/2;i<N;i++){
   x[i].re=0;
   x[i].im=0;
   cout<<"x["<<i<<"]="<<x[i].re<<", ";
  }
  cout<<endl;

  for(i=0;i<N;i++){ 
   F[i]=comcpy(x[reverse(N,i)]);
  }
  for(i=0;i<N;i++){
   x[i]=comcpy(F[i]);
  }
  for(i=0;i<N;i++){
   cout<<"x["<<i<<"]="<<x[i].re<<", ";
  }

  cout<<endl;

  DOFFT(x,F,N);
  for(i=0;i<N;i++)
  { 
   cout<<"("<<F[i].re<<","<<F[i].im<<")";
  }

  cout<<endl<<endl;

}

转载于:https://www.cnblogs.com/MMLoveMeMM/articles/3064005.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值