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

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = quadmod_bp.cpp
  3. //
  4. #include <stdlib.h>
  5. #include "parmfile.h"
  6. #include "quadmod_bp.h"
  7. #include "misdefs.h"
  8. #include "model_graph.h"
  9. #include "typedefs.h"
  10. extern ParmFile *ParmInput;
  11. //========================================================================
  12. QuadBandpassModulator::QuadBandpassModulator( char* instance_name,
  13.                               PracSimModel* outer_model,
  14.                               Signal<float>* i_in_sig,
  15.                               Signal<float>* q_in_sig,
  16.                               Signal<float>* out_sig)
  17.                 :PracSimModel(instance_name,
  18.                               outer_model)
  19. {
  20.   MODEL_NAME(QuadBandpassModulator);
  21.   //----------------------------------------
  22.   //  Read model config parms
  23.   OPEN_PARM_BLOCK;
  24.   GET_DOUBLE_PARM(Phase_Unbal);
  25.   GET_DOUBLE_PARM(Amp_Unbal);
  26.   GET_DOUBLE_PARM(Carrier_Freq);
  27.   GET_DOUBLE_PARM(Phase_Offset_Deg);
  28.   Carrier_Freq_Rad = TWO_PI * Carrier_Freq;
  29.   Phase_Unbal_Rad = PI * Phase_Unbal / 180.0;
  30.   Phase_Offset_Rad = PI * Phase_Offset_Deg / 180.0;
  31.   //-------------------------------------
  32.   //  Connect input and output signals
  33.   I_In_Sig = i_in_sig;
  34.   Q_In_Sig = q_in_sig;
  35.   Out_Sig = out_sig;
  36.   MAKE_OUTPUT( Out_Sig );
  37.   MAKE_INPUT( I_In_Sig );
  38.   MAKE_INPUT( Q_In_Sig );
  39. }
  40. //===========================================
  41. QuadBandpassModulator::~QuadBandpassModulator( void ){ };
  42. //===========================================
  43. void QuadBandpassModulator::Initialize(void)
  44. {
  45.   Block_Size = I_In_Sig->GetBlockSize();
  46.   Samp_Intvl = Out_Sig->GetSampIntvl();
  47.   Time = 0.0;
  48. }
  49. //============================================
  50. int QuadBandpassModulator::Execute(void)
  51. {
  52.   float *i_in_sig_ptr, *q_in_sig_ptr;
  53.   float i_out, q_out;
  54.   float *out_sig_ptr;
  55.   double omega, time, time_base;
  56.   double theta;
  57.   double amp_unbal, phase_unbal_rad;
  58.   double samp_intvl;
  59.   int is;
  60.   int block_size;
  61.   out_sig_ptr = GET_OUTPUT_PTR( Out_Sig );
  62.   i_in_sig_ptr = GET_INPUT_PTR( I_In_Sig );
  63.   q_in_sig_ptr = GET_INPUT_PTR( Q_In_Sig );
  64.   block_size = I_In_Sig->GetValidBlockSize();
  65.   Out_Sig->SetValidBlockSize(block_size);
  66.   omega = Carrier_Freq_Rad;
  67.   time_base = Time;
  68.   samp_intvl = Samp_Intvl;
  69.   amp_unbal = Amp_Unbal;
  70.   phase_unbal_rad = Phase_Unbal_Rad;
  71.   theta = Phase_Offset_Rad;
  72.   for (is=0; is<block_size; is++)
  73.     {
  74.     time = time_base + is * samp_intvl;
  75.     i_out = (*i_in_sig_ptr) * cos(omega * time + theta);
  76.     q_out = (*q_in_sig_ptr) * amp_unbal * sin(omega * time + phase_unbal_rad + theta);
  77.     *out_sig_ptr = i_out - q_out;
  78.     out_sig_ptr++;
  79.     i_in_sig_ptr++;
  80.     q_in_sig_ptr++;
  81.     }
  82.   Time = time_base + samp_intvl * Block_Size;
  83.   return(_MES_AOK);
  84. }