FFT算法

对于变换长度为N的序列x(n)其傅立叶变换可以表示如下:

 

N

nk

X(k)=DFT[x(n)] =         Σx(n)W

 

n="0"

 

                     式(1)


其中,W="exp"(-2π/N)

在下面的源码里,对应函数为 DFT

 

算法导论 里介绍了一种递归计算fft地方法, 函数为FFT_recursive

主要利用了 DFT(x) = DFT[0](x) + w*DFT[1](x)

继而导出迭代的fft计算方法,就是现在最常用的,函数为FFT_Iter

步骤为:

将输入数组元素反置变换

for 树的每一层:

    for 这一层上需要计算的每一对数据:

        根据这一对数据,及蝶形公式,计算上一层的数据

 另外,代码里写了一个简单的复数类和向量计算函数

 

  1 FFT算法 #include  < vector >
  2 FFT算法#include  < math.h >
  3 FFT算法#include  < assert.h >
  4 FFT算法 // #include <windows.h>
  5 FFT算法
  6 FFT算法 using   namespace  std;
  7 FFT算法
  8 FFT算法 // ************************************/
  9 FFT算法 //  Fushu
 10 FFT算法 /**************************************/
 11 FFT算法 class  FuShu
 12 FFT算法 {
 13FFT算法    public:
 14FFT算法        FuShu(double r=0double i=0): x(r), y(i)
 15FFT算法        {
 16FFT算法        }

 17FFT算法        
 18FFT算法        FuShu & operator+= (FuShu const &rhs)
 19FFT算法        {
 20FFT算法            x += rhs.x;
 21FFT算法            y += rhs.y;
 22FFT算法            return *this;
 23FFT算法        }

 24FFT算法        
 25FFT算法        FuShu & operator-= (FuShu const &rhs)
 26FFT算法        {
 27FFT算法            x -= rhs.x;
 28FFT算法            y -= rhs.y;
 29FFT算法            return *this;
 30FFT算法        }

 31FFT算法        
 32FFT算法        FuShu & operator*= (FuShu const &rhs)
 33FFT算法        {
 34FFT算法            double x2 = x * rhs.x - y * rhs.y;
 35FFT算法            double y2 =    x * rhs.y + y * rhs.x;
 36FFT算法            x=x2;
 37FFT算法            y=y2;
 38FFT算法            return *this;
 39FFT算法        }

 40FFT算法        
 41FFT算法    //private:
 42FFT算法        double x,y;
 43FFT算法}
;
 44 FFT算法
 45 FFT算法FuShu  operator +  (FuShu  const   &  lhs, FuShu  const   &  rhs)
 46 FFT算法 {
 47FFT算法    FuShu res = lhs;
 48FFT算法    return res+=rhs;
 49FFT算法}
    
 50 FFT算法
 51 FFT算法FuShu  operator -  (FuShu  const   &  lhs, FuShu  const   &  rhs)
 52 FFT算法 {
 53FFT算法    FuShu res = lhs;
 54FFT算法    return res-=rhs;
 55FFT算法}
        
 56 FFT算法
 57 FFT算法FuShu  operator *  (FuShu  const   &  lhs, FuShu  const   &  rhs)
 58 FFT算法 {
 59FFT算法    FuShu res = lhs;
 60FFT算法    return res*=rhs;
 61FFT算法}
    
 62 FFT算法
 63 FFT算法 double  fabs(FuShu  const   &  lhs)
 64 FFT算法 {
 65FFT算法    return fabs(lhs.x) + fabs(lhs.y);
 66FFT算法}

 67 FFT算法 //  bool operator== (FuShu const & lhs, FuShu const & rhs)
 68 FFT算法 //  {
 69 FFT算法     //  return lhs.x == rhs.x && lhs.y == rhs.y;
 70 FFT算法 //  }    
 71 FFT算法
 72 FFT算法 void  Print(FuShu  const   &  lhs)
 73 FFT算法 {
 74FFT算法    if(lhs.y>=0)
 75FFT算法    printf("%g+%gj ", lhs.x, lhs.y);
 76FFT算法    else
 77FFT算法    printf("%g%gj ", lhs.x, lhs.y);
 78FFT算法}

 79 FFT算法
 80 FFT算法 void  Print(vector  < FuShu >   const   &  lhs)
 81 FFT算法 {
 82FFT算法    size_t n=lhs.size();
 83FFT算法    for(size_t i=0; i<n; i++)
 84FFT算法        Print(lhs[i]);
 85FFT算法    printf("\n");
 86FFT算法}

 87 FFT算法
 88 FFT算法
 89 FFT算法 // ************************************/
 90 FFT算法 //  vector
 91 FFT算法 /**************************************/
 92 FFT算法
 93 FFT算法template  < typename T >
 94 FFT算法vector  < T >   operator +  (vector  < T >   const   &  lhs, vector  < T >   const   &  rhs)
 95 FFT算法 {
 96FFT算法    assert(lhs.size() == rhs.size());
 97FFT算法    vector <T> res;
 98FFT算法    size_t n = lhs.size();
 99FFT算法    res.resize(n);
100FFT算法    for(size_t i=0; i<n; i++)
101FFT算法        res[i] = lhs[i] + rhs[i];
102FFT算法    return res;
103FFT算法}

