dit_nipo_T.cpp
上传用户:jtjnyq9001
上传日期:2014-11-21
资源大小:3974k
文件大小:3k
源码类别:

3G开发

开发平台:

Visual C++

  1. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2. //
  3. //  File = dit_nipo_T.cpp
  4. //
  5. //  Decimation-In-Time FFT
  6. //
  7. //  Naturally-ordered Input / Scrambled Output   
  8. //
  9. #include <math.h>
  10. #include <complex>
  11. #include "log2.h"
  12. #include "bitrev.h"
  13. #include "misdefs.h"
  14. #include "dit_nipo_T.h"
  15. using namespace std;
  16. template <class T>
  17. void IfftDitNipo( std::complex<T> *array,
  18.                  int fft_size)
  19. {
  20. double trig_arg;
  21. int log2_size;
  22. std::complex<T> twiddle;
  23. std::complex<T> temp;
  24. int pts_in_lft_grp, pts_in_rgt_grp;
  25. int stage, grp_pos, grp_cntr;
  26. int top_node, bot_node;
  27. log2_size = ilog2(fft_size); 
  28. pts_in_rgt_grp = fft_size;
  29. for( stage=1; stage <=log2_size; stage++)
  30.   {   
  31.    grp_cntr = -1;
  32.    
  33.    pts_in_lft_grp = pts_in_rgt_grp;  // set pts_in_left_dft = N/(2**(stage-1))
  34.    pts_in_rgt_grp /= 2;               // set pts_in_right_dft = N/(2**stage)
  35.    for( grp_pos =0; grp_pos < fft_size; grp_pos += pts_in_lft_grp)
  36.      {
  37.       grp_cntr++;
  38.                 
  39.       trig_arg = (TWO_PI*bitrev(grp_cntr, log2_size-1))/fft_size;
  40.       twiddle = std::complex<T>(float(cos(trig_arg)), float(sin(trig_arg)));
  41.                                   
  42.       for( top_node = grp_pos; top_node < grp_pos+pts_in_rgt_grp; 
  43.                                top_node++)
  44.         {                              
  45.          bot_node = top_node + pts_in_rgt_grp;
  46.          temp = array[bot_node] * twiddle;
  47.          array[bot_node] = array[top_node] - temp;
  48.          array[top_node] += temp;
  49.         }  // end of loop over top_node
  50.         
  51.      } // end of loop over grp_pos
  52.   } // end of loop over stage
  53. return;
  54. }
  55. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
  56. template <class T>
  57. void FftDitNipo( complex<T> *array,
  58.                  int fft_size)
  59. {
  60.    double trig_arg;
  61.    std::complex<T> twiddle, temp;
  62.    int pts_in_lft_grp, pts_in_rgt_grp;
  63.    int stage, grp_pos, grp_cntr;
  64.    int log2_size, top_node, bot_node;
  65.    log2_size = ilog2(fft_size); 
  66.    pts_in_rgt_grp = fft_size;
  67.    for( stage=1; stage <=log2_size; stage++){   
  68.       grp_cntr = -1;
  69.       // set pts_in_left_dft = N/(2**(stage-1))
  70.       pts_in_lft_grp = pts_in_rgt_grp;  
  71.       
  72.       // set pts_in_right_dft = N/(2**stage)
  73.       pts_in_rgt_grp /= 2;
  74.       for(  grp_pos =0; 
  75.             grp_pos < fft_size; 
  76.             grp_pos += pts_in_lft_grp){
  77.          grp_cntr++;
  78.          trig_arg = (TWO_PI * bitrev(grp_cntr, 
  79.                      log2_size-1))/fft_size;
  80.          twiddle = complex<T>( float(cos(trig_arg)), 
  81.                                float(-sin(trig_arg)));
  82.          for(  top_node = grp_pos; 
  83.                top_node < grp_pos+pts_in_rgt_grp; 
  84.                top_node++){                              
  85.             bot_node = top_node + pts_in_rgt_grp;
  86.             temp = array[bot_node] * twiddle;
  87.             array[bot_node] = array[top_node] - temp;
  88.             array[top_node] += temp;
  89.          }
  90.       } // end of loop over grp_pos
  91.    } // end of loop over stage
  92.    return;
  93. }
  94. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
  95. template void IfftDitNipo( std::complex<float> *array,
  96.                             int fft_size);
  97. template void FftDitNipo( std::complex<float> *array,
  98.                            int fft_size);