00001
00007 #include "bpm/bpm_dsp.h"
00008
00009
00010 static doublewf_t *_ddc_buffer_real = NULL;
00011 static doublewf_t *_ddc_buffer_imag = NULL;
00012
00013 int _check_ddc_buffers( int ns, double fs ) {
00014
00015 if ( _ddc_buffer_real ) {
00016 if ( ( _ddc_buffer_real->ns != ns ) || ( ( _ddc_buffer_real->fs - fs ) > 1.0e-10 ) ) {
00017 bpm_warning( "Reallocating _ddc_buffer_real with different number of samples & fs!",
00018 __FILE__, __LINE__ );
00019 doublewf_delete ( _ddc_buffer_real );
00020 _ddc_buffer_real = doublewf( ns, fs );
00021 }
00022 } else {
00023 bpm_warning( "Allocating DDC-Re buffer, no ddc_initialise() found", __FILE__, __LINE__ );
00024 _ddc_buffer_real = doublewf( ns, fs );
00025 }
00026
00027 if ( _ddc_buffer_imag ) {
00028 if ( ( _ddc_buffer_imag->ns != ns ) || ( ( _ddc_buffer_imag->fs - fs ) > 1.0e-10 ) ) {
00029 bpm_warning( "Reallocating _ddc_buffer_imag with different number of samples & fs!",
00030 __FILE__, __LINE__ );
00031 doublewf_delete ( _ddc_buffer_imag );
00032 _ddc_buffer_imag = doublewf( ns, fs );
00033 }
00034 } else {
00035 bpm_warning( "Allocating DDC-Im buffer, no ddc_initialise() found", __FILE__, __LINE__ );
00036 _ddc_buffer_imag = doublewf( ns, fs );
00037 }
00038
00039 if ( ! _ddc_buffer_real || ! _ddc_buffer_imag ) {
00040 bpm_error( "Cannot (re-)allocate memory for DDC buffers :(!",
00041 __FILE__, __LINE__ );
00042 return BPM_FAILURE;
00043 }
00044
00045 return BPM_SUCCESS;
00046 }
00047
00048
00049
00050 int ddc_initialise( int ns, double fs ) {
00051
00052 if ( _ddc_buffer_real || _ddc_buffer_imag ) {
00053 bpm_error( "DDC buffers already existing, please cleanup first with ddc_cleanup() !",
00054 __FILE__, __LINE__ );
00055 return BPM_FAILURE;
00056 }
00057
00058 _ddc_buffer_real = doublewf( ns, fs );
00059 _ddc_buffer_imag = doublewf( ns, fs );
00060 if( ! _ddc_buffer_real || ! _ddc_buffer_imag ) {
00061 bpm_error( "Failed to allocate memory for DDC buffers", __FILE__, __LINE__ );
00062 return BPM_FAILURE;
00063 }
00064
00065 return BPM_SUCCESS;
00066 }
00067
00068
00069
00070 void ddc_cleanup( void ) {
00071 if ( _ddc_buffer_real ) doublewf_delete( _ddc_buffer_real );
00072 if ( _ddc_buffer_imag ) doublewf_delete( _ddc_buffer_imag );
00073 return;
00074 }
00075
00076
00077
00078 int ddc( doublewf_t *w, double f, filter_t *filter, complexwf_t *dcw,
00079 doublewf_t *bufre,
00080 doublewf_t *bufim ) {
00081
00082 int i = 0;
00083 doublewf_t *re, *im;
00084
00085 if ( ! ( bufre && bufim ) ) {
00086 if ( _check_ddc_buffers( dcw->ns, dcw->fs ) ) return BPM_FAILURE;
00087 re = _ddc_buffer_real;
00088 im = _ddc_buffer_imag;
00089 } else {
00090 re = bufre;
00091 im = bufim;
00092 }
00093
00094
00095 for (i=0;i<w->ns;i++){
00096 re->wf[i] = w->wf[i] * cos( 2.*PI*f * (double) i / w->fs );
00097 im->wf[i] = w->wf[i] * sin( 2.*PI*f * (double) i / w->fs );
00098 }
00099
00100
00101 if( apply_filter( filter, re ) == BPM_FAILURE ) return BPM_FAILURE;
00102 if( apply_filter( filter, im ) == BPM_FAILURE ) return BPM_FAILURE;
00103
00104
00105 complexwf_setreal( dcw, re );
00106 complexwf_setimag( dcw, im );
00107
00108 return BPM_SUCCESS;
00109 }