104 FFT算法
105 FFT算法template  < typename T >
106 FFT算法vector  < T >   operator -  (vector  < T >   const   &  lhs, vector  < T >   const   &  rhs)
107 FFT算法 {
108FFT算法    assert(lhs.size() == rhs.size());
109FFT算法    vector <T> res;
110FFT算法    size_t n = lhs.size();
111FFT算法    res.resize(n);
112FFT算法    for(size_t i=0; i<n; i++)
113FFT算法        res[i] = lhs[i] - rhs[i];
114FFT算法    return res;
115FFT算法}

116 FFT算法
117 FFT算法
118 FFT算法template  < typename T >
119 FFT算法vector  < T >   operator *  (FuShu  const   &  lhs, vector  < T >   const   &  rhs)
120 FFT算法 {
121FFT算法    vector <T> res;
122FFT算法    size_t n = rhs.size();
123FFT算法    res.resize(n);
124FFT算法    for(size_t i=0; i<n; i++)
125FFT算法        res[i] = lhs[i] * rhs[i];
126FFT算法    return res;
127FFT算法}

128 FFT算法
129 FFT算法template  < typename T >
130 FFT算法 double  fabs(vector  < T >   const   &  lhs)
131 FFT算法 {
132FFT算法    double res(0);
133FFT算法    size_t n=lhs.size();
134FFT算法    
135FFT算法    for(size_t i=0; i<n; i++)
136FFT算法        res += fabs(lhs[i]);
137FFT算法    return res;
138FFT算法}

139 FFT算法 //  template <typename T>
140 FFT算法 //  bool operator== (FuShu const & lhs, vector <T> const & rhs)
141 FFT算法 //  {
142 FFT算法     //  size_t n = lhs.size();
143 FFT算法     //  if(n != rhs.size())
144 FFT算法         //  return false;
145 FFT算法        
146 FFT算法     //  for(size_t i=0; i<n; i++)
147 FFT算法         //  if(lhs[i] != rhs[i])
148 FFT算法             //  return false;
149 FFT算法            
150 FFT算法     //  return true;
151 FFT算法 //  }
152 FFT算法
153 FFT算法template  < typename T >
154 FFT算法vector  < T >   &   operator << (vector  < T >   &  lhs, T  const   & rhs)
155 FFT算法 {
156FFT算法    lhs.push_back(rhs);
157FFT算法    return lhs;
158FFT算法}

