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

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = qpskmod.cpp
  3. //
  4. #include <stdlib.h>
  5. #include <fstream.h>
  6. #include "parmfile.h"
  7. #include "qpskmod.h"
  8. #include "misdefs.h"
  9. #include "modgraph.h"
  10. #include "typedefs.h"
  11. #include "cmpxsig.h"
  12. extern ParmFile *ParmInput;
  13. //======================================================
  14. QpskModulator::QpskModulator( char* instance_name,
  15.                               PracSimModel* outer_model,
  16.                               Signal<float>* i_in_sig,
  17.                               Signal<float>* q_in_sig,
  18.                               Signal< std::complex<float> >* cmpx_out_sig,
  19.                               Signal<float>* mag_out_sig,
  20.                               Signal<float>* phase_out_sig )
  21.                 :PracSimModel(instance_name,
  22.                               outer_model)
  23. {
  24.   MODEL_NAME(QpskModulator);
  25.   //----------------------------------------
  26.   //  Read model config parms
  27.   OPEN_PARM_BLOCK;
  28.   GET_DOUBLE_PARM(Phase_Unbal);
  29.   GET_DOUBLE_PARM(Amp_Unbal);
  30.   //GET_INT_PARM("block_size");
  31.   //GET_DOUBLE_PARM("samp_intvl");
  32.   //-------------------------------------
  33.   //  Connect input and output signals
  34.   I_In_Sig = i_in_sig;
  35.   Q_In_Sig = q_in_sig;
  36.   Cmpx_Out_Sig = cmpx_out_sig;
  37.   Mag_Out_Sig = mag_out_sig;
  38.   Phase_Out_Sig = phase_out_sig;
  39.   MAKE_OUTPUT( Cmpx_Out_Sig );
  40.   MAKE_OUTPUT( Mag_Out_Sig );
  41.   MAKE_OUTPUT( Phase_Out_Sig );
  42.   MAKE_INPUT( I_In_Sig );
  43.   MAKE_INPUT( Q_In_Sig );
  44.   //-----------------------------------------
  45.   // Set up derived parms
  46.   double phase_unbal_rad = PI * Phase_Unbal / 180.0;
  47.   Real_Unbal = float(cos(phase_unbal_rad) * Amp_Unbal);
  48.   Imag_Unbal = float(sin(phase_unbal_rad) * Amp_Unbal);
  49. }
  50. //===========================================
  51. QpskModulator::~QpskModulator( void ){ };
  52. //===========================================
  53. void QpskModulator::Initialize(void)
  54. {
  55.   Block_Size = I_In_Sig->GetBlockSize();
  56. }
  57. //============================================
  58. int QpskModulator::Execute(void)
  59. {
  60.   float *i_in_sig_ptr, *q_in_sig_ptr;
  61.   float i_out, q_out;
  62.   float *phase_out_sig_ptr, *mag_out_sig_ptr;
  63.   double real_unbal, imag_unbal;
  64.   std::complex<float> *cmpx_out_sig_ptr;
  65.   int is;
  66.   cmpx_out_sig_ptr = GET_OUTPUT_PTR( Cmpx_Out_Sig );
  67.   phase_out_sig_ptr = GET_OUTPUT_PTR( Phase_Out_Sig );
  68.   mag_out_sig_ptr = GET_OUTPUT_PTR( Mag_Out_Sig );
  69.   i_in_sig_ptr = GET_INPUT_PTR( I_In_Sig );
  70.   q_in_sig_ptr = GET_INPUT_PTR( Q_In_Sig );
  71.   real_unbal = Real_Unbal;
  72.   imag_unbal = Imag_Unbal;
  73.   //cout << "real_unbal = " << real_unbal << endl;
  74.   //cout << "imag_unbal = " << imag_unbal << endl;
  75.   for (is=0; is<Block_Size; is++)
  76.     {
  77.     i_out = (*i_in_sig_ptr) - (imag_unbal * (*q_in_sig_ptr));
  78.     q_out = real_unbal * (*q_in_sig_ptr);
  79.     //i_out *= 1.4;
  80.     //q_out *= 1.4;
  81.     (*cmpx_out_sig_ptr) = std::complex<float>( i_out, q_out);
  82.     (*phase_out_sig_ptr) = 180.0*atan2(q_out, i_out)/PI;
  83.     (*mag_out_sig_ptr) = sqrt(i_out*i_out + q_out*q_out);
  84.     i_in_sig_ptr++;
  85.     q_in_sig_ptr++;
  86.     cmpx_out_sig_ptr++;
  87.     phase_out_sig_ptr++;
  88.     mag_out_sig_ptr++;
  89.     }
  90.   return(_MES_AOK);
  91. }