From 22ea31d5b121e89c67641436449fc7552a3e0993 Mon Sep 17 00:00:00 2001 From: ha7ilm Date: Sun, 19 Feb 2017 14:02:10 +0100 Subject: [PATCH] First modifications for fir_interpolate_cc, from last April --- csdr.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ libcsdr.c | 18 ++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/csdr.c b/csdr.c index 5763f23..31d8ddc 100644 --- a/csdr.c +++ b/csdr.c @@ -848,6 +848,62 @@ int main(int argc, char *argv[]) //fprintf(stderr,"iskip=%d output_size=%d start=%x target=%x skipcount=%x \n",input_skip,output_size,input_buffer, ((complexf*)input_buffer)+(BIG_BUFSIZE-input_skip),(BIG_BUFSIZE-input_skip)); } } + + if(!strcmp(argv[1],"fir_interpolate_cc")) + { + bigbufs=1; + + if(argc<=2) return badsyntax("need required parameter (interpolation factor)"); + + int factor; + sscanf(argv[2],"%d",&factor); + + float transition_bw = 0.05; + if(argc>=4) sscanf(argv[3],"%g",&transition_bw); + + window_t window = WINDOW_DEFAULT; + if(argc>=5) + { + window=firdes_get_window_from_string(argv[4]); + } + else fprintf(stderr,"fir_interpolate_cc: window = %s\n",firdes_get_string_from_window(window)); + + int taps_length=firdes_filter_len(transition_bw); + fprintf(stderr,"fir_interpolate_cc: taps_length = %d\n",taps_length); + + while (env_csdr_fixed_big_bufsize < taps_length*2) env_csdr_fixed_big_bufsize*=2; //temporary fix for buffer size if [transition_bw] is low + //fprintf(stderr, "env_csdr_fixed_big_bufsize = %d\n", env_csdr_fixed_big_bufsize); + + if(!initialize_buffers()) return -2; + sendbufsize(the_bufsize/factor); + + + float *taps; + taps=(float*)malloc(taps_length*sizeof(float)); + + firdes_lowpass_f(taps,taps_length,0.5/(float)factor,window); + + int input_skip=0; + int output_size=0; + FREAD_C; + for(;;) + { + FEOF_CHECK; + output_size=fir_interpolate_cc((complexf*)input_buffer, (complexf*)output_buffer, the_bufsize, factor, taps, taps_length); + //fprintf(stderr, "os %d\n",output_size); + fwrite(output_buffer, sizeof(complexf), output_size, stdout); + fflush(stdout); + TRY_YIELD; + input_skip=factor*output_size; + memmove((complexf*)input_buffer,((complexf*)input_buffer)+input_skip,(the_bufsize-input_skip)*sizeof(complexf)); //memmove lets the source and destination overlap + fread(((complexf*)input_buffer)+(the_bufsize-input_skip), sizeof(complexf), input_skip, stdin); + //fprintf(stderr,"iskip=%d output_size=%d start=%x target=%x skipcount=%x \n",input_skip,output_size,input_buffer, ((complexf*)input_buffer)+(BIG_BUFSIZE-input_skip),(BIG_BUFSIZE-input_skip)); + } + } + + + + /*if(!strcmp(argv[1],"ejw_test")) { printf("ejqd=["); diff --git a/libcsdr.c b/libcsdr.c index e3b01bf..f5da71c 100644 --- a/libcsdr.c +++ b/libcsdr.c @@ -379,6 +379,24 @@ int fir_decimate_cc(complexf *input, complexf *output, int input_size, int decim } */ +int fir_interpolate_cc(complexf *input, complexf *output, int input_size, int interpolation, float *taps, int taps_length) +{ + int oi=0; + for(int i=0; iinput_size) break; + float acci=0; + for(int ti=0; ti