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
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
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
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
00085 omega = 2*PI*filtBW;
00086
00087
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
00101
00102
00103
00104
00105
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
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
00142 free_complex_wave_double( ddc, ns );
00143
00144 return BPM_SUCCESS;
00145 }