00001
00006 #include <bpm/bpm_simulation.h>
00007 #include <bpm/bpm_wf.h>
00008 #include <bpm/bpm_dsp.h>
00009 #include <bpm/bpm_interface.h>
00010
00011 int get_mode_response( bpmmode_t *mode) {
00012
00013 filter_t *resonator = NULL;
00014 doublewf_t *re = NULL;
00015
00016 if ( ! mode->response ) {
00017 bpm_error( "Buffer for storing the mode response is not defined in add_mode_response()",
00018 __FILE__, __LINE__ );
00019 return BPM_FAILURE;
00020 }
00021
00022 complexwf_reset( mode->response );
00023
00024 re = doublewf( mode->response->ns, mode->response->fs );
00025
00026 if ( ! re ) {
00027 bpm_error( "Cannot allocate memory for a doublewf in add_mode_response()",
00028 __FILE__, __LINE__ );
00029 return BPM_FAILURE;
00030 }
00031
00032
00033
00034 re->wf[0] = mode->Q*mode->response->fs/(2*PI*mode->frequency);
00035
00036
00037
00038
00039
00040
00041 resonator = create_filter( "resonator", RESONATOR | BANDPASS, 0,
00042 mode->response->ns, mode->response->fs,
00043 mode->frequency, 0., mode->Q );
00044
00045
00046 apply_filter( resonator, re );
00047
00048
00049 complexwf_setreal( mode->response, re );
00050
00051 if ( mode->order == 1 ) {
00052
00053
00054 doublewf_integrate( re );
00055 doublewf_scale( 2*PI*mode->frequency, re );
00056
00057 complexwf_setimag( mode->response, re );
00058
00059 }
00060
00061 delete_filter( resonator );
00062 doublewf_delete( re );
00063
00064 return BPM_SUCCESS;
00065 }