diff --git a/csdr.c b/csdr.c index 8f0a730..4180d8c 100755 --- a/csdr.c +++ b/csdr.c @@ -136,7 +136,8 @@ char usage[]= " bpsk_costas_loop_cc \n" " binary_slicer_f_u8\n" " simple_agc_cc [reference [max_gain]]\n" -" firdes_carrier_c [window [--octave]]\n" +" firdes_resonator_c [window [--octave]]\n" +" resonators_fir_cc [resonator_rate × N]\n" " ?\n" " =\n" " \n" @@ -1054,6 +1055,7 @@ int main(int argc, char *argv[]) TRY_YIELD; } } + if(!strcmp(argv[1],"fir_decimate_cc")) { bigbufs=1; @@ -1111,7 +1113,6 @@ int main(int argc, char *argv[]) output_size=fir_decimate_cc((complexf*)input_buffer, (complexf*)output_buffer, the_bufsize, factor, taps, padded_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 @@ -1167,7 +1168,6 @@ int main(int argc, char *argv[]) output_size=fir_interpolate_cc((complexf*)input_buffer, (complexf*)interp_output_buffer, the_bufsize, factor, taps, taps_length); //fprintf(stderr, "os %d\n",output_size); fwrite(interp_output_buffer, sizeof(complexf), output_size, stdout); - fflush(stdout); TRY_YIELD; input_skip=output_size/factor; memmove((complexf*)input_buffer,((complexf*)input_buffer)+input_skip,(the_bufsize-input_skip)*sizeof(complexf)); //memmove lets the source and destination overlap @@ -2389,7 +2389,6 @@ int main(int argc, char *argv[]) if(serial.input_used==0) { fprintf(stderr, "%s: error: serial_line_decoder_f_u8() got stuck.\n", argv[1]); return -3; } //printf("now out %d | ", serial.output_size); fwrite(output_buffer, sizeof(unsigned char), serial.output_size, stdout); - fflush(stdout); TRY_YIELD; } } @@ -2468,7 +2467,6 @@ int main(int argc, char *argv[]) timing_recovery_cc((complexf*)input_buffer, (complexf*)output_buffer, the_bufsize, &state); //fprintf(stderr, "trcc is=%d, os=%d, ip=%d\n",the_bufsize, state.output_size, state.input_processed); fwrite(output_buffer, sizeof(complexf), state.output_size, stdout); - fflush(stdout); TRY_YIELD; //fprintf(stderr, "state.input_processed = %d\n", state.input_processed); memmove((complexf*)input_buffer,((complexf*)input_buffer)+state.input_processed,(the_bufsize-state.input_processed)*sizeof(complexf)); //memmove lets the source and destination overlap @@ -2701,7 +2699,7 @@ int main(int argc, char *argv[]) } } - if(!strcmp(argv[1],"firdes_carrier_c")) // [window [--octave]] + if(!strcmp(argv[1],"firdes_resonator_c")) // [window [--octave]] { //Process the params if(argc<=3) return badsyntax("need required parameters (rate, length)"); @@ -2717,14 +2715,14 @@ int main(int argc, char *argv[]) { window=firdes_get_window_from_string(argv[4]); } - else fprintf(stderr,"firdes_carrier_c: window = %s\n",firdes_get_string_from_window(window)); + else fprintf(stderr,"firdes_resonator_c: window = %s\n",firdes_get_string_from_window(window)); int octave=(argc>=6 && !strcmp("--octave",argv[5])); complexf* taps=(complexf*)calloc(sizeof(complexf),length); //Make the filter - firdes_add_carrier_c(taps, length, rate, window); + firdes_add_resonator_c(taps, length, rate, window); //Do the output if(octave) printf("taps=["); @@ -2736,15 +2734,59 @@ int main(int argc, char *argv[]) "];figure(\"Position\",[0 0 1000 1000]);fser=fft([taps,zeros(1,%d)]);ampl=abs(fser).^2;halfindex=floor(1+size(ampl)(2)/2);\n" "amplrev=[ampl(halfindex:end),ampl(1:halfindex)];\n" //we have to swap the output of FFT "subplot(2,1,1);plot(amplrev);\n" - "subplot(2,1,2);plot(arg(fser));\n" - "#figure(2);freqz(taps);\n" - "#figur(3);plot3(taps);\n",fft_length-length); + "subplot(2,1,2);plot(arg(fser));\n",fft_length-length); //Wait forever, so that octave won't close just after popping up the window. //You can close it with ^C. if(octave) { fflush(stdout); getchar(); } return 0; } + + if(!strcmp(argv[1],"resonators_fir_cc")) // + { + + if(argc<=2) return badsyntax("need required parameter (taps_length)"); + int taps_length; + sscanf(argv[2],"%d",&taps_length); + + int num_resonators = argc-3; + float* resonator_rate = (float*)malloc(sizeof(float)*num_resonators); + for(int i=0;i2*M_PI) phase-=2*M_PI; + while(phase<0) phase+=2*M_PI; } //Normalize filter kernel float sum=0; - for(int i=0;i