fft的实现

 1     private static Complex[] FFT1(Complex[] f)
 2     {
 3         int N=f.length;
 4         int power= (int) (Math.log10(N)/Math.log10(2));
 5         Complex[] F=new Complex[N];
 6         //按奇偶分组
 7         for(int i=0;i<N;i++)
 8         {
 9             int p = 0;  
10             for (int j = 0; j < power; j++)  
11                 if ((i & (1 << j)) != 0)  
12                     p += 1 << (power - j - 1);  
13 
14             F[p] = f[i];
15         }
16         //蝶形因子
17         Complex[] wc = new Complex[N/ 2];
18         for (int i = 0; i < N / 2; i++)
19         {
20             double angle = -i * Math.PI * 2 / N;
21             wc[i]=new Complex(Math.cos(angle),Math.sin(angle));
22         }
23         //蝶形运算
24         for(int L=1;L<=power;L++)//第L层数
25         {
26             int bf=1<<(power-L);//蝶形数
27             for(int n=0;n<bf;n++)//第n+1个蝶形
28             {
29                 int bfsize=1<<L;//蝶形大小
30                 for(int k=0;k<bfsize/2;k++)//第k+1个蝶形因子
31                 {
32                     Complex temp,X1,X2;;
33                     int i=n*bfsize+k,
34                         j=i+bfsize/2;
35                     temp=wc[k*bf].Mul(F[j]);
36                     X1=F[i].Add(temp);
37                     X2=F[i].Sub(temp);
38                     F[i]=X1;
39                     F[j]=X2;
40                 }            
41             }
42         }
43         return F;
44     }

 

posted @ 2015-04-25 15:43  Asoka_the_Great  阅读(163)  评论(0编辑  收藏  举报