From 175c700cc9ce2e84922eab50f6019ab27ce9c82a Mon Sep 17 00:00:00 2001 From: ha7ilm Date: Tue, 17 Nov 2015 21:54:06 +0100 Subject: [PATCH] Verified that fastddc_fwd_cc works. --- csdr.c | 35 +++++++++++++++++++++++++++++++---- fastddc.c | 22 +++++++++++++++++++--- fastddc.h | 2 +- 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/csdr.c b/csdr.c index 55ce462..fc46ee4 100644 --- a/csdr.c +++ b/csdr.c @@ -697,7 +697,7 @@ int main(int argc, char *argv[]) { FEOF_CHECK; FREAD_R; - for(int i=0; i3) sscanf(argv[3],"%g",&transition_bw); window_t window = WINDOW_DEFAULT; - if(argc>4) window=firdes_get_window_from_string(argv[5]); + if(argc>4) window=firdes_get_window_from_string(argv[4]); else fprintf(stderr,"fastddc_fwd_cc: window = %s\n",firdes_get_string_from_window(window)); fastddc_t ddc; @@ -1693,7 +1693,7 @@ int main(int argc, char *argv[]) } } - if( !strcmp(argv[1],"fastddc_apply_cc") ) // [transition_bw [window]] + if( !strcmp(argv[1],"fastddc_inv_cc") ) // [transition_bw [window]] { int decimation; if(argc<=2) return badsyntax("need required parameter (decimation)"); @@ -1743,12 +1743,39 @@ int main(int argc, char *argv[]) { FEOF_CHECK; fread(input, sizeof(complexf), ddc.fft_size, stdin); - shift_stat = fastddc_apply_cc(input, output, &ddc, plan_inverse, taps_fft, shift_stat); + shift_stat = fastddc_inv_cc(input, output, &ddc, plan_inverse, taps_fft, shift_stat); fwrite(output, sizeof(complexf), ddc.output_size, stdout); TRY_YIELD; } } + if( !strcmp(argv[1], "_fft2octave") ) + { + int fft_size; + if(argc<=2) return badsyntax("need required parameter (fft_size)"); + sscanf(argv[2],"%d",&fft_size); + + complexf* fft_input=(complexf*)malloc(sizeof(complexf)*fft_size); + initialize_buffers(); + if(!sendbufsize(fft_size)) return -2; + + printf("setenv(\"GNUTERM\",\"X11 noraise\");y=zeros(1,%d);semilogy(y,\"ydatasource\",\"y\");\n",fft_size); + for(;;) + { + FEOF_CHECK; + fread(fft_input, sizeof(complexf), fft_size, stdin); + printf("fftdata=["); + //we have to swap the two parts of the array to get a valid spectrum + for(int i=fft_size/2;ioutput_size, ddc->scrape ); } -decimating_shift_addition_status_t fastddc_apply_cc(complexf* input, complexf* output, fastddc_t* ddc, FFT_PLAN_T* plan_inverse, complexf* taps_fft, decimating_shift_addition_status_t shift_stat) +void fft_swap_sides(complexf* io, int fft_size) +{ + int middle=fft_size/2; + complexf temp; + for(int i=0;ifft_size); //this is not very optimal, but now we stick with this slow solution until we got the algorithm working for(int i=0;ifft_size;i++) { int output_index = (ddc->startbin+i)%plan_inverse->size; @@ -111,9 +126,10 @@ decimating_shift_addition_status_t fastddc_apply_cc(complexf* input, complexf* o } fft_execute(plan_inverse); + fft_swap_sides(inv_output,plan_inverse->size); //Normalize data - for(int i=0;isize;i++) //@apply_ddc_fft_cc: normalize by size + for(int i=0;isize;i++) //@fastddc_inv_cc: normalize by size { iof(inv_output,i)/=plan_inverse->size; qof(inv_output,i)/=plan_inverse->size; diff --git a/fastddc.h b/fastddc.h index 0029713..e4aae2e 100644 --- a/fastddc.h +++ b/fastddc.h @@ -23,5 +23,5 @@ typedef struct fastddc_s } fastddc_t; int fastddc_init(fastddc_t* ddc, float transition_bw, int decimation, float shift_rate); -decimating_shift_addition_status_t fastddc_apply_cc(complexf* input, complexf* output, fastddc_t* ddc, FFT_PLAN_T* plan_inverse, complexf* taps_fft, decimating_shift_addition_status_t shift_stat); +decimating_shift_addition_status_t fastddc_inv_cc(complexf* input, complexf* output, fastddc_t* ddc, FFT_PLAN_T* plan_inverse, complexf* taps_fft, decimating_shift_addition_status_t shift_stat); void fastddc_print(fastddc_t* ddc);