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

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = chan_diff_mp_uncorr.cpp
  3. //
  4. #include <stdlib.h>
  5. #include <fstream>
  6. #include <strstream>
  7. #include <math.h>
  8. #include "parmfile.h"
  9. #include "chan_diff_mp_uncorr.h"
  10. #include "model_graph.h"
  11. //#include "cmsg.h"
  12. //#include "sigstuff.h"
  13. //#include "actsysgp.h"
  14. //#include "misdefs.h"
  15. //#include "gensig.h"
  16. //#include "iir_dsgn.h"
  17. //#include "bilinear.h"
  18. //#include "unq_iir.h"
  19. #include "gausrand.h"
  20. extern ParmFile *ParmInput;
  21. extern PracSimModel *ActiveModel;
  22. //======================================================
  23. // normal constructor
  24. ChanDiffuseMultipathUncorr::ChanDiffuseMultipathUncorr( char* instance_name,
  25.                   PracSimModel* outer_model,
  26.                   Signal<std::complex<float> >* in_sig,
  27.                   Signal<std::complex<float> >* out_sig)
  28.               :PracSimModel(instance_name,
  29.                             outer_model)
  30. {
  31.   MODEL_NAME(ChanDiffuseMultipathUncorr);
  32.    ostrstream *temp_stream;
  33.    char *name_str;
  34.   In_Sig = in_sig;
  35.   Out_Sig = out_sig;
  36.   OPEN_PARM_BLOCK;
  37.   GET_LONG_PARM(Initial_Seed);
  38.   Seed = Initial_Seed;
  39.   GET_INT_PARM( Num_Taps);
  40.   Multipath_Profile = new double[Num_Taps];
  41.   GET_DOUBLE_PARM_ARRAY(Multipath_Profile, Num_Taps);
  42.   //----------------------------------------------
  43.   MAKE_INPUT(In_Sig);
  44.   MAKE_OUTPUT(Out_Sig);
  45.   //-----------------------------------------------------------
  46.   // This must come last.  Can not create subordinate models
  47.   // until after all setup for parent model is complete
  48.   Gain_Filter = new ButterworthFilterByIir<float>*[Num_Taps];
  49.   for(int i=0; i<Num_Taps; i++) {
  50.       temp_stream = new ostrstream;
  51.       *temp_stream << GetInstanceName() << ":Gain_Filter[" << i << "]" << ends;
  52.       name_str = temp_stream->str();
  53.       Gain_Filter[i] = new ButterworthFilterByIir<float>( name_str, this );
  54.       delete temp_stream;
  55.   }
  56. }
  57. //=============================================
  58. ChanDiffuseMultipathUncorr::~ChanDiffuseMultipathUncorr( void ){ };
  59. //===========================================
  60. void ChanDiffuseMultipathUncorr::Initialize(void)
  61. {
  62.   DetailedResults << "Now in CmpxAgc::Initialize()" << endl;
  63.   Proc_Block_Size = In_Sig->GetBlockSize();
  64.   Samp_Intvl = In_Sig->GetSampIntvl();
  65.   In_Buf = new std::complex<float>[Num_Taps];
  66.   for(int i=0; i<Num_Taps; i++) {
  67.       In_Buf[i] = 0.0;
  68.       (Gain_Filter[i])->Initialize(Proc_Block_Size, Samp_Intvl);
  69.   }
  70.   Proc_Block_Size = In_Sig->GetBlockSize();
  71. //  ebno_scaled = double( pow(10,(Desired_Eb_No/10.)) *(In_Sig->GetSampIntvl()) );
  72. }
  73. //=============================================
  74. int ChanDiffuseMultipathUncorr::Execute(void)
  75. {
  76.   int is, tap_idx;
  77.   float imag_rv, real_rv;
  78.   float g_real, g_imag;
  79.   std::complex<float> mp_sig_val, gain;
  80.   std::complex<float> *out_sig_ptr, *in_sig_ptr;
  81.   long seed = Seed;
  82.   //---------------------------------------------
  83.   // if specified, calculate the power of the input
  84.   out_sig_ptr = GET_OUTPUT_PTR(Out_Sig);
  85.   in_sig_ptr = GET_INPUT_PTR(In_Sig);
  86.   //-------------------------------------------------
  87.   //  main loop
  88.    for(is=0; is<Proc_Block_Size; is++) {
  89.       for(tap_idx=Num_Taps-1; tap_idx>=1; tap_idx--) {
  90.          In_Buf[tap_idx] = In_Buf[tap_idx-1];
  91.       }
  92.       In_Buf[0] = *in_sig_ptr++;
  93.       mp_sig_val = std::complex<float>(0.0,0.0);
  94.       for(tap_idx=0; tap_idx<Num_Taps; tap_idx++) {
  95.          // generate two gaussian RVs
  96.          GaussRandom(&seed, &real_rv);
  97.          g_real = (Gain_Filter[tap_idx])->ProcessSample(real_rv);
  98.          GaussRandom(&seed, &imag_rv);
  99.          g_imag = (Gain_Filter[tap_idx])->ProcessSample(imag_rv);
  100.          gain = std::complex<float>(g_real, g_imag);
  101.          gain *= float(Multipath_Profile[tap_idx]);
  102.          mp_sig_val += gain * In_Buf[tap_idx];
  103.       }
  104.       *out_sig_ptr++ = mp_sig_val;
  105.    }// end of main loop
  106.   // put back variables that have changed
  107.   Seed = seed;
  108.   //----------------------------------------------
  109.   return(_MES_AOK);
  110. }