00001
00005 #include <bpm/bpm_messages.h>
00006 #include <bpm/bpm_simulation.h>
00007 #include <bpm/bpm_wf.h>
00008 #include <bpm/bpm_dsp.h>
00009
00018 int get_mode_response( doublewf_t *excitation,
00019 double freq, double Qvalue,
00020 complexwf_t *response ) {
00021
00022 if ( ! excitation || ! response ) {
00023 bpm_error( "Invalid pointer argument in add_wave(...)",
00024 __FILE__, __LINE__ );
00025 return BPM_FAILURE;
00026 }
00027
00028
00029 filter_t *resonator =
00030 create_filter( "resonator", RESONATOR | BANDPASS, 0,
00031 excitation->ns, excitation->fs,
00032 freq, 0., Qvalue );
00033
00034 doublewf_t *resp_re = doublewf_copy_new( excitation );
00035
00036 apply_filter( resonator, resp_re->wf );
00037
00038 doublewf_scale( resp_re->fs/(2*PI*freq/Qvalue), resp_re );
00039
00040 doublewf_t *resp_im = doublewf_copy_new( resp_re );
00041
00042 doublewf_integrate( resp_re );
00043 doublewf_scale( 2*PI*freq, resp_re );
00044
00045 complexwf_setreal( response, resp_re );
00046 complexwf_setimag( response, resp_im );
00047
00048 delete_filter( resonator );
00049 doublewf_delete( resp_re );
00050 doublewf_delete( resp_im );
00051
00052 return BPM_SUCCESS;
00053 }
00054
00055