00001
00005 #include <stdio.h>
00006 #include <bpm/bpm_units.h>
00007 #include <bpm/bpm_messages.h>
00008 #include <bpm/bpm_process.h>
00009 #include <bpm/bpm_dsp.h>
00010
00011 int process_caltone( doublewf_t *signal, bpmconf_t *bpm, bpmproc_t *proc, unsigned int mode ) {
00012
00013 char msg[128];
00014
00015 if ( ! bpm || ! signal || ! proc ) {
00016 bpm_error( "Invalid pointer arguments in process_caltone(...)",
00017 __FILE__, __LINE__ );
00018 return BPM_FAILURE;
00019 }
00020
00021
00022 if ( ! signal ) {
00023 sprintf( msg, "No signal present for BPM %s in process_waveform(...)", bpm->name );
00024 bpm_error( msg, __FILE__, __LINE__ );
00025 return BPM_FAILURE;
00026 }
00027
00028
00029 proc->saturated = check_saturation( signal, bpm->digi_nbits, &(proc->iunsat) );
00030
00031
00032 if ( proc->saturated ) {
00033 bpm_warning( "Calibration tone is saturated, not updating caltone information...",
00034 __FILE__, __LINE__ );
00035 } else {
00036
00037
00038
00039 if ( get_pedestal( signal, 20, &(proc->voltageoffset) ,&(proc->ampnoise) ) == BPM_FAILURE ) {
00040 sprintf( msg, "Error getting pedestal of BPM %s in process_waveform(...)", bpm->name );
00041 bpm_error( msg, __FILE__, __LINE__ );
00042 return BPM_FAILURE;
00043 }
00044
00045
00046 doublewf_bias( -proc->voltageoffset, signal );
00047
00048
00049
00050 if ( mode & PROC_DO_FFT ) {
00051
00052
00053 if ( fft_waveform( signal, proc->ft ) == BPM_FAILURE ) {
00054 sprintf( msg, "Could not perform fft for BPM %s in process_caltone(...)", bpm->name );
00055 bpm_warning( msg, __FILE__, __LINE__ );
00056
00057 } else {
00058 proc->fft_success = TRUE;
00059
00060 if ( mode & PROC_FIT_FFT ) {
00061
00062 if( fit_fft( proc->ft, &(proc->fft_freq), &(proc->fft_tdecay), NULL, NULL )
00063 == BPM_FAILURE ) {
00064 sprintf( msg, "Could not fit the FFT for BPM %s in process_waveform(...)", bpm->name );
00065 bpm_warning( msg, __FILE__, __LINE__ );
00066 }
00067
00068 }
00069
00070 }
00071
00072 }
00073
00074
00075
00076 if ( mode & PROC_DO_DDC ) {
00077
00078
00079 if ( ddc_waveform( signal, bpm->ddc_ct_freq, bpm->ddc_ct_filter, proc->dc,
00080 bpm->ddc_buffer_re, bpm->ddc_buffer_im ) == BPM_FAILURE ) {
00081 sprintf( msg, "Could not ddc BPM %s waveform in process_caltone(...)", bpm->name );
00082 bpm_warning( msg, __FILE__, __LINE__ );
00083 } else {
00084 proc->ddc_success = TRUE;
00085
00086
00087 proc->ddc_amp = c_abs( proc->dc->wf[ bpm->ddc_ct_iSample ] );
00088 proc->ddc_phase = c_arg( proc->dc->wf[ bpm->ddc_ct_iSample ] );
00089 norm_phase( &(proc->ddc_phase) );
00090
00091
00092
00093 proc->ddc_ct_amp = proc->ddc_amp;
00094 proc->ddc_ct_phase = proc->ddc_phase;
00095 }
00096
00097 }
00098
00099 }
00100
00101 return BPM_SUCCESS;
00102 }