bpmprocess/ddc_sample_waveform.c

Go to the documentation of this file.
00001 
00005 #include <stdio.h>
00006 #include <stdlib.h>
00007 
00008 #include <bpm/bpm_alloc.h>
00009 #include <bpm/bpm_units.h>
00010 #include <bpm/bpm_messages.h>
00011 #include <bpm/bpm_process.h>
00012 
00013 #ifndef DDC_SAMPLE_DEBUG__
00014 #define DDC_SAMPLE_DEBUG__
00015 #endif
00016 
00017 #undef DDC_SAMPLE_DEBUG__
00018 
00019 
00040 int ddc_sample_waveform( int *wf, int ns, int nbits, double fs, double t0, double t0Offset, 
00041                          double freq, double tdecay, double filtBW, double epsFilt,
00042                          double *amp, double *phase ) {
00043 
00044   int unsat_sample;
00045   double dt, tunsat, tstart, tfilter, tstop, omega;
00046   double **ddc, filt_ddc[2];
00047   char msg[80];
00048   int istart, ifilter, istop, i;
00049 
00050   if ( ! wf ) {
00051     bpm_error( "Invalid waveform pointer in ddc_sample_waveform(...)",
00052                __FILE__, __LINE__ );
00053     return BPM_FAILURE;
00054   }
00055 
00056   // get last unsaturated sample
00057   if ( handle_saturation( wf, ns, 200, nbits, 64, &unsat_sample ) == BPM_FAILURE ) {
00058     bpm_error( "Unable to handle saturation in ddc_sample_waveform(...)",
00059                __FILE__, __LINE__ );
00060     return BPM_FAILURE;
00061   }
00062 
00063 #ifdef DDC_SAMPLE_DEBUG__
00064   printf( "DBG:[ddc_sample_waveform] last unsaturated sample : %d\n", unsat_sample );
00065   printf( "DBG:[ddc_sample_waveform] t0Offset : %f\n", t0Offset );
00066   fflush( stdout );
00067 #endif
00068 
00069   // allocate complex ddc waveform
00070   ddc = alloc_complex_wave_double( ns );
00071   if ( ! ddc ) {
00072     bpm_error( "Unable to allocate memory for ddc in ddc_sample_waveform(...)",
00073                __FILE__, __LINE__ );
00074     return BPM_FAILURE;
00075   }
00076 
00077   // remove offset and downmix the waveform
00078   if ( downmix_waveform( wf, ns, fs, freq, t0, ddc ) == BPM_FAILURE ) {
00079     bpm_error( "Error in downmixing in ddc_sample_waveform(...)", 
00080                __FILE__, __LINE__ );
00081     return BPM_FAILURE;
00082   }
00083 
00084   // filter bandwidth given in MHz, convert it to rad/s
00085   omega = 2*PI*filtBW;
00086   
00087   // determine cut-off time from cut-off parameter epsFilt
00088   dt = sqrt( 2.*log( omega / ( sqrt(2.*PI) * epsFilt ) ) ) / omega;
00089 
00090   tstart  = t0Offset - dt;
00091   tfilter = t0Offset;
00092   tstop   = t0Offset + dt;
00093 
00094 #ifdef DDC_SAMPLE_DEBUG__
00095   printf( "DBG:[ddc_sample_waveform] dt= %f, tstart= %f, tfilter= %f, tstop= %f\n", 
00096           dt/usec, tstart/usec, tfilter/usec, tstop/usec );
00097   fflush( stdout );
00098 #endif
00099 
00100   // set tstart according to last unsaturated sample
00101   //sample_to_time( fs, ns, unsat_sample, &tunsat ); 
00102   //if ( tunsat <= tstart ) { 
00103   //  time_to_sample( fs, ns, tstart, &istart );
00104   //} else {
00105   //  istart = unsat_sample;
00106   //}
00107 
00108   time_to_sample( fs, ns, tstart, &istart );
00109   time_to_sample( fs, ns, tfilter, &ifilter );
00110   time_to_sample( fs, ns, tstop, &istop );
00111   
00112   if (istart < unsat_sample) {
00113     istop += (unsat_sample - istart);
00114     ifilter += (unsat_sample - istart);
00115     istart = unsat_sample;
00116   }
00117 
00118 #ifdef DDC_SAMPLE_DEBUG__
00119   printf( "DBG:[ddc_sample_waveform] istart= %d, ifilter= %d, istop= %d\n", 
00120           istart, ifilter, istop );
00121   printf( "DBG:[ddc_sample_waveform] omega= %f, gamma= %f\n", freq, tdecay);
00122           
00123   fflush( stdout );
00124 #endif
00125 
00126 
00127   // we need only the value at tfilter, so just perform one gaussian filter step
00128   if ( ddc_gaussfilter_step( ddc, ns, fs, istart, istop, tfilter, filtBW, filt_ddc ) 
00129        == BPM_FAILURE ) {
00130     bpm_error( "Error in performing gaussian filter step in ddc_sample_waveform(...)",
00131                __FILE__, __LINE__ );
00132     return BPM_FAILURE;
00133   }
00134 
00135   filt_ddc[Re] *= exp( ( tfilter - t0 ) / tdecay );
00136   filt_ddc[Im] *= exp( ( tfilter - t0 ) / tdecay );
00137 
00138   *amp   = sqrt( SQR( filt_ddc[Re] ) + SQR( filt_ddc[Im] ) );
00139   *phase = atan2( filt_ddc[Im], filt_ddc[Re] ); 
00140 
00141   /* free up */ 
00142   free_complex_wave_double( ddc, ns );
00143 
00144   return BPM_SUCCESS;
00145 }

Generated on Thu Jan 10 10:18:04 2008 for libbpm by  doxygen 1.5.1