159 FFT算法
160 FFT算法 /***************************************************/
161 FFT算法 //  FFT
162 FFT算法 /***************************************************/
163 FFT算法vector < FuShu >  DFT(vector < FuShu >   const   & a)
164 FFT算法 {
165FFT算法    size_t n=a.size();
166FFT算法    if(n==1return a;
167FFT算法    
168FFT算法    vector<FuShu> res(n);
169FFT算法    for(size_t k=0; k<n; k++)
170FFT算法    {
171FFT算法        FuShu wnk(cos(6.28*k/n), sin(6.28*k/n));
172FFT算法        FuShu w = 1;
173FFT算法        for(size_t j=0; j<n; ++j, w*=wnk)
174FFT算法            res[k] += a[j] * w;
175FFT算法    }

176FFT算法    
177FFT算法    return res;
178FFT算法}

179 FFT算法
180 FFT算法vector < FuShu >  FFT_recursive(vector < FuShu >   const   & a)
181 FFT算法 {
182FFT算法    size_t n=a.size();
183FFT算法    if(n==1return a;
184FFT算法    
185FFT算法    FuShu wn(cos(6.28/n), sin(6.28/n));
186FFT算法    FuShu w(1);
187FFT算法    vector<FuShu> a0, a1;
188FFT算法    a0.reserve(n/2);
189FFT算法    a1.reserve(n/2);
190FFT算法    for(size_t i=0; i<n/2; i++)
191FFT算法    {
192FFT算法        a0.push_back(a[i*2]);
193FFT算法        a1.push_back(a[i*2+1]);
194FFT算法    }

195FFT算法    
196FFT算法    vector<FuShu> y0 = FFT_recursive(a0);
197FFT算法    vector<FuShu> y1 = FFT_recursive(a1);
198FFT算法    
199FFT算法    vector<FuShu> vy;
200FFT算法    vy.resize(n);
201FFT算法    for(size_t k=0; k<n/2; k++)
202FFT算法    {
203FFT算法        vy[k] = y0[k] + w * y1[k];
204FFT算法        vy[k + n/2= y0[k] - w * y1[k];
205FFT算法        w = w*wn;
206FFT算法    }

207FFT算法    
208FFT算法    return vy;
209FFT算法}

210 FFT算法
211 FFT算法unsigned  int  rev(unsigned  int  num, unsigned  int  nBits)
212 FFT算法 {
213FFT算法    unsigned int r = 0;
214FFT算法    for(unsigned int i=0; i<nBits; i++)
215FFT算法    {
216FFT算法        if(num&(1<<i))
217FFT算法            r |= 1<<(nBits-i-1);
218FFT算法    }

219FFT算法    
220FFT算法    return r;
221FFT算法}

222 FFT算法
223 FFT算法vector < FuShu >  FFT_Iter(vector < FuShu >   const   & a, unsigned  int  nBits)
224 FFT算法 {
225FFT算法    size_t n=a.size();
226FFT算法    if(n==1return a;
227FFT算法    
228FFT算法    vector<FuShu>  A;
229FFT算法    A.reserve(n);
230FFT算法    for(size_t i=0; i<n; i++)
231FFT算法        A<<a[rev(i,nBits)];
232FFT算法    
233FFT算法    size_t m=2;
234FFT算法    for(size_t s=0; s<nBits; s++, m*=2)
235FFT算法    {
236FFT算法        FuShu wm(cos(6.28/m), sin(6.28/m));
237FFT算法        for(size_t k=0; k<n; k+=m)
238FFT算法        {
239FFT算法            FuShu w=1;
240FFT算法            for(size_t j=0; j<m/2; j++, w*=wm)
241FFT算法            {
242FFT算法                FuShu t = w * A[k+j+m/2];
243FFT算法                FuShu u = A[k+j];
244FFT算法                A[k+j] = u+t;
245FFT算法                A[k+j+m/2= u-t;
246FFT算法            }

247FFT算法        }

248FFT算法    }

249FFT算法    
250FFT算法    return A;
251FFT算法}

252 FFT算法
253 FFT算法 /***************************************************/
254 FFT算法 //  Main
255 FFT算法 /***************************************************/
256 FFT算法
257 FFT算法 void  main()
258 FFT算法 {
259FFT算法
260FFT算法    srand(clock());
261FFT算法    for(int i=0; i<10; i++)
262FFT算法    {
263FFT算法        FuShu a(rand(),rand()), b(rand(),rand());
264FFT算法
265FFT算法        vector<FuShu> vA;
266FFT算法        vA<<<<b<<<<b;
267FFT算法        
268FFT算法        printf("input:\n");
269FFT算法        Print(vA);
270FFT算法        printf("FFT_recursive result:\n");
271FFT算法        vector<FuShu> vB = FFT_recursive(vA);
272FFT算法        Print(vB);
273FFT算法        printf("DFT result:\n");
274FFT算法        vector<FuShu> vBDft = DFT(vA);
275FFT算法        Print(vBDft);
276FFT算法        
277FFT算法        printf("FFT_Iter result:\n");
278FFT算法        vector<FuShu> vBItr = FFT_Iter(vA,2);
279FFT算法        Print(vBItr);
280FFT算法        
281FFT算法        printf("diff: %g\n", fabs(vB - vBItr));
282FFT算法        assert( fabs(vB - vBItr)<1e-1);
283FFT算法    }

284FFT算法#if 0        
285FFT算法    for(unsigned int i=0; i<8; i++)
286FFT算法        printf("%d ", rev(i,3));
287FFT算法#endif        
288FFT算法}

你可能感兴趣的:(算法)