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

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = swep_tone_rcvr.cpp
  3. //
  4. #include <stdlib.h>
  5. #include "parmfile.h"
  6. #include "swep_tone_rcvr.h"
  7. #include "misdefs.h"
  8. #include "model_graph.h"
  9. #include "sigplot.h"
  10. #include "dit_pino_T.h"
  11. #include "dit_nipo_T.h"
  12. extern ParmFile* ParmInput;
  13. extern int PassNumber;
  14. #ifdef _DEBUG
  15.   extern ofstream *DebugFile;
  16. #endif
  17. //======================================================
  18. SweptToneReceiver::SweptToneReceiver( char* instance_name,
  19.                                 PracSimModel* outer_model,
  20.                                 Signal<float>* in_sig,
  21.                                 Signal<float>* ref_sig,
  22.                                 Signal<float>* out_sig,
  23.                                 Control<bool>* rx_enable,
  24.                                 Control<double>* inst_freq_ctl,
  25.                                 Control<double>* block_phase_ctl)
  26.             :PracSimModel(instance_name,
  27.                           outer_model)
  28. {
  29.    In_Sig = in_sig;
  30.    Ref_Sig = ref_sig;
  31.    Out_Sig = out_sig;
  32.    OPEN_PARM_BLOCK;
  33.    Response_File_Name = new char[64];
  34.    strcpy(Response_File_Name, "");
  35.    GET_STRING_PARM(Response_File_Name);
  36.    GET_INT_PARM(Max_Num_Freqs);
  37.    GET_INT_PARM(Num_Phases);
  38.    GET_DOUBLE_PARM(Max_Phase_Shift);
  39.    MAKE_OUTPUT(Out_Sig);
  40.    MAKE_INPUT(In_Sig);
  41.    MAKE_INPUT(Ref_Sig);
  42.    SAME_RATE(In_Sig, Out_Sig);
  43.    SAME_RATE(Ref_Sig, Out_Sig);
  44.    //control output: Delay_At_Max_Corr
  45.    //control output: Max_Corr_Angle_Out
  46.    Inst_Freq_Ctl = inst_freq_ctl;
  47.    Block_Phase_Ctl = block_phase_ctl;
  48.    Rx_Enable = rx_enable;
  49.    Response_File = new ofstream(Response_File_Name, ios::out);
  50. }
  51. SweptToneReceiver::~SweptToneReceiver( void ){ };
  52. void SweptToneReceiver::Initialize(void)
  53. {
  54.    //int dummy_size, i;
  55.    //double tmp_nsexp;
  56.    //double frac_part, int_part;
  57.    Proc_Block_Size = Out_Sig->GetBlockSize();
  58.    Samp_Intvl = Out_Sig->GetSampIntvl();
  59.    Max_Corr = 0.0;
  60.    Max_Corr_Time = 0.0;
  61.    Tone_Received = false;
  62.    Num_Freqs = 0;
  63.    Freqs = new double[Max_Num_Freqs];
  64.    Magnitudes = new double[Max_Num_Freqs];
  65.    Phases = new double[Max_Num_Freqs];
  66.    Prev_Phase = 0.0;
  67.    //INITIALIZATION_REPORT(BasicResults);
  68.    return;
  69. }
  70. int SweptToneReceiver::Execute()
  71. {
  72.    using std::complex;
  73.    float *in_sig_ptr;
  74.    float *ref_sig_ptr;
  75.    float *out_sig_ptr;
  76.    float max_corr_val;
  77.    int zero_size;
  78.    int is;
  79.    double corr_i, corr_q, corr_val;
  80.    double base_phase;
  81.    double freq_in_hz;
  82.    double phase_increm;
  83.    double offset_increm;
  84.    double offset_phase;
  85.    double phase;
  86.    //-------------------------------------------------------
  87.    //  Copy frequently accessed member vars into local vars
  88.    std::complex<float> *x = X;
  89.    std::complex<float> *y = Y;
  90.    int proc_block_size = Proc_Block_Size;
  91.    int full_corr_size = Full_Corr_Size;
  92.    int ns_exp = int(Ns_Exp);
  93.    int num_samps, num_cycles;
  94.    double samp_intvl = Samp_Intvl;
  95.    //----------------------------------------
  96.    // Get pointers for input and output
  97.    in_sig_ptr = GET_INPUT_PTR(In_Sig);
  98.    ref_sig_ptr = GET_INPUT_PTR(Ref_Sig);
  99.    out_sig_ptr = GET_OUTPUT_PTR(Out_Sig);
  100.    //----------------------------------------
  101.    zero_size = full_corr_size - proc_block_size;
  102.    base_phase = Block_Phase_Ctl->GetValue();
  103.    freq_in_hz = Inst_Freq_Ctl->GetValue();
  104.    phase_increm = freq_in_hz * Samp_Intvl;
  105.    num_cycles = int(floor( proc_block_size * phase_increm ));
  106.    if(num_cycles == 0)
  107.    {
  108.       num_samps = proc_block_size;
  109.    }
  110.    else
  111.    {
  112.       num_samps = num_cycles / phase_increm;
  113.    }
  114.    //offset_increm = Max_Phase_Shift/Num_Phases;
  115.    offset_increm = 0.1/360.0;
  116.    max_corr_val = 0.0;
  117.    if(Rx_Enable->GetValue())
  118.    {
  119.       Tone_Received = true;
  120.       in_sig_ptr = GET_INPUT_PTR(In_Sig);
  121.       //offset_phase = base_phase - Prev_Phase - offset_idx * offset_increm;
  122.       corr_i = 0.0;
  123.       corr_q = 0.0;
  124.       for( is=0; is<num_samps; is++)
  125.       {
  126.          corr_i += (*in_sig_ptr) * cos(TWO_PI * is * phase_increm );
  127.          corr_q += (*in_sig_ptr) * sin(TWO_PI * is * phase_increm );
  128.          //corr_i += (*in_sig_ptr) * cos(TWO_PI * (base_phase + is * phase_increm) );
  129.          //corr_q += (*in_sig_ptr) * sin(TWO_PI * (base_phase + is * phase_increm) );
  130.          in_sig_ptr++;
  131.       }
  132.       corr_val = corr_i * corr_i + corr_q * corr_q;
  133.       if(corr_val > max_corr_val)
  134.       {
  135.          max_corr_val = corr_val;
  136.          //max_corr_idx = offset_idx;
  137.       }
  138.       out_sig_ptr = GET_OUTPUT_PTR(Out_Sig);
  139.       offset_phase = 180.0 * atan2(corr_q, corr_i)/PI;
  140.       for( is=0; is<proc_block_size; is++)
  141.       {
  142.          *out_sig_ptr = sin(TWO_PI * (offset_phase + (is*phase_increm)) );
  143.          out_sig_ptr++;
  144.       }
  145.       phase = 180.0 * atan2(corr_i, corr_q)/PI;
  146.       if( phase > 0.0 && phase < 480.0)
  147.       {
  148.          phase -= 360.0;
  149.       }
  150.       Phases[Num_Freqs] = phase;
  151.       Freqs[Num_Freqs] = freq_in_hz;
  152.       Magnitudes[Num_Freqs] = 20*log10(2.0*sqrt(max_corr_val)/num_samps);
  153.       (*DebugFile) << "max_corr_val = " << max_corr_val << endl;
  154.       (*DebugFile) << "phase of max corr = " << Phases[Num_Freqs] << endl;
  155.       Num_Freqs++;
  156.    }
  157.    else
  158.    {
  159.       if(Tone_Received)
  160.       {
  161.          Tone_Received = false;
  162.          for( is=0; is < Num_Freqs; is++)
  163.          {
  164.          *Response_File << Freqs[is] << ", " << Magnitudes[is] << ", " << Phases[is] << endl;
  165.          }
  166.       }
  167.    }
  168.    //---------------------
  169.    return(_MES_AOK);
  170. }