解决方案 »

  1.   

    这是Complex.javapackage src;
    //Complex.java//复数的定义
    class Complex {

    public double re;
    public double im;

    Complex(){
    this.re=0;
    this.im=0;
    }
    Complex(double re){
    this.re=re;
    this.im=re;
    }
    Complex(double re,double im){
    this.re=re;
    this.im=im;
    }

    public void setRE(double re){
    this.re=re;
    }
    public void setIM(double im){
    this.im=im;
    }
    public double getRE(){
    return this.re;
    }
    public double getIM(){
    return this.im;
    }

    //复数加法
    Complex Add(Complex c1,Complex c2){
    Complex c=new Complex(0,0);
    c.re=c1.re+c2.re;
    c.im=c1.im+c2.im;
    return c;
    }
    //复数减法
    Complex Sub(Complex c1,Complex c2){
    Complex c=new Complex(0,0);
    c.re=c1.re-c2.re;
    c.im=c1.im-c2.im;
    return c;
    }
    //复数乘法
    Complex Mul(Complex c1,Complex c2){
    Complex c=new Complex(0,0);
    c.re=c1.re*c2.re-c1.im*c2.im;
    c.im=c1.re*c2.im+c2.re*c1.im;
    //c=Sub(c1,c2);
    return c;
    }
    }
      

  2.   

    这是Onefftpackage src;
    //OneFft.javaimport java.awt.*;public class Onefft {
      
       // 付立叶变换点数
    int count;

       //循环变量
       int  i,j,k;
      
       //中间变量
       int bfsize,p;
      
       int power;
      
       Complex[] w,x1,x2,x;
      
       Complex[] fd;
      
      
       public void setData(Complex [] data,int power){
      
         this.power=power;
        
         //角度
       double angle;
        
       //计算傅立叶变换的点数
       count=1<<power;
      
       //分配空间
       w=new Complex[count/2];
       x=new Complex[count];
           x1=new Complex[count];
           x2=new Complex[count];
           fd=new Complex[count];
          
           //初始化
           for(i=0;i<count/2;i++)
           {
           w[i]=new Complex();
           }
           for(i=0;i<count;i++)
           {
           x[i]=new Complex();
           x1[i]=new Complex();
           x2[i]=new Complex();
           fd[i]=new Complex();
           }
          
           //计算加权系数
           for(i=0;i<count/2;i++)
           {
            angle=-i*Math.PI*2/count;
            w[i].re=Math.cos(angle);
             w[i].im=Math.sin(angle);
           }
          
           //将实域点写入x1
           for(i=0;i<count;i++)
           {
           x1[i]=data[i];
          
           }
       }
      
      public Complex [] getData(){
      
           //蝶形运算
           for(k=0;k<power;k++)
           {
            for(j=0;j<1<<k;j++)
            {
               bfsize=1<<(power-k);
               for(i=0;i<bfsize/2;i++)
               {
               Complex temp1=new Complex(0,0);
               Complex temp2=new Complex(0,0);
              
                 p=j*bfsize;
                 x2[i+p]=temp1.Add(x1[i+p],x1[i+p+bfsize/2]);
                
                 temp2=temp1.Sub(x1[i+p],x1[i+p+bfsize/2]);
                
                 x2[i+p+bfsize/2]=temp1.Mul(temp2,w[i*(1<<k)]);
               }
             }
             x=x1;
             x1=x2;
             x2=x;
           }
          
          
           //重新排序
           for(j=0;j<count;j++)
           {
            p=0;
            for(i=0;i<power;i++)
            {
                 if((j&(1<<i))!=0)
                 p+=1<<(power-i-1);
             }
             fd[j]=x1[p];
           }
           return fd;
     }
     

    }