00001
00005 #include <bpm/bpm_messages.h>
00006 #include <bpm/bpm_simulation.h>
00007 #include <bpm/bpm_rf.h>
00008 #include <bpm/bpm_alloc.h>
00009
00014 int generate_dipole( bpmconf_t *bpm, beamconf_t *beam, bpmsignal_t *sig ) {
00015
00016 if ( ! bpm || ! beam || ! sig ) {
00017 bpm_error( "Invalid pointer arguments in generate_dipole(...)",
00018 __FILE__, __LINE__ );
00019 return BPM_FAILURE;
00020 }
00021
00022
00023 double amp, phase;
00024 int dir = ( bpm->cav_polarisation == horiz ? 0 : 1);
00025 get_dipole_response( beam->charge, bpm->cav_chargesens,
00026 beam->bpmhit[dir], bpm->cav_possens,
00027 beam->bpmslope[dir], bpm->cav_tiltsens,
00028 beam->arrival_time, bpm->cav_freq,
00029 &, &phase );
00030
00031
00032 double **RF = alloc_complex_wave_double( rf_nsamples );
00033 add_wave( amp, phase, bpm->cav_freq, beam->arrival_time + bpm->digi_trigtimeoffset, bpm->cav_decaytime, RF );
00034
00035
00036 double *LO = alloc_simple_wave_double( rf_nsamples );
00037 double **IF = alloc_complex_wave_double( rf_nsamples );
00038
00039
00040 double lo_amp = sqrt( 0.5 );
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 double conv = (double) pow( 2, bpm->digi_nbits ) / 2.;
00053 double noise = bpm->digi_ampnoise / conv;
00054
00055
00056
00057 int *wf = alloc_simple_wave_int( bpm->digi_nsamples );
00058
00059
00060
00061
00062 sig->wf = wf;
00063 sig->ns = bpm->digi_nsamples;
00064
00065
00066 free_complex_wave_double( RF, rf_nsamples );
00067 free_complex_wave_double( IF, rf_nsamples );
00068 free_simple_wave_double( LO );
00069
00070 return BPM_SUCCESS;
00071 }
00072
00073