00001 00005 #include <stdio.h> 00006 #include <stdlib.h> 00007 00008 #include <bpm/bpm_units.h> 00009 #include <bpm/bpm_messages.h> 00010 #include <bpm/bpm_process.h> 00011 00012 #ifndef DDC_SAMPLE_DEBUG__ 00013 #define DDC_SAMPLE_DEBUG__ 00014 #endif 00015 00016 #undef DDC_SAMPLE_DEBUG__ 00017 00018 00019 int ddc_sample_waveform( doublewf_t *w, double frequency, filter_t *filt, int iSample, 00020 double t0, double tdecay, double *amp, double *phase, 00021 doublewf_t *buf_re, doublewf_t *buf_im ) { 00022 double tSample; 00023 00024 if ( ! w ) { 00025 bpm_error( "Invalid waveform pointer in ddc_sample_waveform(...)", 00026 __FILE__, __LINE__ ); 00027 return BPM_FAILURE; 00028 } 00029 00030 // calculate tSample from iSample 00031 00032 bpm_error( "Not Yet Implemented... please use ddc_waveform instead !!!", __FILE__, __LINE__ ); 00033 return BPM_FAILURE; 00034 00035 00036 /* 00037 // extrapolate back .... 00038 filt_ddc[Re] *= exp( ( tSample - t0 ) / tdecay ); 00039 filt_ddc[Im] *= exp( ( tSample - t0 ) / tdecay ); 00040 00041 *amp = sqrt( SQR( filt_ddc[Re] ) + SQR( filt_ddc[Im] ) ); 00042 *phase = atan2( filt_ddc[Im], filt_ddc[Re] ); 00043 */ 00044 00045 // Need routine apply_filter_at( filter, wf, t0+t0Offset ); 00046 00047 return 0; 00048 } 00049 00050 00051 /* 00052 int ddc_sample_waveform( doublewf_t *w, int nbits, double t0, double t0Offset, 00053 double freq, double tdecay, double filtBW, double epsFilt, 00054 double *amp, double *phase ) { 00055 00056 int unsat_sample; 00057 double dt, tunsat, tstart, tfilter, tstop, omega; 00058 double filt_ddc[2]; 00059 double **ddc, 00060 char msg[80]; 00061 int istart, ifilter, istop, i; 00062 00063 if ( ! w ) { 00064 bpm_error( "Invalid waveform pointer in ddc_sample_waveform(...)", 00065 __FILE__, __LINE__ ); 00066 return BPM_FAILURE; 00067 } 00068 00069 // get last unsaturated sample 00070 if ( check_saturation( w, nbits, &unsat_sample ) < 0 ) { 00071 bpm_error( "Error in check_saturation in ddc_sample_waveform(...)", 00072 __FILE__, __LINE__ ); 00073 return BPM_FAILURE; 00074 } 00075 00076 #ifdef DDC_SAMPLE_DEBUG__ 00077 printf( "DBG:[ddc_sample_waveform] last unsaturated sample : %d\n", unsat_sample ); 00078 printf( "DBG:[ddc_sample_waveform] t0Offset : %f\n", t0Offset ); 00079 fflush( stdout ); 00080 #endif 00081 00082 // allocate complex ddc waveform 00083 ddc = alloc_complex_wave_double( w->ns ); 00084 if ( ! ddc ) { 00085 bpm_error( "Unable to allocate memory for ddc in ddc_sample_waveform(...)", 00086 __FILE__, __LINE__ ); 00087 return BPM_FAILURE; 00088 } 00089 00090 // remove offset and downmix the waveform 00091 if ( downmix_waveform( w->wf, w->ns, w->fs, freq, ddc ) == BPM_FAILURE ) { 00092 bpm_error( "Error in downmixing in ddc_sample_waveform(...)", 00093 __FILE__, __LINE__ ); 00094 return BPM_FAILURE; 00095 } 00096 00097 // filter bandwidth given in MHz, convert it to rad/s 00098 omega = 2*PI*filtBW; 00099 00100 // determine cut-off time from cut-off parameter epsFilt 00101 dt = sqrt( 2.*log( omega / ( sqrt(2.*PI) * epsFilt ) ) ) / omega; 00102 00103 tstart = t0Offset - dt; 00104 tfilter = t0Offset; 00105 tstop = t0Offset + dt; 00106 00107 #ifdef DDC_SAMPLE_DEBUG__ 00108 printf( "DBG:[ddc_sample_waveform] dt= %f, tstart= %f, tfilter= %f, tstop= %f\n", 00109 dt/usec, tstart/usec, tfilter/usec, tstop/usec ); 00110 fflush( stdout ); 00111 #endif 00112 00113 // set tstart according to last unsaturated sample 00114 //sample_to_time( fs, ns, unsat_sample, &tunsat ); 00115 //if ( tunsat <= tstart ) { 00116 // time_to_sample( fs, ns, tstart, &istart ); 00117 //} else { 00118 // istart = unsat_sample; 00119 //} 00120 00121 time_to_sample( fs, ns, tstart, &istart ); 00122 time_to_sample( fs, ns, tfilter, &ifilter ); 00123 time_to_sample( fs, ns, tstop, &istop ); 00124 00125 if (istart < unsat_sample) { 00126 istop += (unsat_sample - istart); 00127 ifilter += (unsat_sample - istart); 00128 istart = unsat_sample; 00129 } 00130 00131 #ifdef DDC_SAMPLE_DEBUG__ 00132 printf( "DBG:[ddc_sample_waveform] istart= %d, ifilter= %d, istop= %d\n", 00133 istart, ifilter, istop ); 00134 printf( "DBG:[ddc_sample_waveform] omega= %f, gamma= %f\n", freq, tdecay); 00135 00136 fflush( stdout ); 00137 #endif 00138 00139 00140 // we need only the value at tfilter, so just perform one gaussian filter step 00141 if ( ddc_gaussfilter_step( ddc, ns, fs, istart, istop, tfilter, filtBW, filt_ddc ) 00142 == BPM_FAILURE ) { 00143 bpm_error( "Error in performing gaussian filter step in ddc_sample_waveform(...)", 00144 __FILE__, __LINE__ ); 00145 return BPM_FAILURE; 00146 } 00147 00148 filt_ddc[Re] *= exp( ( tfilter - t0 ) / tdecay ); 00149 filt_ddc[Im] *= exp( ( tfilter - t0 ) / tdecay ); 00150 00151 *amp = sqrt( SQR( filt_ddc[Re] ) + SQR( filt_ddc[Im] ) ); 00152 *phase = atan2( filt_ddc[Im], filt_ddc[Re] ); 00153 00154 free_complex_wave_double( ddc, w->ns ); 00155 00156 return BPM_SUCCESS; 00157 } 00158 */