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

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = mskmod.cpp
  3. //
  4. #include <stdlib.h>
  5. #include "parmfile.h"
  6. #include "mskmod.h"
  7. #include "misdefs.h"
  8. #include "model_graph.h"
  9. extern ParmFile *ParmInput;
  10. using std::complex;
  11. //======================================================
  12. MskModulator::MskModulator( 
  13.                char* instance_name,
  14.                PracSimModel* outer_model,
  15.                Signal< float >* i_in_sig,
  16.                Signal< float >* q_in_sig,
  17.                Signal< complex<float> >* cmpx_out_sig,
  18.                Signal< float >* mag_out_sig,
  19.                Signal< float >* phase_out_sig )
  20.           :PracSimModel(instance_name,
  21.                         outer_model)
  22. {
  23.    MODEL_NAME(MskModulator);
  24.    //  Read model config parms
  25.    OPEN_PARM_BLOCK;
  26.    GET_DOUBLE_PARM(Bit_Durat);
  27.    GET_DOUBLE_PARM(Data_Skew);
  28.    GET_DOUBLE_PARM(Subcar_Misalign);
  29.    GET_DOUBLE_PARM(Phase_Unbal);
  30.    GET_DOUBLE_PARM(Amp_Unbal);
  31.    GET_BOOL_PARM(Shaping_Is_Bipolar);
  32.    //  Connect input and output signals
  33.    I_In_Sig = i_in_sig;
  34.    Q_In_Sig = q_in_sig;
  35.    Cmpx_Out_Sig = cmpx_out_sig;
  36.    Mag_Out_Sig = mag_out_sig;
  37.    Phase_Out_Sig = phase_out_sig;
  38.    MAKE_OUTPUT( Cmpx_Out_Sig );
  39.    MAKE_OUTPUT( Mag_Out_Sig );
  40.    MAKE_OUTPUT( Phase_Out_Sig );
  41.    MAKE_INPUT( I_In_Sig );
  42.    MAKE_INPUT( Q_In_Sig );
  43.    // Set up derived parms
  44.    double phase_unbal_rad = PI * Phase_Unbal / 180.0;
  45.    Pi_Over_Bit_Dur = PI/Bit_Durat;
  46.    Phase_Shift = complex<float>( -sin(phase_unbal_rad),
  47.                                  cos(phase_unbal_rad));
  48. }
  49. //======================================================
  50. MskModulator::~MskModulator( void ){ };
  51. //======================================================
  52. void MskModulator::Initialize(void)
  53. {
  54.    Samps_Out_Cnt = 0;
  55.    Block_Size = I_In_Sig->GetBlockSize();
  56.    Samp_Intvl = I_In_Sig->GetSampIntvl();
  57. }
  58. //======================================================
  59. int MskModulator::Execute(void)
  60. {
  61.    float *i_in_sig_ptr, *q_in_sig_ptr;
  62.    float *phase_out_sig_ptr, *mag_out_sig_ptr;
  63.    float subcar_misalign, amp_unbal, data_skew;
  64.    float work, work1;
  65.    std::complex<float> work2;
  66.    std::complex<float> *cmpx_out_sig_ptr;
  67.    int samps_out_cnt;
  68.    double samp_intvl;
  69.    double pi_over_bit_dur, argument;
  70.    std::complex<float> phase_shift;
  71.    long int_mult;
  72.    int shaping_is_bipolar;
  73.    int block_size;
  74.    int is;
  75.    cmpx_out_sig_ptr = GET_OUTPUT_PTR( Cmpx_Out_Sig );
  76.    phase_out_sig_ptr = GET_OUTPUT_PTR( Phase_Out_Sig );
  77.    mag_out_sig_ptr = GET_OUTPUT_PTR( Mag_Out_Sig );
  78.    i_in_sig_ptr = GET_INPUT_PTR( I_In_Sig );
  79.    q_in_sig_ptr = GET_INPUT_PTR( Q_In_Sig );
  80.    samps_out_cnt = Samps_Out_Cnt;
  81.    samp_intvl = Samp_Intvl;
  82.    subcar_misalign = Subcar_Misalign;
  83.    amp_unbal = Amp_Unbal;
  84.    data_skew = Data_Skew;
  85.    pi_over_bit_dur = Pi_Over_Bit_Dur;
  86.    phase_shift = Phase_Shift;
  87.    shaping_is_bipolar = Shaping_Is_Bipolar;
  88.    block_size = I_In_Sig->GetValidBlockSize();
  89.    Cmpx_Out_Sig->SetValidBlockSize(block_size);
  90.    Mag_Out_Sig->SetValidBlockSize(block_size);
  91.    Phase_Out_Sig->SetValidBlockSize(block_size);
  92.    for (is=0; is<block_size; is++){
  93.       argument = pi_over_bit_dur * samps_out_cnt *
  94.                   samp_intvl;
  95.       int_mult = long(argument/TWO_PI);
  96.       argument -= int_mult*TWO_PI;
  97.       if(shaping_is_bipolar){
  98.          work1 = float((*i_in_sig_ptr) 
  99.             * sin(argument-pi_over_bit_dur*
  100.             subcar_misalign));
  101.          work = float(amp_unbal * (*q_in_sig_ptr) 
  102.             * cos(argument-pi_over_bit_dur
  103.             *(subcar_misalign+data_skew)));
  104.       }
  105.       else{
  106.          work1 = float((*i_in_sig_ptr) 
  107.             * fabs(sin(argument-pi_over_bit_dur*
  108.             subcar_misalign)));
  109.          work = float(amp_unbal * (*q_in_sig_ptr) 
  110.             * fabs(cos(argument-pi_over_bit_dur
  111.             *(subcar_misalign+data_skew))));
  112.       }
  113.       work2 = work * phase_shift;
  114.       *cmpx_out_sig_ptr = work1 + work2;
  115.       *phase_out_sig_ptr = float(180.0*
  116.                std::arg<float>(*cmpx_out_sig_ptr)/PI);
  117.       *mag_out_sig_ptr = 
  118.                std::abs<float>(*cmpx_out_sig_ptr);
  119.       samps_out_cnt++;
  120.       i_in_sig_ptr++;
  121.       q_in_sig_ptr++;
  122.       cmpx_out_sig_ptr++;
  123.       phase_out_sig_ptr++;
  124.       mag_out_sig_ptr++;
  125.    }
  126.    Samps_Out_Cnt = samps_out_cnt;
  127.    return(_MES_AOK);
  128. }