コード例 #1
0
BandpassMixer::BandpassMixer( char* instance_name,
                                  PracSimModel* outer_model,
                                  Signal< float >* in_sig_1,
                                  Signal< float >* in_sig_2,
                                  Signal< float >* out_sig )
                :PracSimModel(instance_name,
                              outer_model)
{
  MODEL_NAME(BandpassMixer);

  //-----------------------------------------
  //  Read model config parms

  //OPEN_PARM_BLOCK;


  //--------------------------------------
  //  Connect input and output signals

  Out_Sig = out_sig;
  In_Sig_1 = in_sig_1;
  In_Sig_2 = in_sig_2;

  MAKE_OUTPUT( Out_Sig );
  MAKE_INPUT( In_Sig_1 );
  MAKE_INPUT( In_Sig_2 );

}
コード例 #2
0
ComplexVco::ComplexVco( char* instance_name,
                              PracSimModel* outer_model,
                              Signal<float>* in_sig,
                              Signal< complex<float> >* out_sig)
                :PracSimModel(instance_name,
                              outer_model)
{
  MODEL_NAME(ComplexVco);

  //----------------------------------------
  //  Read model config parms

  OPEN_PARM_BLOCK;

  GET_DOUBLE_PARM(Freq_Lo_Hz);
  GET_DOUBLE_PARM(Freq_Hi_Hz);
  GET_FLOAT_PARM(Lo_Control_Val);
  GET_FLOAT_PARM(Hi_Control_Val);

  //-------------------------------------
  //  Connect input and output signals

  In_Sig = in_sig;
  Out_Sig = out_sig;

  MAKE_OUTPUT( Out_Sig );
  MAKE_INPUT( In_Sig );

  //----------------------------------
  //  Compute derived parameters

  Hz_Per_Volt = (Freq_Hi_Hz - Freq_Lo_Hz)/(Hi_Control_Val - Lo_Control_Val);

}
コード例 #3
0
QuadCarrierRecovGenie::QuadCarrierRecovGenie( char* instance_name,
                                PracSimModel* outer_model,
                                Signal<float> *i_recov_carrier,
                                Signal<float> *q_recov_carrier )
              :PracSimModel(instance_name,
                            outer_model)
{
  MODEL_NAME(QuadCarrierRecovGenie);

  //-----------------------------------
  // Read configuration parameters
  OPEN_PARM_BLOCK;

  GET_DOUBLE_PARM(Carrier_Freq);
  Carrier_Freq_Rad = TWO_PI * Carrier_Freq;
  GET_DOUBLE_PARM(Phase_Offset_Deg);
  Phase_Offset_Rad = PI * Phase_Offset_Deg /180.0;

  //-----------------------------------
  //  Signals

  I_Recov_Carrier = i_recov_carrier;
  Q_Recov_Carrier = q_recov_carrier;

  MAKE_OUTPUT( I_Recov_Carrier );
  MAKE_OUTPUT( Q_Recov_Carrier );

  return;
  }
コード例 #4
0
BesselFilterByIir<T>::BesselFilterByIir( char *instance_name,
                                      PracSimModel *outer_model,
                                      Signal<T> *in_sig,
                                      Signal<T> *out_sig )
                  :AnalogFilterByIir<T>( instance_name,
                               outer_model,
                               in_sig,
                               out_sig )
{
  MODEL_NAME(BesselFilterByIir);
  //OPEN_PARM_BLOCK;
  // All of the parameters needed to specify a Butterworth filter
  // are common to all the classic types: Chebyshev, Elliptical, Bessel.
  // Since they will be needed by all types of filters they are
  // read by the AnalogFilter base class.
  
  if( !Bypass_Enabled)
    {
    GET_BOOL_PARM(Delay_Norm_Enabled);

    // construct a Bessel prototype
    Lowpass_Proto_Filt = new BesselPrototype( Prototype_Order,
                                              Delay_Norm_Enabled);
    Lowpass_Proto_Filt->DumpBiquads(DebugFile);
    Lowpass_Proto_Filt->GetDenomPoly(false);
    }
  return;
};
コード例 #5
0
Upsampler< T >::Upsampler( char* instance_name,
                                PracSimModel* outer_model,
                                Signal<T>* in_signal,
                                Signal<T>* out_signal )
              :PracSimModel(instance_name,
                            outer_model)
{  
  MODEL_NAME(Upsampler);
  ENABLE_MULTIRATE;

//  ActiveModel = this;

  //-----------------------------------
  // Read configuration parameters
  OPEN_PARM_BLOCK;

  GET_INT_PARM(Interp_Rate);

  //-----------------------------------
  //  Signals

  In_Sig = in_signal;
  Out_Sig = out_signal;

  MAKE_OUTPUT( Out_Sig );
  MAKE_INPUT( In_Sig );
  CHANGE_RATE(In_Sig, Out_Sig, Interp_Rate);
};
コード例 #6
0
YuleWalkerPsdEstim::YuleWalkerPsdEstim(  
                              char* instance_name,
                              PracSimModel* outer_model,
                              Signal<float>* in_sig )
         :PracSimModel( instance_name,
                        outer_model )
{
   MODEL_NAME(YuleWalkerPsdEstim);
   OPEN_PARM_BLOCK;
   GET_INT_PARM(Seg_Len);
   GET_INT_PARM(Ar_Order);
   GET_INT_PARM(Hold_Off);
   GET_INT_PARM(Num_Freq_Pts);

   Psd_File_Name = new char[64];
   strcpy(Psd_File_Name, "\0");
   GET_STRING_PARM(Psd_File_Name);
   GET_DOUBLE_PARM(Freq_Norm_Factor);
   GET_BOOL_PARM(Output_In_Decibels);
   GET_BOOL_PARM(Plot_Two_Sided);
   GET_BOOL_PARM(Halt_When_Completed);

   In_Sig = in_sig;
   MAKE_INPUT(In_Sig);

   Time_Seg = new double[Seg_Len];
   Sample_Spectrum = new double[Seg_Len];

   for(int is=0; is<Seg_Len; is++){
      Sample_Spectrum[is] = 0.0;
   }
   Processing_Completed = false;
}
コード例 #7
0
RateChanger< T >::RateChanger( char* instance_name,
                                PracSimModel* outer_model,
                                Signal<T>* in_signal,
                                Signal<T>* out_signal )
              :PracSimModel(instance_name,
                            outer_model)
{  
   MODEL_NAME(RateChanger);
   ENABLE_MULTIRATE;
   ENABLE_CONST_INTERVAL;
   ActiveModel = this;

   //-----------------------------------
   // Read configuration parameters
   OPEN_PARM_BLOCK;

   GET_INT_PARM(Num_Sidelobes);

   GET_DOUBLE_PARM(Rate_Change_Factor);

   //-----------------------------------
   //  Signals

   In_Sig = in_signal;
   Out_Sig = out_signal;

   MAKE_INPUT( In_Sig );
   MAKE_OUTPUT( Out_Sig );

   // one sample per bit at input
   CHANGE_RATE( In_Sig, Out_Sig, Rate_Change_Factor );
  return;
  }
コード例 #8
0
ContinuousDelayTester< T >::ContinuousDelayTester( char* instance_name,
                                PracSimModel* outer_model,
                                Signal<T>* in_signal,
                                Signal<T>* out_signal,
                                Control<float> *delay_value,
                                Control<bool> *delay_change_enabled )
              :PracSimModel(instance_name,
                            outer_model)
{
  MODEL_NAME(ContinuousDelayTester);


  //-----------------------------------
  //  Signals

  In_Sig = in_signal;
  Out_Sig = out_signal;

  MAKE_OUTPUT( Out_Sig );
  MAKE_INPUT( In_Sig );

  //--------------------------------
  //  Controls

  Delay_Value = delay_value;
  Delay_Change_Enabled = delay_change_enabled;

  return;
  }
コード例 #9
0
ファイル: sim-model.c プロジェクト: ajinkya93/netbsd-src
const MODEL *
sim_model_lookup (const char *name)
{
  const MACH **machp;
  const MODEL *model;

  for (machp = & sim_machs[0]; *machp != NULL; ++machp)
    {
      for (model = MACH_MODELS (*machp); MODEL_NAME (model) != NULL; ++model)
	{
	  if (strcmp (MODEL_NAME (model), name) == 0)
	    return model;
	}
    }
  return NULL;
}
コード例 #10
0
//====================================================
SignalAnchor::SignalAnchor( char* instance_name,
                        PracSimModel* outer_model,
                        Signal<bit_t>* bit_signal,
                        Signal<byte_t>* byte_signal )
          :PracSimModel(instance_name,
                        outer_model)
{
  MODEL_NAME(SignalAnchor);
  int block_size;
  double samp_intvl;
  
  OPEN_PARM_BLOCK;
  
  GET_DOUBLE_PARM( samp_intvl );
  GET_INT_PARM( block_size );
  Bit_Signal = bit_signal;
  Byte_Signal = byte_signal;

  MAKE_INPUT(Bit_Signal);
  MAKE_INPUT(Byte_Signal);
  SET_SAMP_INTVL(Bit_Signal, samp_intvl);
  SET_BLOCK_SIZE(Bit_Signal, block_size);
  SET_SAMP_INTVL(Byte_Signal, samp_intvl);
  SET_BLOCK_SIZE(Byte_Signal, block_size);

}
コード例 #11
0
FskCarrierGenie::FskCarrierGenie( char* instance_name,
                                  PracSimModel* outer_model,
                                  Signal< std::complex<float> > *lo_ref_sig,
                                  Signal< std::complex<float> > *hi_ref_sig )
    :PracSimModel(instance_name,
                  outer_model)
{
    MODEL_NAME(FskCarrierGenie);

    //-----------------------------------
    // Read configuration parameters
    OPEN_PARM_BLOCK;

    GET_DOUBLE_PARM(Carrier_Freq_Hz);
    GET_DOUBLE_PARM(Freq_Offset_Hz);
    GET_INT_PARM( Lo_Ref_Samp_Shift );
    GET_INT_PARM( Hi_Ref_Samp_Shift );

    //-----------------------------------
    //  Signals

    Lo_Ref_Sig = lo_ref_sig;
    Hi_Ref_Sig = hi_ref_sig;

    MAKE_OUTPUT( Lo_Ref_Sig );
    MAKE_OUTPUT( Hi_Ref_Sig );
    //----------------------------------
    //  Compute derived parameters

    Freq_Hi_Hz = Carrier_Freq_Hz + Freq_Offset_Hz;
    Freq_Lo_Hz = Carrier_Freq_Hz - Freq_Offset_Hz;


    return;
}
コード例 #12
0
ChebyshevFilterByIir<T>::ChebyshevFilterByIir( char *instance_name,
                                  PracSimModel *outer_model,
                                  Signal<T> *in_sig,
                                  Signal<T> *out_sig )
                  :AnalogFilterByIir<T>( instance_name,
                               outer_model,
                               in_sig,
                               out_sig )
{
  MODEL_NAME(ChebyshevFilterByIir);
  OPEN_PARM_BLOCK;
  // Most of the parameters needed to specify a Chebyshev filter
  // are common to all the classic types and are therefore
  // read by the AnalogFilter base class.
  //
  // 'Ripple' is specific to Chebyshev so it is read here in the drerived class
  

  if( !Bypass_Enabled)
    {
    GET_DOUBLE_PARM(Passband_Ripple_In_Db);
    GET_BOOL_PARM(Bw_Is_Ripple_Bw);
    // construct a Chebyshev prototype
    Lowpass_Proto_Filt = new ChebyshevPrototype(  Prototype_Order, 
                                                  Passband_Ripple_In_Db,
                                                  Bw_Is_Ripple_Bw);
    //Lowpass_Proto_Filt->DumpBiquads(DebugFile);
    Lowpass_Proto_Filt->FilterFrequencyResponse();
    }
  return;
}
コード例 #13
0
ファイル: sim-model.c プロジェクト: ajinkya93/netbsd-src
static SIM_RC
sim_model_init (SIM_DESC sd)
{
  SIM_CPU *cpu;

  /* If both cpu model and state architecture are set, ensure they're
     compatible.  If only one is set, set the other.  If neither are set,
     use the default model.  STATE_ARCHITECTURE is the bfd_arch_info data
     for the selected "mach" (bfd terminology).  */

  /* Only check cpu 0.  STATE_ARCHITECTURE is for that one only.  */
  /* ??? At present this only supports homogeneous multiprocessors.  */
  cpu = STATE_CPU (sd, 0);

  if (! STATE_ARCHITECTURE (sd)
      && ! CPU_MACH (cpu))
    {
      /* Set the default model.  */
      const MODEL *model = sim_model_lookup (WITH_DEFAULT_MODEL);
      sim_model_set (sd, NULL, model);
    }

  if (STATE_ARCHITECTURE (sd)
      && CPU_MACH (cpu))
    {
      if (strcmp (STATE_ARCHITECTURE (sd)->printable_name,
		  MACH_BFD_NAME (CPU_MACH (cpu))) != 0)
	{
	  sim_io_eprintf (sd, "invalid model `%s' for `%s'\n",
			  MODEL_NAME (CPU_MODEL (cpu)),
			  STATE_ARCHITECTURE (sd)->printable_name);
	  return SIM_RC_FAIL;
	}
    }
  else if (STATE_ARCHITECTURE (sd))
    {
      /* Use the default model for the selected machine.
	 The default model is the first one in the list.  */
      const MACH *mach = sim_mach_lookup_bfd_name (STATE_ARCHITECTURE (sd)->printable_name);

      if (mach == NULL)
	{
	  sim_io_eprintf (sd, "unsupported machine `%s'\n",
			  STATE_ARCHITECTURE (sd)->printable_name);
	  return SIM_RC_FAIL;
	}
      sim_model_set (sd, NULL, MACH_MODELS (mach));
    }
  else
    {
      STATE_ARCHITECTURE (sd) = bfd_scan_arch (MACH_BFD_NAME (CPU_MACH (cpu)));
    }

  return SIM_RC_OK;
}
コード例 #14
0
ファイル: sim-model.c プロジェクト: ajinkya93/netbsd-src
static SIM_RC
model_option_handler (SIM_DESC sd, sim_cpu *cpu, int opt,
		      char *arg, int is_command)
{
  switch (opt)
    {
    case OPTION_MODEL :
      {
	const MODEL *model = sim_model_lookup (arg);
	if (! model)
	  {
	    sim_io_eprintf (sd, "unknown model `%s'\n", arg);
	    return SIM_RC_FAIL;
	  }
	sim_model_set (sd, cpu, model);
	break;
      }

    case OPTION_MODEL_INFO :
      {
	const MACH **machp;
	const MODEL *model;
	for (machp = & sim_machs[0]; *machp != NULL; ++machp)
	  {
	    sim_io_printf (sd, "Models for architecture `%s':\n",
			   MACH_NAME (*machp));
	    for (model = MACH_MODELS (*machp); MODEL_NAME (model) != NULL;
		 ++model)
	      sim_io_printf (sd, " %s", MODEL_NAME (model));
	    sim_io_printf (sd, "\n");
	  }
	break;
      }
    }

  return SIM_RC_OK;
}
コード例 #15
0
//====================================================
SignalAnchor::SignalAnchor( char* instance_name,
                        PracSimModel* outer_model,
                        Signal<int>* int_signal,
                        double samp_intvl,
                        int block_size )
          :PracSimModel(instance_name,
                        outer_model)
{
  MODEL_NAME(SignalAnchor);
  Int_Signal = int_signal;

  MAKE_INPUT(Int_Signal);
  SET_SAMP_INTVL(Int_Signal, samp_intvl);
  SET_BLOCK_SIZE(Int_Signal, block_size);

}
コード例 #16
0
SignalAnchor::SignalAnchor( char* instance_name,
                        PracSimModel* outer_model,
                        Signal< std::complex<float> >* complex_signal,
                        double samp_intvl,
                        int block_size )
          :PracSimModel(instance_name,
                        outer_model)
{
  MODEL_NAME(SignalAnchor);
  Complex_Signal = complex_signal;

  MAKE_INPUT(Complex_Signal);
  SET_SAMP_INTVL(Complex_Signal, samp_intvl);
  SET_BLOCK_SIZE(Complex_Signal, block_size);

}
コード例 #17
0
QpskOptimalBitDemod::QpskOptimalBitDemod( char* instance_name,
                                  PracSimModel* outer_model,
                                  Signal< std::complex< float > >* in_sig,
                                  Signal< std::complex< float > >* carrier_ref_sig,
                                  Signal< bit_t >* symb_clock_in,
                                  Signal< bit_t >* i_decis_out,
                                  Signal< bit_t >* q_decis_out )
                :PracSimModel(instance_name,
                              outer_model)
{
  MODEL_NAME(QpskOptimalBitDemod);

  ENABLE_MULTIRATE;

  //-----------------------------------------
  //  Read model config parms

  OPEN_PARM_BLOCK;

  GET_INT_PARM(Samps_Per_Symb);
  GET_BOOL_PARM(Constel_Offset_Enabled);

  //--------------------------------------
  //  Connect input and output signals

  I_Decis_Out = i_decis_out;
  Q_Decis_Out = q_decis_out;
  Symb_Clock_In = symb_clock_in;
  Carrier_Ref_Sig = carrier_ref_sig;
  In_Sig = in_sig;

  MAKE_OUTPUT( I_Decis_Out );
  MAKE_OUTPUT( Q_Decis_Out );
  MAKE_INPUT( Symb_Clock_In );
  MAKE_INPUT( Carrier_Ref_Sig );
  MAKE_INPUT( In_Sig );

  double resamp_rate = 1.0/double(Samps_Per_Symb);
  CHANGE_RATE( In_Sig, I_Decis_Out, resamp_rate );
  CHANGE_RATE( In_Sig, Q_Decis_Out, resamp_rate );
  CHANGE_RATE( Carrier_Ref_Sig, I_Decis_Out, resamp_rate );
  CHANGE_RATE( Carrier_Ref_Sig, Q_Decis_Out, resamp_rate );
  CHANGE_RATE( Symb_Clock_In, I_Decis_Out, resamp_rate );

}
コード例 #18
0
QpskModulator::QpskModulator( char* instance_name,
                              PracSimModel* outer_model,
                              Signal<float>* i_in_sig,
                              Signal<float>* q_in_sig,
                              Signal< std::complex<float> >* cmpx_out_sig,
                              Signal<float>* mag_out_sig,
                              Signal<float>* phase_out_sig )
                :PracSimModel(instance_name,
                              outer_model)
{
  MODEL_NAME(QpskModulator);

  //----------------------------------------
  //  Read model config parms

  OPEN_PARM_BLOCK;

  GET_DOUBLE_PARM(Phase_Unbal);
  GET_DOUBLE_PARM(Amp_Unbal);
  //GET_INT_PARM("block_size\0");
  //GET_DOUBLE_PARM("samp_intvl\0");

  //-------------------------------------
  //  Connect input and output signals

  I_In_Sig = i_in_sig;
  Q_In_Sig = q_in_sig;
  Cmpx_Out_Sig = cmpx_out_sig;
  Mag_Out_Sig = mag_out_sig;
  Phase_Out_Sig = phase_out_sig;

  MAKE_OUTPUT( Cmpx_Out_Sig );
  MAKE_OUTPUT( Mag_Out_Sig );
  MAKE_OUTPUT( Phase_Out_Sig );
  MAKE_INPUT( I_In_Sig );
  MAKE_INPUT( Q_In_Sig );


  //-----------------------------------------
  // Set up derived parms

  double phase_unbal_rad = PI * Phase_Unbal / 180.0;
  Real_Unbal = float(cos(phase_unbal_rad) * Amp_Unbal);
  Imag_Unbal = float(sin(phase_unbal_rad) * Amp_Unbal);
}
コード例 #19
0
LevelGener::LevelGener( char* instance_name,
                    PracSimModel* outer_model,
                    Signal<float>* out_sig )
        :PracSimModel( instance_name,
                        outer_model )
{
  MODEL_NAME(LevelGener);
  Out_Sig = out_sig;
  OPEN_PARM_BLOCK;

  //GET_LONG_PARM(Initial_Seed);
  //Seed = Initial_Seed;
  //GET_LONG_PARM(Block_Size);

  GET_FLOAT_PARM(Const_Level);

  MAKE_OUTPUT(Out_Sig);
}
コード例 #20
0
PolarFreqDomainFilter::PolarFreqDomainFilter( char* instance_name,
                                         PracSimModel* outer_model,
                                         Signal< std::complex<float> >* in_sig,
                                         Signal< std::complex<float> >* out_sig)
            :PracSimModel(instance_name,
                          outer_model)
{
   MODEL_NAME(PolarFreqDomainFilter);
   ENABLE_MULTIRATE;
   In_Sig = in_sig;
   Out_Sig = out_sig;

   OPEN_PARM_BLOCK;

   GET_INT_PARM(Fft_Size);
   GET_DOUBLE_PARM(Dt_For_Fft);
   GET_FLOAT_PARM(Overlap_Save_Mem);
   GET_BOOL_PARM(Bypass_Enabled);

   Magnitude_Data_Fname = new char[64];
   strcpy(Magnitude_Data_Fname, "\0");
   GET_STRING_PARM(Magnitude_Data_Fname);
   GET_DOUBLE_PARM(Mag_Freq_Scaling_Factor);

   Phase_Data_Fname = new char[64];
   strcpy(Phase_Data_Fname, "\0");
   GET_STRING_PARM(Phase_Data_Fname);
   GET_DOUBLE_PARM(Phase_Freq_Scaling_Factor);

   Num_Saved_Samps = int(Overlap_Save_Mem/Dt_For_Fft + 0.5);
   Block_Size = Fft_Size - Num_Saved_Samps;

   MAKE_OUTPUT(Out_Sig);
   MAKE_INPUT(In_Sig);

   SET_SAMP_INTVL(In_Sig, Dt_For_Fft);
   SET_BLOCK_SIZE(In_Sig, Block_Size);

   SET_SAMP_INTVL(Out_Sig, Dt_For_Fft);
   SET_BLOCK_SIZE(Out_Sig, Block_Size);

   //SET_DELAY( In_Sig, Out_Sig, Group_Delay_Offset);

}
コード例 #21
0
GaussianNoiseGenerator::GaussianNoiseGenerator( char* instance_name,
                                              PracSimModel* outer_model,
                                              Signal<float>* noise_sig)
                      :PracSimModel(instance_name,
                                    outer_model)
{
  MODEL_NAME(GaussianNoiseGenerator);

  Noise_Sig = noise_sig;

  OPEN_PARM_BLOCK;

  GET_INT_PARM(Seed);
  GET_DOUBLE_PARM(Noise_Sigma);

  //----------------------------------------------
  MAKE_OUTPUT(Noise_Sig);

}
コード例 #22
0
//====================================================
// Dual float signal
SignalAnchor::SignalAnchor( char* instance_name,
                        PracSimModel* outer_model,
                        Signal<float>* float_signal,
                        Signal<float>* float_signal_2,
                        double samp_intvl,
                        int block_size )
          :PracSimModel(instance_name,
                        outer_model)
{
  MODEL_NAME(SignalAnchor);
  Float_Signal = float_signal;
  Float_Signal_2 = float_signal_2;

  MAKE_INPUT(Float_Signal);
  MAKE_INPUT(Float_Signal_2);
  SET_SAMP_INTVL(Float_Signal, samp_intvl);
  SET_BLOCK_SIZE(Float_Signal, block_size);
  SET_SAMP_INTVL(Float_Signal_2, samp_intvl);
  SET_BLOCK_SIZE(Float_Signal_2, block_size);

}
コード例 #23
0
BartlettPeriodogram<T>::
         BartlettPeriodogram( char* instance_name,
                              PracSimModel* outer_model,
                              Signal<T>* in_sig )
                      :PracSimModel(   instance_name,
                                       outer_model )
{
   MODEL_NAME(BartlettPeriodogram);
   OPEN_PARM_BLOCK;
   GET_INT_PARM(Seg_Len);
   GET_INT_PARM(Fft_Len);
   GET_INT_PARM(Hold_Off);
   GET_INT_PARM(Num_Segs_To_Avg);

   Psd_File_Name = new char[64];
   strcpy(Psd_File_Name, "\0");
   GET_STRING_PARM(Psd_File_Name);
   GET_DOUBLE_PARM(Freq_Norm_Factor);
   GET_BOOL_PARM(Output_In_Decibels);
   GET_BOOL_PARM(Plot_Two_Sided);
   GET_BOOL_PARM(Halt_When_Completed);

   In_Sig = in_sig;
   MAKE_INPUT(In_Sig);

   Time_Seg = new T[Seg_Len];
   Sample_Spectrum = new double[Fft_Len];
   Freq_Seg = new std::complex<double>[Fft_Len];

   for(int is=0; is<Fft_Len; is++) {
      Sample_Spectrum[is] = 0.0;
   }

   Psd_File = new ofstream(Psd_File_Name, ios::out);
   Processing_Completed = false;
}
コード例 #24
0
BartlettPeriodogramWindowed<T>::
            BartlettPeriodogramWindowed( 
                              char* instance_name,
                              PracSimModel* outer_model,
                              Signal<T>* in_sig )
                :PracSimModel( instance_name,
                               outer_model )
{
   int is;
   MODEL_NAME(BartlettPeriodogram);
   OPEN_PARM_BLOCK;
   GET_INT_PARM(Seg_Len);
   GET_INT_PARM(Fft_Len);
   GET_INT_PARM(Hold_Off);
   GET_INT_PARM(Num_Segs_To_Avg);
   GET_DOUBLE_PARM(Freq_Norm_Factor);
   GET_BOOL_PARM(Output_In_Decibels);
   GET_BOOL_PARM(Plot_Two_Sided);
   GET_BOOL_PARM(Halt_When_Completed);
   GET_BOOL_PARM(Using_Window);
   Psd_File_Name = new char[64];
   strcpy(Psd_File_Name, "\0");
   GET_STRING_PARM(Psd_File_Name);

   if(Using_Window){
      Window_Shape = 
         GetWindowShapeParm("Window_Shape\0");

      switch(Window_Shape){
      case WINDOW_SHAPE_TRIANGULAR:
         Data_Window = new TriangularWindow( Seg_Len,
                                       _NO_ZERO_ENDS );
         break;
      case WINDOW_SHAPE_HAMMING:
         Data_Window = new HammingWindow( Seg_Len );
         break;
      case WINDOW_SHAPE_HANN:
         Data_Window = new HannWindow( Seg_Len, 
                                       _NO_ZERO_ENDS );
         break;
      }

      Window_Taps = Data_Window->GetDataWindow();
      Window_Power = 0.0;
      for(is=0; is<Seg_Len; is++){
         Window_Power +=Window_Taps[is]*Window_Taps[is];
      }
      Window_Power /= double(Seg_Len);
      double window_scale = sqrt(Window_Power);
      for(is=0; is<Seg_Len; is++){
         Window_Taps[is] /= window_scale;
      }
   }

   In_Sig = in_sig;
   MAKE_INPUT(In_Sig);

   Time_Seg = new T[Seg_Len];
   Win_Time_Seg = new T[Seg_Len];
   Sample_Spectrum = new double[Fft_Len];
   Freq_Seg = new std::complex<double>[Fft_Len];

   for(is=0; is<Fft_Len; is++){
      Sample_Spectrum[is] = 0.0;
   }

   Psd_File = new ofstream(Psd_File_Name, ios::out);
   Processing_Completed = false;
}