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

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = signal_T.cpp
  3. //
  4. #include <stdlib.h>
  5. #include <fstream>
  6. #include <iomanip>
  7. #include <complex>
  8. #include "signal_T.h"
  9. #include "sigplot.h"
  10. #include "typedefs.h"
  11. #include "complex_io.h"
  12. #ifdef _DEBUG
  13.   extern ofstream *DebugFile;
  14. #endif
  15. extern PracSimModel *CommSystem;
  16. extern SignalPlotter SigPlot;
  17. extern int EnclaveOffset[10];
  18. extern int PassNumber;
  19. //======================================================
  20. //  Constructor used for creating root Signal objects
  21. //template< class T >
  22. //Signal<T>::Signal( char* name, PracSimModel* model )
  23. //            :GenericSignal( name, model )
  24. //{
  25. //  Root_Id = this;
  26. //  Sig_Is_Root = true;
  27. //}
  28. //======================================================
  29. template< class T >
  30. Signal<T>::Signal( Signal<T>* root_id, 
  31.                           char* name, 
  32.                           PracSimModel* model )
  33.             :GenericSignal( name, model )
  34. {
  35.   Root_Id = root_id;
  36.   Sig_Is_Root = false;
  37. }
  38. //========================================================
  39. //  Constructor used for creating Signal objects in main
  40. //  (owning model is hard wired to 'CommSystem' )
  41. template< class T >
  42. Signal<T>::Signal( char* name )
  43.             :GenericSignal( name, CommSystem )
  44. {
  45.   Root_Id = this;
  46.   Sig_Is_Root = true;
  47. }
  48. //===============================================
  49. template< class T >
  50. Signal<T>::~Signal( void )
  51. {
  52.   delete Buf_Beg;
  53. };
  54. //===============================================
  55. template< class T >
  56. void Signal<T>::AllocateSignalBuffer(void)
  57. {
  58.   *DebugFile << "now in Signal<T>::AllocateSignalBuffer" << endl;
  59.   if(Block_Size <= 0)
  60.     {
  61.     *DebugFile << "attempt to allocate zero-length buffer in "
  62.               << GetName() << endl;
  63.     }
  64.   Phys_Buf_Beg = NULL;
  65.   Phys_Buf_Beg = new T[Block_Size + Alloc_Mem_Depth];
  66.   if(Phys_Buf_Beg == NULL)
  67.   {
  68.       *DebugFile << "buffer allocation failed in "
  69.               << GetName() << endl;
  70.               exit(98);
  71.   }
  72.   Buf_Beg = Phys_Buf_Beg + Alloc_Mem_Depth;
  73.   // area from Phys_Buf_Beg to Buf_Beg is block-to-block carryover
  74.   // for devices like filters that use prior input samples in 
  75.   // computation of current output sample
  76.   
  77.   Buf_Final_Mem_Beg = Phys_Buf_Beg + Block_Size;
  78.   Cumul_Samps_Thru_Prev_Block = 0;
  79. }
  80. //===============================================
  81. template< class T >
  82. void Signal<T>::InitializeReadPtrs(void)
  83. {
  84.   Signal<T>* conn_sig;
  85.   int num_sigs;
  86.   num_sigs = int(Connected_Sigs->size());
  87.   for(int sig_num = 0; sig_num < num_sigs; sig_num++)
  88.     {
  89.      conn_sig = (Signal<T>*)Connected_Sigs->at(sig_num);
  90.      conn_sig->Buf_Beg = this->Buf_Beg;
  91.      conn_sig->Buf_Len = this->Buf_Len;
  92.      conn_sig->Block_Size = this->Block_Size;
  93.      #ifdef _USE_SAMP_RATE
  94.        conn_sig->Samp_Rate = this->Samp_Rate;
  95.      #else
  96.        conn_sig->Samp_Intvl = this->Samp_Intvl;
  97.      #endif
  98.     }
  99. }
  100. //===============================================
  101. template< class T >
  102. T* Signal<T>::GetRawOutputPtr(PracSimModel* model)
  103. {
  104. return(Buf_Beg);
  105. }
  106. //===============================================
  107. template< class T >
  108. T* Signal<T>::GetRawInputPtr(PracSimModel* model)
  109. {
  110. return(Buf_Beg);
  111. }
  112. //==============================================================
  113. template< class T >
  114. Signal<T>* Signal<T>::AddConnection(  PracSimModel* model,
  115.                                           char* name_in_model )
  116. {
  117.   Signal<T>* new_sig;
  118.   new_sig = new Signal<T>(this, name_in_model, model);
  119.   Connected_Sigs->push_back(new_sig);
  120.   return(new_sig);
  121. }
  122. //==============================================================
  123. //template< class T >
  124. //Signal<T>* Signal<T>::AddConnection(  PracSimModel* model,
  125. //                                      char* name_in_model,
  126. //                                      Signal<T>* new_sig )
  127. //{
  128. //  //Signal<T>* new_sig;
  129. //  new_sig = new Signal<T>(this, name_in_model, model);
  130. //  Connected_Sigs->push_back(new_sig);
  131. //  return(new_sig);
  132. //}
  133. //===============================================
  134. template< class T >
  135. void Signal<T>::Dump(ofstream out_file)
  136. {
  137.   T *data_ptr;
  138. //  data_ptr = Buf_Beg+32;
  139.   data_ptr = Buf_Beg;
  140.   for(int i=0; i<Buf_Len; i++)
  141.     {
  142.     out_file << i << ", " << (*data_ptr) << endl;
  143.     data_ptr++;
  144.     }
  145. }
  146. //===============================================
  147. template< class T >
  148. void Signal<T>::PassUpdate(void)
  149. {
  150.   #ifdef _USE_SAMP_RATE
  151.     Time_At_Beg += Valid_Block_Size/Samp_Rate;
  152.   #else
  153.     Time_At_Beg += Valid_Block_Size * Samp_Intvl;
  154.   #endif
  155.   Prev_Block_Size = Valid_Block_Size;
  156.   Cumul_Samps_Thru_Prev_Block += Valid_Block_Size;
  157.   // copy samples for signals with memory
  158.   if(Alloc_Mem_Depth != 0)
  159.     {
  160.     for(int ix=0; ix<Alloc_Mem_Depth; ix++)
  161.       {
  162.       Phys_Buf_Beg[ix] = Buf_Final_Mem_Beg[ix];
  163.       }
  164.     }
  165. }
  166. //===============================================
  167. template< class T >
  168. void Signal<T>::SetupPlotSignal(void)
  169. {
  170.   if(Plot_Setup_Complete) return;
  171.   //------------------------------------------------
  172.   // If plotting is enabled for this signal, setup the buffer
  173.   // read pointers that will be needed to fetch the data to 
  174.   // be plotted.
  175.   if(Plotting_Enabled)
  176.     {
  177. //    Next_Loc_To_Plot = Buf_Beg;
  178.     #ifdef _USE_SAMP_RATE
  179.       Start_Sample = (int)(Plot_Start_Time*Samp_Rate);
  180.       Stop_Sample = (int)((Plot_Stop_Time*Samp_Rate)
  181.                           /Plot_Decim_Rate) * Plot_Decim_Rate;
  182.     #else
  183.       Start_Sample = (int)(Plot_Start_Time / Samp_Intvl);
  184.       Stop_Sample = (int)((Plot_Stop_Time / Samp_Intvl)
  185.                           /Plot_Decim_Rate) * Plot_Decim_Rate;
  186.     #endif
  187.     Plotting_Wakeup = 1 + Start_Sample/Block_Size;
  188.     Plotting_Bedtime = 1 + (Stop_Sample/Block_Size);
  189.     SigPlot.SetWakeAndSleep(  this,
  190.                               Plotting_Wakeup,
  191.                               Plotting_Bedtime);
  192.     Plot_Setup_Complete = true;
  193.     }
  194. }
  195. //============================================
  196. #ifdef _ENCLAVES
  197. template< class T >
  198. void Signal<T>::IssuePlotterData(void)
  199. {
  200.   T *plot_data_ptr;
  201.   int samp_cnt;
  202.   int beg_samp_cnt;
  203.   int end_samp_cnt;
  204.   int next_plot_pass;
  205.   double samp_time;
  206.   //-----------------------------------------------------------
  207.   // If this is the first block being plotted for this signal,
  208.   // calculate which sample to start with.  Otherwise start
  209.   // with the first sample in the block.
  210.   if(PassNumber == Plotting_Wakeup)
  211.     {
  212.     plot_data_ptr = Buf_Beg + (Start_Sample % Buf_Len);
  213.     beg_samp_cnt = Start_Sample % Buf_Len;
  214.     Cumul_Samp_Cnt = Start_Sample;
  215.     }
  216.   else
  217.     {
  218.     plot_data_ptr = Next_Loc_To_Plot;
  219.     beg_samp_cnt = (Next_Loc_To_Plot - Buf_Beg) % Block_Size;
  220.     }
  221.   //---------------------------------------------------------------
  222.   // Calculate the pass in which the next samples to be plotted occur.
  223.   // If it is after the current pass, wait (return).
  224.   // This check is needed  to accommodate Plot_Decim_Rate greater than
  225.   // the block size.
  226.   next_plot_pass = Cumul_Samp_Cnt/Block_Size + 1;
  227.   if( next_plot_pass > PassNumber ) return;
  228.   //--------------------------------------------------------
  229.   // If this is the final block being plotted for this signal,
  230.   // calculate which sample to end with.  Otherwise plot
  231.   // until the end of the block.
  232.   if(PassNumber == Plotting_Bedtime)
  233.     {
  234.     end_samp_cnt = Stop_Sample % Block_Size;
  235.     }
  236.   else
  237.     {
  238.     end_samp_cnt = Block_Size;
  239.     }
  240.   //---------------------------------------------------------
  241.   // Over desired time interval, get samples from signal buffer
  242.   // and write them to the signal data file.
  243.   for( samp_cnt = beg_samp_cnt; samp_cnt < end_samp_cnt;
  244.        samp_cnt += Plot_Decim_Rate)
  245.     {
  246.     if(Count_Vice_Time)
  247.       {
  248.       (*Plotter_File).setf(ios::scientific | ios::right);
  249.       (*Plotter_File) << Cumul_Samp_Cnt
  250.                       << ",  " << *plot_data_ptr << endl;
  251.       }
  252.     else
  253.       {
  254.       //(*Plotter_File).setf(ios::scientific | ios::right);
  255.       //(*Plotter_File) << setw(15) << setprecision(8)
  256.       //                << Cumul_Samp_Cnt / Samp_Rate
  257.       //                << setw(22) << setprecision(15)
  258.       //                << "  " << *plot_data_ptr << endl;
  259.       #ifdef _USE_SAMP_RATE
  260.         (*Plotter_File) << Time_At_Beg + samp_cnt / Samp_Rate
  261.                         << ",  " << *plot_data_ptr << endl;
  262.       #else
  263.         (*Plotter_File).flags(ios::fixed | ios::right);
  264.         //(*Plotter_File) << setprecision(6)
  265.         //                << Time_At_Beg + samp_cnt * Samp_Intvl
  266.         //                << ",  " << flush;
  267.         samp_time = Time_At_Beg - Block_Size * EnclaveOffset[Enclave_Num]*Samp_Intvl
  268.                      + samp_cnt * Samp_Intvl;
  269.         (*Plotter_File) << setprecision(6)
  270.                         << samp_time
  271.                         << ",  " << flush;
  272.         (*Plotter_File).flags(ios::scientific | ios::right);
  273.         (*Plotter_File) << *plot_data_ptr << endl;
  274.       #endif
  275.       }
  276.     plot_data_ptr += Plot_Decim_Rate;
  277.     Cumul_Samp_Cnt += Plot_Decim_Rate;
  278.     }
  279.   Next_Loc_To_Plot = plot_data_ptr;
  280.   if(Next_Loc_To_Plot >= (Buf_Beg + Buf_Len))
  281.     {
  282.     Next_Loc_To_Plot = Buf_Beg + ((int)(Next_Loc_To_Plot -
  283.                         Buf_Beg) % Block_Size);
  284.     }
  285.   return;
  286. }
  287. #endif
  288. //#ifdef _VAR_BLOCKS
  289. //============================================
  290. template< class T >
  291. void Signal<T>::IssuePlotterData(void)
  292. {
  293.   T *plot_data_ptr;
  294.   int samp_cnt;
  295.   int beg_samp_cnt;
  296.   int end_samp_cnt;
  297.   int next_plot_pass;
  298.   double samp_time;
  299.   //-----------------------------------------------------------
  300.   // If this is the first block being plotted for this signal,
  301.   // calculate which sample to start with.  Otherwise start
  302.   // with the first sample in the block.
  303.   if( Stop_Sample < Cumul_Samp_Cnt )
  304.     {
  305.     // plotting is completed for this signal
  306.     Cumul_Samp_Cnt += Valid_Block_Size;
  307.     return;
  308.     }
  309.   if( Start_Sample >= Cumul_Samp_Cnt + Valid_Block_Size)
  310.     {
  311.     // plotting does not start until a later block
  312.     Cumul_Samp_Cnt += Valid_Block_Size;
  313.     return;
  314.     }
  315.   if(Start_Sample >= Cumul_Samp_Cnt)
  316.     {
  317.     // plotting begins somewhere in this block
  318.     plot_data_ptr = Buf_Beg + (Start_Sample - Cumul_Samp_Cnt);
  319.     beg_samp_cnt = Start_Sample - Cumul_Samp_Cnt;
  320.     }
  321.   else
  322.     {
  323.     // plotting has already started
  324.     //plot_data_ptr = Next_Loc_To_Plot;
  325.     plot_data_ptr = Buf_Beg;
  326.     //beg_samp_cnt = (Next_Loc_To_Plot - Buf_Beg) % Prev_Block_Size;
  327.     beg_samp_cnt = 0;
  328.     }
  329.   //---------------------------------------------------------------
  330.   // Calculate the pass in which the next samples to be plotted occur.
  331.   // If it is after the current pass, wait (return).
  332.   // This check is needed  to accommodate Plot_Decim_Rate greater than
  333.   // the block size.
  334.   next_plot_pass = Cumul_Samp_Cnt/Block_Size + 1;
  335.   if( next_plot_pass > PassNumber ) return;
  336.   //--------------------------------------------------------
  337.   // If this is the final block being plotted for this signal,
  338.   // calculate which sample to end with.  Otherwise plot
  339.   // until the end of the block.
  340.   if( Cumul_Samp_Cnt + Valid_Block_Size > Stop_Sample )
  341.     {
  342.     // plotting ends somewhere in this block
  343.     end_samp_cnt = Stop_Sample - Cumul_Samp_Cnt;
  344.     }
  345.   else
  346.     {
  347.     // plotting continues thru end of block
  348.     end_samp_cnt = Valid_Block_Size;
  349.     }
  350.   //---------------------------------------------------------
  351.   // Over desired time interval, get samples from signal buffer
  352.   // and write them to the signal data file.
  353.   Cumul_Samp_Cnt += beg_samp_cnt;
  354.   for( samp_cnt = beg_samp_cnt; samp_cnt < end_samp_cnt;
  355.        samp_cnt += Plot_Decim_Rate)
  356.     {
  357.     if(Count_Vice_Time)
  358.       {
  359.       (*Plotter_File).setf(ios::scientific | ios::right);
  360.       (*Plotter_File) << Cumul_Samp_Cnt
  361.                       << ",  " << *plot_data_ptr << endl;
  362.       }
  363.     else
  364.       {
  365.       //(*Plotter_File).setf(ios::scientific | ios::right);
  366.       //(*Plotter_File) << setw(15) << setprecision(8)
  367.       //                << Cumul_Samp_Cnt / Samp_Rate
  368.       //                << setw(22) << setprecision(15)
  369.       //                << "  " << *plot_data_ptr << endl;
  370.       #ifdef _USE_SAMP_RATE
  371.         (*Plotter_File) << Time_At_Beg + samp_cnt / Samp_Rate
  372.                         << ",  " << *plot_data_ptr << endl;
  373.       #else
  374.         (*Plotter_File).flags(ios::fixed | ios::right);
  375.         //(*Plotter_File) << setprecision(6)
  376.         //                << Time_At_Beg + samp_cnt * Samp_Intvl
  377.         //                << ",  " << flush;
  378. //        samp_time = Time_At_Beg - Block_Size * EnclaveOffset[Enclave_Num]*Samp_Intvl
  379. //                     + samp_cnt * Samp_Intvl;
  380.         samp_time = Time_At_Beg + samp_cnt * Samp_Intvl;
  381.         (*Plotter_File) << setprecision(6)
  382.                         << samp_time
  383.                         << ",  " << flush;
  384.         (*Plotter_File).flags(ios::scientific | ios::right);
  385.         (*Plotter_File) << *plot_data_ptr << endl;
  386.       #endif
  387.       }
  388.     plot_data_ptr += Plot_Decim_Rate;
  389.     if(plot_data_ptr >= (Buf_Beg + Buf_Len))
  390.     {
  391.     int debug_flag=1;
  392.     }
  393.     Cumul_Samp_Cnt += Plot_Decim_Rate;
  394.     }
  395.   Next_Loc_To_Plot = plot_data_ptr;
  396.   if(Next_Loc_To_Plot >= (Buf_Beg + Buf_Len))
  397.     {
  398.     Next_Loc_To_Plot = Buf_Beg + ((int)(Next_Loc_To_Plot -
  399.                         Buf_Beg) % Block_Size);
  400.     }
  401.   return;
  402. }
  403. //#endif //_VAR_BLOCKS
  404. template Signal<float>;
  405. //template Signal<bit_t>;
  406. template Signal<byte_t>;
  407. template Signal< std::complex<float> >;
  408. template Signal< int >;