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

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = quaddem.cpp
  3. //
  4. #include <stdlib.h>
  5. //#include <fstream>
  6. #include "parmfile.h"
  7. #include "quaddem.h"
  8. #include "misdefs.h"
  9. #include "model_graph.h"
  10. #include "typedefs.h"
  11. extern ParmFile *ParmInput;
  12. //========================================================================
  13. // constructor 
  14. QuadratureDemod::QuadratureDemod( char* instance_name,
  15.                               PracSimModel* outer_model,
  16.                                   Signal< std::complex< float > >* in_sig,
  17.                                   Signal< std::complex< float > >* carrier_ref_sig,
  18.                                   Signal< float >* i_wave_out,
  19.                                   Signal< float >* q_wave_out )
  20.                 :PracSimModel(instance_name,
  21.                               outer_model)
  22. {
  23.   MODEL_NAME(QuadratureDemod);
  24.   //--------------------------------------
  25.   //  Connect input and output signals
  26.   I_Wave_Out = i_wave_out;
  27.   Q_Wave_Out = q_wave_out;
  28.   In_Sig = in_sig;
  29.   Carrier_Ref_Sig = carrier_ref_sig;
  30.   MAKE_OUTPUT( I_Wave_Out );
  31.   MAKE_OUTPUT( Q_Wave_Out );
  32.   MAKE_INPUT( In_Sig );
  33.   MAKE_INPUT( Carrier_Ref_Sig );
  34. }
  35. //===========================================
  36. QuadratureDemod::~QuadratureDemod( void ){ };
  37. //===========================================
  38. void QuadratureDemod::Initialize(void)
  39. {
  40.   Block_Size = In_Sig->GetBlockSize();
  41. }
  42. //============================================
  43. int QuadratureDemod::Execute(void)
  44. {
  45.   float *i_wave_out_ptr, *q_wave_out_ptr;
  46.   std::complex<float> *in_sig_ptr;
  47.   std::complex<float> *carrier_ref_sig_ptr;
  48.   std::complex<float> in_val, carrier_val, correl_ref;
  49.   int is;
  50.   I_Wave_Out->SetValidBlockSize(Block_Size);
  51.   Q_Wave_Out->SetValidBlockSize(Block_Size);
  52.   in_sig_ptr = GET_INPUT_PTR( In_Sig );
  53.   carrier_ref_sig_ptr = GET_INPUT_PTR( Carrier_Ref_Sig );
  54.   i_wave_out_ptr = GET_OUTPUT_PTR( I_Wave_Out );
  55.   q_wave_out_ptr = GET_OUTPUT_PTR( Q_Wave_Out );
  56.   std::complex<float> cmpx_j = std::complex<float>(0.0,-1.0);
  57.   for (is=0; is<Block_Size; is++)
  58.     {
  59.     in_val = *in_sig_ptr++;
  60.     carrier_val = *carrier_ref_sig_ptr++;
  61.     //  mix with I subcarrier
  62.     correl_ref = std::conj(carrier_val);
  63.     *i_wave_out_ptr++ = std::real(in_val * correl_ref);
  64.     //  mix with Q subcarrier
  65.     correl_ref *= cmpx_j;
  66.     *q_wave_out_ptr++ = std::real(in_val * correl_ref);
  67.     }
  68.   return(_MES_AOK);
  69. }