⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dit_nipo_t.cpp

📁 《无线通信系统仿真——c++使用模型》这本书的源代码
💻 CPP
字号:
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
//  File = dit_nipo_T.cpp
//
//  Decimation-In-Time FFT
//
//  Naturally-ordered Input / Scrambled Output   
//

#include <math.h>
#include <complex>
#include "log2.h"
#include "bitrev.h"
#include "misdefs.h"
#include "dit_nipo_T.h"
using namespace std;

template <class T>
void IfftDitNipo( std::complex<T> *array,
                 int fft_size)
{
double trig_arg;
int log2_size;
std::complex<T> twiddle;
std::complex<T> temp;
int pts_in_lft_grp, pts_in_rgt_grp;
int stage, grp_pos, grp_cntr;
int top_node, bot_node;

log2_size = ilog2(fft_size); 

pts_in_rgt_grp = fft_size;
for( stage=1; stage <=log2_size; stage++)
  {   
   grp_cntr = -1;
   
   pts_in_lft_grp = pts_in_rgt_grp;  // set pts_in_left_dft = N/(2**(stage-1))
   pts_in_rgt_grp /= 2;               // set pts_in_right_dft = N/(2**stage)

   for( grp_pos =0; grp_pos < fft_size; grp_pos += pts_in_lft_grp)
     {
      grp_cntr++;
                
      trig_arg = (TWO_PI*bitrev(grp_cntr, log2_size-1))/fft_size;
      twiddle = std::complex<T>(float(cos(trig_arg)), float(sin(trig_arg)));
                                  
      for( top_node = grp_pos; top_node < grp_pos+pts_in_rgt_grp; 
                               top_node++)
        {                              
         bot_node = top_node + pts_in_rgt_grp;
         temp = array[bot_node] * twiddle;
         array[bot_node] = array[top_node] - temp;
         array[top_node] += temp;
        }  // end of loop over top_node
        
     } // end of loop over grp_pos
  } // end of loop over stage
return;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
template <class T>
void FftDitNipo( complex<T> *array,
                 int fft_size)
{
   double trig_arg;
   std::complex<T> twiddle, temp;
   int pts_in_lft_grp, pts_in_rgt_grp;
   int stage, grp_pos, grp_cntr;
   int log2_size, top_node, bot_node;

   log2_size = ilog2(fft_size); 
   pts_in_rgt_grp = fft_size;
   for( stage=1; stage <=log2_size; stage++){   
      grp_cntr = -1;

      // set pts_in_left_dft = N/(2**(stage-1))
      pts_in_lft_grp = pts_in_rgt_grp;  
      
      // set pts_in_right_dft = N/(2**stage)
      pts_in_rgt_grp /= 2;

      for(  grp_pos =0; 
            grp_pos < fft_size; 
            grp_pos += pts_in_lft_grp){
         grp_cntr++;

         trig_arg = (TWO_PI * bitrev(grp_cntr, 
                     log2_size-1))/fft_size;
         twiddle = complex<T>( float(cos(trig_arg)), 
                               float(-sin(trig_arg)));

         for(  top_node = grp_pos; 
               top_node < grp_pos+pts_in_rgt_grp; 
               top_node++){                              
            bot_node = top_node + pts_in_rgt_grp;
            temp = array[bot_node] * twiddle;
            array[bot_node] = array[top_node] - temp;
            array[top_node] += temp;
         }
      } // end of loop over grp_pos
   } // end of loop over stage
   return;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
template void IfftDitNipo( std::complex<float> *array,
                            int fft_size);

template void FftDitNipo( std::complex<float> *array,
                           int fft_size);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -