Added "csdr tee" and unified how csdr messages start

This commit is contained in:
ha7ilm 2017-05-05 11:34:40 +02:00
parent b6143ad4f8
commit d526744d0c

173
csdr.c
View file

@ -152,6 +152,7 @@ char usage[]=
" generic_slicer_f_u8 <n_symbols>\n" " generic_slicer_f_u8 <n_symbols>\n"
" plain_interpolate_cc <n_symbols>\n" " plain_interpolate_cc <n_symbols>\n"
" add_const_cc <i> <q>\n" " add_const_cc <i> <q>\n"
" tee <path> [buffers]\n"
" ?<search_the_function_list>\n" " ?<search_the_function_list>\n"
" =<evaluate_python_expression>\n" " =<evaluate_python_expression>\n"
" \n" " \n"
@ -175,10 +176,22 @@ int bigbufs = 0;
#define TRY_YIELD fflush(stdout);sched_yield() #define TRY_YIELD fflush(stdout);sched_yield()
//unsigned yield_counter=0; //unsigned yield_counter=0;
char **argv_global;
int argc_global;
int errhead()
{
fprintf(stderr, "%s%s%s: ", argv_global[0], ((argc_global>=2)?" ":""), ((argc_global>=2)?argv_global[1]:""));
}
int badsyntax(char* why) int badsyntax(char* why)
{ {
if(why==0) fprintf(stderr, "%s", usage); if(why==0) fprintf(stderr, "%s", usage);
else fprintf(stderr, "csdr: %s\n\n", why); else
{
errhead();
fprintf(stderr, "%s\n", why);
}
return -1; return -1;
} }
@ -186,8 +199,8 @@ int clipdetect_ff(float* input, int input_size)
{ {
for(int i=0;i<input_size;i++) for(int i=0;i<input_size;i++)
{ {
if(input[i]<-1.0) { fprintf(stderr, "csdr clipdetect_ff: Signal value below -1.0!\n"); return -1; } if(input[i]<-1.0) { errhead(); fprintf(stderr, "Signal value below -1.0!\n"); return -1; }
if(input[i]>1.0) { fprintf(stderr, "csdr clipdetect_ff: Signal value above 1.0!\n"); return 1; } if(input[i]>1.0) { errhead(); fprintf(stderr, "Signal value above 1.0!\n"); return 1; }
} }
return 0; return 0;
} }
@ -220,7 +233,7 @@ int init_fifo(int argc, char *argv[])
{ {
if(!strcmp(argv[2],"--fifo")) if(!strcmp(argv[2],"--fifo"))
{ {
fprintf(stderr,"csdr: fifo control mode on\n"); errhead(); fprintf(stderr,"fifo control mode on\n");
int fd = open(argv[3], O_RDONLY); int fd = open(argv[3], O_RDONLY);
int flags = fcntl(fd, F_GETFL, 0); int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK); fcntl(fd, F_SETFL, flags | O_NONBLOCK);
@ -237,7 +250,8 @@ int init_fifo(int argc, char *argv[])
//This is implemented in ddcd, check there to see how to do it! //This is implemented in ddcd, check there to see how to do it!
int fd; int fd;
if(sscanf(argv[3], "%d",&fd)<=0) return 0; if(sscanf(argv[3], "%d",&fd)<=0) return 0;
fprintf(stderr,"csdr: fd control mode on, fd=%d\n", fd); errhead();
fprintf(stderr,"fd control mode on, fd=%d\n", fd);
int flags = fcntl(fd, F_GETFL, 0); int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK); fcntl(fd, F_SETFL, flags | O_NONBLOCK);
return fd; return fd;
@ -309,7 +323,7 @@ float *output_buffer;
short *buffer_i16; short *buffer_i16;
float *temp_f; float *temp_f;
int the_bufsize = 0; int the_bufsize = 0;
char **argv_global;
#define UNITROUND_UNIT 4 #define UNITROUND_UNIT 4
@ -324,7 +338,7 @@ int initialize_buffers()
{ {
if(!(the_bufsize=getbufsize())) return 0; if(!(the_bufsize=getbufsize())) return 0;
the_bufsize=unitround(the_bufsize); the_bufsize=unitround(the_bufsize);
if(env_csdr_print_bufsizes) fprintf(stderr,"%s %s: buffer size set to %d\n",argv_global[0], argv_global[1], the_bufsize); if(env_csdr_print_bufsizes) { errhead(); fprintf(stderr,"buffer size set to %d\n", the_bufsize); }
input_buffer = (float*) malloc(the_bufsize*sizeof(float) * 2); //need the 2× because we might also put complex floats into it input_buffer = (float*) malloc(the_bufsize*sizeof(float) * 2); //need the 2× because we might also put complex floats into it
output_buffer = (float*) malloc(the_bufsize*sizeof(float) * 2); output_buffer = (float*) malloc(the_bufsize*sizeof(float) * 2);
buffer_u8 = (unsigned char*)malloc(the_bufsize*sizeof(unsigned char)); buffer_u8 = (unsigned char*)malloc(the_bufsize*sizeof(unsigned char));
@ -347,7 +361,7 @@ int sendbufsize(int size)
//The first word is a preamble, "csdr". //The first word is a preamble, "csdr".
//If the next csdr process detects it, sets the buffer size according to the second word //If the next csdr process detects it, sets the buffer size according to the second word
if(!env_csdr_dynamic_bufsize_on) return env_csdr_fixed_bufsize; if(!env_csdr_dynamic_bufsize_on) return env_csdr_fixed_bufsize;
if(env_csdr_print_bufsizes) fprintf(stderr,"%s %s: next process proposed input buffer size is %d\n",argv_global[0], argv_global[1], size); if(env_csdr_print_bufsizes) { errhead(); fprintf(stderr,"next process proposed input buffer size is %d\n", size); }
int send_first[2]; int send_first[2];
memcpy((char*)send_first, SETBUF_PREAMBLE, 4*sizeof(char)); memcpy((char*)send_first, SETBUF_PREAMBLE, 4*sizeof(char));
send_first[1] = size; send_first[1] = size;
@ -384,6 +398,7 @@ int main(int argc, char *argv[])
{ {
parse_env(); parse_env();
argv_global=argv; argv_global=argv;
argc_global=argc;
if(argc<=1) return badsyntax(0); if(argc<=1) return badsyntax(0);
if(!strcmp(argv[1],"--help")) return badsyntax(0); if(!strcmp(argv[1],"--help")) return badsyntax(0);
@ -466,7 +481,7 @@ int main(int argc, char *argv[])
if(fifo_actual_buffer_rd_pos==fifo_buffer_size) if(fifo_actual_buffer_rd_pos==fifo_buffer_size)
{ {
fifo_actual_buffer_rd_pos = 0; //rewrite same buffer fifo_actual_buffer_rd_pos = 0; //rewrite same buffer
if(!fifo_overrun_shown) { fifo_overrun_shown=1; fprintf(stderr, "fifo: circular buffer full, dropping samples\n"); } if(!fifo_overrun_shown) { fifo_overrun_shown=1; errhead(); fprintf(stderr, "circular buffer full, dropping samples\n"); }
} }
} }
} }
@ -486,7 +501,7 @@ int main(int argc, char *argv[])
} }
} }
if(fifo_error&&errno!=11) { fprintf(stderr,"fifo: fifo_error (%d)", errno); return -1; } if(fifo_error&&errno!=11) { errhead(); fprintf(stderr,"fifo_error (%d)", errno); return -1; }
} }
return -1; return -1;
@ -696,7 +711,8 @@ int main(int argc, char *argv[])
if(argc>3) sscanf(argv[3],"%d",&table_size); if(argc>3) sscanf(argv[3],"%d",&table_size);
if(!sendbufsize(initialize_buffers())) return -2; if(!sendbufsize(initialize_buffers())) return -2;
shift_table_data_t table_data=shift_table_init(table_size); shift_table_data_t table_data=shift_table_init(table_size);
fprintf(stderr,"shift_table_cc: LUT initialized\n"); errhead();
fprintf(stderr,"LUT initialized\n");
for(;;) for(;;)
{ {
FEOF_CHECK; FEOF_CHECK;
@ -730,7 +746,8 @@ int main(int argc, char *argv[])
for(;;) for(;;)
{ {
shift_addfast_data_t data=shift_addfast_init(rate); shift_addfast_data_t data=shift_addfast_init(rate);
fprintf(stderr,"shift_addfast_cc: reinitialized to %g\n",rate); errhead();
fprintf(stderr,"reinitialized to %g\n",rate);
int remain, current_size; int remain, current_size;
float* ibufptr; float* ibufptr;
float* obufptr; float* obufptr;
@ -780,7 +797,8 @@ int main(int argc, char *argv[])
for(;;) for(;;)
{ {
shift_unroll_data_t data=shift_unroll_init(rate, 1024); shift_unroll_data_t data=shift_unroll_init(rate, 1024);
fprintf(stderr,"shift_unroll_cc: reinitialized to %g\n",rate); errhead();
fprintf(stderr,"reinitialized to %g\n",rate);
int remain, current_size; int remain, current_size;
float* ibufptr; float* ibufptr;
float* obufptr; float* obufptr;
@ -856,7 +874,8 @@ int main(int argc, char *argv[])
for(;;) for(;;)
{ {
shift_addition_data_t data=shift_addition_init(rate); shift_addition_data_t data=shift_addition_init(rate);
fprintf(stderr,"shift_addition_cc: reinitialized to %g\n",rate); errhead();
fprintf(stderr,"reinitialized to %g\n",rate);
int remain, current_size; int remain, current_size;
float* ibufptr; float* ibufptr;
float* obufptr; float* obufptr;
@ -978,7 +997,7 @@ int main(int argc, char *argv[])
sscanf(argv[2],"%d",&sample_rate); sscanf(argv[2],"%d",&sample_rate);
float tau; float tau;
sscanf(argv[3],"%g",&tau); sscanf(argv[3],"%g",&tau);
fprintf(stderr,"deemphasis_wfm_ff: tau = %g, sample_rate = %d\n",tau,sample_rate); errhead(); fprintf(stderr,"tau = %g, sample_rate = %d\n",tau,sample_rate);
float last_output=0; float last_output=0;
for(;;) for(;;)
{ {
@ -1006,7 +1025,7 @@ int main(int argc, char *argv[])
break; break;
} }
} }
if(nan_detect) fprintf(stderr, "detect_nan_f: NaN detected!\n"); if(nan_detect) { errhead(); fprintf(stderr, "NaN detected!\n"); }
fwrite(input_buffer, sizeof(float), the_bufsize, stdout); fwrite(input_buffer, sizeof(float), the_bufsize, stdout);
TRY_YIELD; TRY_YIELD;
} }
@ -1103,14 +1122,14 @@ int main(int argc, char *argv[])
float *taps; float *taps;
#define NEON_ALIGNMENT (4*4*2) #define NEON_ALIGNMENT (4*4*2)
#ifdef NEON_OPTS #ifdef NEON_OPTS
fprintf(stderr,"taps_length = %d\n", taps_length); errhead(); fprintf(stderr,"taps_length = %d\n", taps_length);
padded_taps_length = taps_length+(NEON_ALIGNMENT/4)-1 - ((taps_length+(NEON_ALIGNMENT/4)-1)%(NEON_ALIGNMENT/4)); padded_taps_length = taps_length+(NEON_ALIGNMENT/4)-1 - ((taps_length+(NEON_ALIGNMENT/4)-1)%(NEON_ALIGNMENT/4));
fprintf(stderr,"padded_taps_length = %d\n", padded_taps_length); errhead(); fprintf(stderr,"padded_taps_length = %d\n", padded_taps_length);
taps = (float*) (float*)malloc((padded_taps_length+NEON_ALIGNMENT)*sizeof(float)); taps = (float*) (float*)malloc((padded_taps_length+NEON_ALIGNMENT)*sizeof(float));
fprintf(stderr,"taps = %x\n", taps); errhead(); fprintf(stderr,"taps = %x\n", taps);
taps = (float*)((((unsigned)taps)+NEON_ALIGNMENT-1) & ~(NEON_ALIGNMENT-1)); taps = (float*)((((unsigned)taps)+NEON_ALIGNMENT-1) & ~(NEON_ALIGNMENT-1));
fprintf(stderr,"taps = %x\n", taps); errhead(); fprintf(stderr,"NEON aligned taps = %x\n", taps);
for(int i=0;i<padded_taps_length-taps_length;i++) taps[taps_length+i]=0; for(int i=0;i<padded_taps_length-taps_length;i++) taps[taps_length+i]=0;
#else #else
taps=(float*)malloc(taps_length*sizeof(float)); taps=(float*)malloc(taps_length*sizeof(float));
@ -1154,10 +1173,10 @@ int main(int argc, char *argv[])
{ {
window=firdes_get_window_from_string(argv[4]); window=firdes_get_window_from_string(argv[4]);
} }
else fprintf(stderr,"fir_interpolate_cc: window = %s\n",firdes_get_string_from_window(window)); else {errhead(); fprintf(stderr,"window = %s\n",firdes_get_string_from_window(window));}
int taps_length=firdes_filter_len(transition_bw); int taps_length=firdes_filter_len(transition_bw);
fprintf(stderr,"fir_interpolate_cc: taps_length = %d\n",taps_length); errhead(); fprintf(stderr,"taps_length = %d\n",taps_length);
assert(taps_length > 0); assert(taps_length > 0);
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 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
@ -1224,7 +1243,7 @@ int main(int argc, char *argv[])
{ {
window=firdes_get_window_from_string(argv[4]); window=firdes_get_window_from_string(argv[4]);
} }
else fprintf(stderr,"firdes_lowpass_f: window = %s\n",firdes_get_string_from_window(window)); else { errhead(); fprintf(stderr,"window = %s\n",firdes_get_string_from_window(window)); }
int octave=(argc>=6 && !strcmp("--octave",argv[5])); int octave=(argc>=6 && !strcmp("--octave",argv[5]));
@ -1263,7 +1282,7 @@ int main(int argc, char *argv[])
{ {
window=firdes_get_window_from_string(argv[5]); window=firdes_get_window_from_string(argv[5]);
} }
else fprintf(stderr,"firdes_bandpass_c: window = %s\n",firdes_get_string_from_window(window)); else { errhead(); fprintf(stderr,"window = %s\n",firdes_get_string_from_window(window));}
int octave=(argc>=7 && !strcmp("--octave",argv[6])); int octave=(argc>=7 && !strcmp("--octave",argv[6]));
@ -1385,9 +1404,9 @@ int main(int argc, char *argv[])
{ {
window=firdes_get_window_from_string(argv[5]); window=firdes_get_window_from_string(argv[5]);
} }
else fprintf(stderr,"rational_resampler_ff: window = %s\n",firdes_get_string_from_window(window)); else { errhead(); fprintf(stderr,"window = %s\n",firdes_get_string_from_window(window)); }
if(suboptimal) fprintf(stderr,"note: suboptimal rational resampler chosen.\n"); if(suboptimal) { errhead(); fprintf(stderr,"note: suboptimal rational resampler chosen.\n"); }
if(!initialize_buffers()) return -2; if(!initialize_buffers()) return -2;
@ -1440,7 +1459,7 @@ int main(int argc, char *argv[])
{ {
if(!strcmp(argv[4], "--prefilter")) if(!strcmp(argv[4], "--prefilter"))
{ {
fprintf(stderr, "fractional_decimator_ff: using prefilter with default values\n"); errhead(); fprintf(stderr, "using prefilter with default values\n");
use_prefilter = 1; use_prefilter = 1;
} }
else else
@ -1449,7 +1468,7 @@ int main(int argc, char *argv[])
if(argc>=6) window = firdes_get_window_from_string(argv[5]); if(argc>=6) window = firdes_get_window_from_string(argv[5]);
} }
} }
fprintf(stderr,"fractional_decimator_ff: use_prefilter = %d, num_poly_points = %d, transition_bw = %g, window = %s\n", errhead(); fprintf(stderr,"use_prefilter = %d, num_poly_points = %d, transition_bw = %g, window = %s\n",
use_prefilter, num_poly_points, transition_bw, firdes_get_string_from_window(window)); use_prefilter, num_poly_points, transition_bw, firdes_get_string_from_window(window));
if(!initialize_buffers()) return -2; if(!initialize_buffers()) return -2;
@ -1463,12 +1482,12 @@ int main(int argc, char *argv[])
if(use_prefilter) if(use_prefilter)
{ {
taps_length = firdes_filter_len(transition_bw); taps_length = firdes_filter_len(transition_bw);
fprintf(stderr,"fractional_decimator_ff: taps_length = %d\n",taps_length); errhead(); fprintf(stderr,"taps_length = %d\n",taps_length);
taps = (float*)malloc(sizeof(float)*taps_length); taps = (float*)malloc(sizeof(float)*taps_length);
firdes_lowpass_f(taps, taps_length, 0.5/(rate-transition_bw), window); //0.6 const to compensate rolloff firdes_lowpass_f(taps, taps_length, 0.5/(rate-transition_bw), window); //0.6 const to compensate rolloff
//for(int=0;i<taps_length; i++) fprintf(stderr,"%g ",taps[i]); //for(int=0;i<taps_length; i++) fprintf(stderr,"%g ",taps[i]);
} }
else fprintf(stderr,"fractional_decimator_ff: not using taps\n"); else { errhead(); fprintf(stderr,"not using taps\n"); }
fractional_decimator_ff_t d = fractional_decimator_ff_init(rate, num_poly_points, taps, taps_length); fractional_decimator_ff_t d = fractional_decimator_ff_init(rate, num_poly_points, taps, taps_length);
for(;;) for(;;)
{ {
@ -1498,7 +1517,7 @@ int main(int argc, char *argv[])
{ {
window = firdes_get_window_from_string(argv[4]); window = firdes_get_window_from_string(argv[4]);
} }
else fprintf(stderr,"old_fractional_decimator_ff: window = %s\n",firdes_get_string_from_window(window)); else { errhead(); fprintf(stderr,"window = %s\n",firdes_get_string_from_window(window)); }
if(!initialize_buffers()) return -2; if(!initialize_buffers()) return -2;
sendbufsize(the_bufsize / rate); sendbufsize(the_bufsize / rate);
@ -1507,7 +1526,7 @@ int main(int argc, char *argv[])
//Generate filter taps //Generate filter taps
int taps_length = firdes_filter_len(transition_bw); int taps_length = firdes_filter_len(transition_bw);
fprintf(stderr,"old_fractional_decimator_ff: taps_length = %d\n",taps_length); errhead(); fprintf(stderr,"taps_length = %d\n",taps_length);
float* taps = (float*)malloc(sizeof(float)*taps_length); float* taps = (float*)malloc(sizeof(float)*taps_length);
firdes_lowpass_f(taps, taps_length, 0.59*0.5/(rate-transition_bw), window); //0.6 const to compensate rolloff firdes_lowpass_f(taps, taps_length, 0.59*0.5/(rate-transition_bw), window); //0.6 const to compensate rolloff
//for(int=0;i<taps_length; i++) fprintf(stderr,"%g ",taps[i]); //for(int=0;i<taps_length; i++) fprintf(stderr,"%g ",taps[i]);
@ -1558,7 +1577,7 @@ int main(int argc, char *argv[])
complexf* input=(complexf*)fft_malloc(sizeof(complexf)*fft_size); complexf* input=(complexf*)fft_malloc(sizeof(complexf)*fft_size);
complexf* windowed=(complexf*)fft_malloc(sizeof(complexf)*fft_size); complexf* windowed=(complexf*)fft_malloc(sizeof(complexf)*fft_size);
complexf* output=(complexf*)fft_malloc(sizeof(complexf)*fft_size); complexf* output=(complexf*)fft_malloc(sizeof(complexf)*fft_size);
if(benchmark) fprintf(stderr,"fft_cc: benchmarking..."); if(benchmark) { errhead(); fprintf(stderr,"benchmarking..."); }
FFT_PLAN_T* plan=make_fft_c2c(fft_size, windowed, output, 1, benchmark); FFT_PLAN_T* plan=make_fft_c2c(fft_size, windowed, output, 1, benchmark);
if(benchmark) fprintf(stderr," done\n"); if(benchmark) fprintf(stderr," done\n");
if(octave) printf("setenv(\"GNUTERM\",\"X11 noraise\");y=zeros(1,%d);semilogy(y,\"ydatasource\",\"y\");\n",fft_size); if(octave) printf("setenv(\"GNUTERM\",\"X11 noraise\");y=zeros(1,%d);semilogy(y,\"ydatasource\",\"y\");\n",fft_size);
@ -1736,7 +1755,7 @@ int main(int argc, char *argv[])
sscanf(argv[3],"%d",&fft_cycles); sscanf(argv[3],"%d",&fft_cycles);
int benchmark=(argc>=5)&&!strcmp(argv[4],"--benchmark"); int benchmark=(argc>=5)&&!strcmp(argv[4],"--benchmark");
fprintf(stderr,"fft_benchmark: FFT library used: %s\n",FFT_LIBRARY_USED); errhead(); fprintf(stderr,"FFT library used: %s\n",FFT_LIBRARY_USED);
complexf* input=(complexf*)fft_malloc(sizeof(complexf)*fft_size); complexf* input=(complexf*)fft_malloc(sizeof(complexf)*fft_size);
complexf* output=(complexf*)fft_malloc(sizeof(complexf)*fft_size); complexf* output=(complexf*)fft_malloc(sizeof(complexf)*fft_size);
@ -1750,7 +1769,7 @@ int main(int argc, char *argv[])
} }
//initialize FFT library, and measure time //initialize FFT library, and measure time
fprintf(stderr,"fft_benchmark: initializing... "); errhead(); fprintf(stderr,"initializing... ");
struct timespec start_time, end_time; struct timespec start_time, end_time;
clock_gettime(CLOCK_MONOTONIC_RAW, &start_time); clock_gettime(CLOCK_MONOTONIC_RAW, &start_time);
FFT_PLAN_T* plan=make_fft_c2c(fft_size,input,output,1,benchmark); FFT_PLAN_T* plan=make_fft_c2c(fft_size,input,output,1,benchmark);
@ -1762,7 +1781,7 @@ int main(int argc, char *argv[])
for(int i=0;i<fft_cycles;i++) fft_execute(plan); for(int i=0;i<fft_cycles;i++) fft_execute(plan);
clock_gettime(CLOCK_MONOTONIC_RAW, &end_time); clock_gettime(CLOCK_MONOTONIC_RAW, &end_time);
float time_taken_fft = TIME_TAKEN(start_time,end_time); float time_taken_fft = TIME_TAKEN(start_time,end_time);
fprintf(stderr,"fft_benchmark: %d transforms of %d processed in %g seconds, %g seconds each.\n",fft_cycles,fft_size,time_taken_fft,time_taken_fft/fft_cycles); errhead(); fprintf(stderr,"%d transforms of %d processed in %g seconds, %g seconds each.\n",fft_cycles,fft_size,time_taken_fft,time_taken_fft/fft_cycles);
return 0; return 0;
} }
@ -1786,7 +1805,7 @@ int main(int argc, char *argv[])
} }
sscanf(argv[4],"%g",&transition_bw); sscanf(argv[4],"%g",&transition_bw);
if(argc>=6) window=firdes_get_window_from_string(argv[5]); if(argc>=6) window=firdes_get_window_from_string(argv[5]);
else fprintf(stderr,"bandpass_fir_fft_cc: window = %s\n",firdes_get_string_from_window(window)); else { errhead(); fprintf(stderr,"window = %s\n",firdes_get_string_from_window(window)); }
//calculate the FFT size and the other length parameters //calculate the FFT size and the other length parameters
int taps_length=firdes_filter_len(transition_bw); //the number of non-zero taps int taps_length=firdes_filter_len(transition_bw); //the number of non-zero taps
@ -1795,7 +1814,7 @@ int main(int argc, char *argv[])
if (fft_size-taps_length<200) fft_size<<=1; if (fft_size-taps_length<200) fft_size<<=1;
int input_size = fft_size - taps_length + 1; int input_size = fft_size - taps_length + 1;
int overlap_length = taps_length - 1; int overlap_length = taps_length - 1;
fprintf(stderr,"bandpass_fir_fft_cc: (fft_size = %d) = (taps_length = %d) + (input_size = %d) - 1\n(overlap_length = %d) = taps_length - 1\n", fft_size, taps_length, input_size, overlap_length ); errhead(); fprintf(stderr,"(fft_size = %d) = (taps_length = %d) + (input_size = %d) - 1\n(overlap_length = %d) = taps_length - 1\n", fft_size, taps_length, input_size, overlap_length );
if (fft_size<=2) return badsyntax("FFT size error."); if (fft_size<=2) return badsyntax("FFT size error.");
if(!sendbufsize(getbufsize())) return -2; if(!sendbufsize(getbufsize())) return -2;
@ -1824,7 +1843,7 @@ int main(int argc, char *argv[])
for(;;) for(;;)
{ {
//make the filter //make the filter
fprintf(stderr,"bandpass_fir_fft_cc: filter initialized, low_cut = %g, high_cut = %g\n",low_cut,high_cut); errhead(); fprintf(stderr,"filter initialized, low_cut = %g, high_cut = %g\n",low_cut,high_cut);
firdes_bandpass_c(taps, taps_length, low_cut, high_cut, window); firdes_bandpass_c(taps, taps_length, low_cut, high_cut, window);
fft_execute(plan_taps); fft_execute(plan_taps);
@ -1890,7 +1909,7 @@ int main(int argc, char *argv[])
sendbufsize(flowcontrol_bufsize); sendbufsize(flowcontrol_bufsize);
unsigned char* flowcontrol_buffer = (unsigned char*)malloc(sizeof(unsigned char)*flowcontrol_bufsize); unsigned char* flowcontrol_buffer = (unsigned char*)malloc(sizeof(unsigned char)*flowcontrol_bufsize);
int flowcontrol_sleep=floor(1000000./reads_per_second); int flowcontrol_sleep=floor(1000000./reads_per_second);
fprintf(stderr, "flowcontrol: flowcontrol_bufsize = %d, flowcontrol_sleep = %d\n", flowcontrol_bufsize, flowcontrol_sleep); errhead(); fprintf(stderr, "flowcontrol_bufsize = %d, flowcontrol_sleep = %d\n", flowcontrol_bufsize, flowcontrol_sleep);
for(;;) for(;;)
{ {
FEOF_CHECK; FEOF_CHECK;
@ -2163,7 +2182,7 @@ int main(int argc, char *argv[])
for(int i=0;i<the_bufsize*2;i++) *(((float*)zerobuf)+i)=0; for(int i=0;i<the_bufsize*2;i++) *(((float*)zerobuf)+i)=0;
if(fd=init_fifo(argc,argv)) while(!read_fifo_ctl(fd,"%g\n",&squelch_level)) usleep(10000); if(fd=init_fifo(argc,argv)) while(!read_fifo_ctl(fd,"%g\n",&squelch_level)) usleep(10000);
else return badsyntax("need required parameter (--fifo <fifo>)"); else return badsyntax("need required parameter (--fifo <fifo>)");
fprintf(stderr, "squelch_and_power_cc: initial squelch level is %g\n", squelch_level); errhead(); fprintf(stderr, "initial squelch level is %g\n", squelch_level);
if((argc<=5)||((argc>5)&&(strcmp(argv[4],"--outfifo")))) return badsyntax("need required parameter (--outfifo <fifo>)"); if((argc<=5)||((argc>5)&&(strcmp(argv[4],"--outfifo")))) return badsyntax("need required parameter (--outfifo <fifo>)");
int fd2 = open(argv[5], O_WRONLY); int fd2 = open(argv[5], O_WRONLY);
if(fd2==-1) return badsyntax("error while opening --outfifo"); if(fd2==-1) return badsyntax("error while opening --outfifo");
@ -2196,7 +2215,7 @@ int main(int argc, char *argv[])
//fprintf(stderr,"S"); //fprintf(stderr,"S");
fwrite(zerobuf, sizeof(complexf), the_bufsize, stdout); fwrite(zerobuf, sizeof(complexf), the_bufsize, stdout);
} }
if(read_fifo_ctl(fd,"%g\n",&squelch_level)) fprintf(stderr, "squelch_and_power_cc: new squelch level is %g\n", squelch_level); if(read_fifo_ctl(fd,"%g\n",&squelch_level)) { errhead(); fprintf(stderr, "new squelch level is %g\n", squelch_level); }
TRY_YIELD; TRY_YIELD;
} }
} }
@ -2223,7 +2242,7 @@ int main(int argc, char *argv[])
window_t window = WINDOW_DEFAULT; window_t window = WINDOW_DEFAULT;
if(argc>4) window=firdes_get_window_from_string(argv[4]); 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)); else { errhead(); fprintf(stderr,"window = %s\n",firdes_get_string_from_window(window)); }
fastddc_t ddc; fastddc_t ddc;
if(fastddc_init(&ddc, transition_bw, decimation, 0)) { badsyntax("error in fastddc_init()"); return 1; } if(fastddc_init(&ddc, transition_bw, decimation, 0)) { badsyntax("error in fastddc_init()"); return 1; }
@ -2240,7 +2259,7 @@ int main(int argc, char *argv[])
for(int i=0;i<ddc.fft_size;i++) iof(input,i)=qof(input,i)=0; //null the input buffer for(int i=0;i<ddc.fft_size;i++) iof(input,i)=qof(input,i)=0; //null the input buffer
int benchmark = 1; int benchmark = 1;
if(benchmark) fprintf(stderr,"fastddc_fwd_cc: benchmarking FFT..."); if(benchmark) { errhead(); fprintf(stderr,"benchmarking FFT..."); }
FFT_PLAN_T* plan=make_fft_c2c(ddc.fft_size, windowed, output, 1, benchmark); FFT_PLAN_T* plan=make_fft_c2c(ddc.fft_size, windowed, output, 1, benchmark);
if(benchmark) fprintf(stderr," done\n"); if(benchmark) fprintf(stderr," done\n");
@ -2285,7 +2304,7 @@ int main(int argc, char *argv[])
window_t window = WINDOW_DEFAULT; window_t window = WINDOW_DEFAULT;
if(argc>5+plusarg) window=firdes_get_window_from_string(argv[5+plusarg]); if(argc>5+plusarg) window=firdes_get_window_from_string(argv[5+plusarg]);
else fprintf(stderr,"fastddc_apply_cc: window = %s\n",firdes_get_string_from_window(window)); else { errhead(); fprintf(stderr,"window = %s\n",firdes_get_string_from_window(window)); }
for(;;) for(;;)
{ {
@ -2304,7 +2323,7 @@ int main(int argc, char *argv[])
//make the filter //make the filter
float filter_half_bw = 0.5/decimation; float filter_half_bw = 0.5/decimation;
fprintf(stderr, "fastddc_inv_cc: preparing a bandpass filter of [%g, %g] cutoff rates. Real transition bandwidth is: %g\n", (-shift_rate)-filter_half_bw, (-shift_rate)+filter_half_bw, 4.0/ddc.taps_length); errhead(); fprintf(stderr, "preparing a bandpass filter of [%g, %g] cutoff rates. Real transition bandwidth is: %g\n", (-shift_rate)-filter_half_bw, (-shift_rate)+filter_half_bw, 4.0/ddc.taps_length);
firdes_bandpass_c(taps, ddc.taps_length, (-shift_rate)-filter_half_bw, (-shift_rate)+filter_half_bw, window); firdes_bandpass_c(taps, ddc.taps_length, (-shift_rate)-filter_half_bw, (-shift_rate)+filter_half_bw, window);
fft_execute(plan_taps); fft_execute(plan_taps);
fft_swap_sides(taps_fft,ddc.fft_size); fft_swap_sides(taps_fft,ddc.fft_size);
@ -2312,7 +2331,7 @@ int main(int argc, char *argv[])
//make FFT plan //make FFT plan
complexf* inv_input = (complexf*)fft_malloc(sizeof(complexf)*ddc.fft_inv_size); complexf* inv_input = (complexf*)fft_malloc(sizeof(complexf)*ddc.fft_inv_size);
complexf* inv_output = (complexf*)fft_malloc(sizeof(complexf)*ddc.fft_inv_size); complexf* inv_output = (complexf*)fft_malloc(sizeof(complexf)*ddc.fft_inv_size);
fprintf(stderr,"fastddc_inv_cc: benchmarking FFT..."); errhead(); fprintf(stderr,"benchmarking FFT...");
FFT_PLAN_T* plan_inverse = make_fft_c2c(ddc.fft_inv_size, inv_input, inv_output, 0, 1); //inverse, do benchmark FFT_PLAN_T* plan_inverse = make_fft_c2c(ddc.fft_inv_size, inv_input, inv_output, 0, 1); //inverse, do benchmark
fprintf(stderr," done\n"); fprintf(stderr," done\n");
@ -2481,7 +2500,7 @@ int main(int argc, char *argv[])
else fread(input_buffer, sizeof(float), the_bufsize, stdin); //should happen only on the first run else fread(input_buffer, sizeof(float), the_bufsize, stdin); //should happen only on the first run
serial_line_decoder_f_u8(&serial,input_buffer, (unsigned char*)output_buffer, the_bufsize); serial_line_decoder_f_u8(&serial,input_buffer, (unsigned char*)output_buffer, the_bufsize);
//printf("now in | "); //printf("now in | ");
if(serial.input_used==0) { fprintf(stderr, "%s: error: serial_line_decoder_f_u8() got stuck.\n", argv[1]); return -3; } if(serial.input_used==0) { errhead(); fprintf(stderr, "error: serial_line_decoder_f_u8() got stuck.\n"); return -3; }
//printf("now out %d | ", serial.output_size); //printf("now out %d | ", serial.output_size);
fwrite(output_buffer, sizeof(unsigned char), serial.output_size, stdout); fwrite(output_buffer, sizeof(unsigned char), serial.output_size, stdout);
TRY_YIELD; TRY_YIELD;
@ -2508,7 +2527,7 @@ int main(int argc, char *argv[])
if(argc>5) sscanf(argv[5],"%f",&ko); if(argc>5) sscanf(argv[5],"%f",&ko);
if(argc>6) sscanf(argv[6],"%f",&kd); if(argc>6) sscanf(argv[6],"%f",&kd);
pll_cc_init_pi_controller(&pll, bandwidth, ko, kd, damping_factor); pll_cc_init_pi_controller(&pll, bandwidth, ko, kd, damping_factor);
fprintf(stderr, "bw=%f damping=%f ko=%f kd=%f alpha=%f beta=%f\n", bandwidth, damping_factor, ko, kd, pll.alpha, pll.beta); errhead(); fprintf(stderr, "bw=%f damping=%f ko=%f kd=%f alpha=%f beta=%f\n", bandwidth, damping_factor, ko, kd, pll.alpha, pll.beta);
// pll.filter_taps_a[0], pll.filter_taps_a[1], pll.filter_taps_a[2], pll.filter_taps_b[0], pll.filter_taps_b[1], pll.filter_taps_b[2]); // pll.filter_taps_a[0], pll.filter_taps_a[1], pll.filter_taps_a[2], pll.filter_taps_b[0], pll.filter_taps_b[1], pll.filter_taps_b[2]);
} }
else return badsyntax("invalid pll_type. Valid values are:\n\t1: PLL_P_CONTROLLER\n\t2: PLL_PI_CONTROLLER"); else return badsyntax("invalid pll_type. Valid values are:\n\t1: PLL_P_CONTROLLER\n\t2: PLL_PI_CONTROLLER");
@ -2781,7 +2800,7 @@ int main(int argc, char *argv[])
sscanf(argv[4],"%f",&gain); sscanf(argv[4],"%f",&gain);
int decision_directed = !!(argc>5 && (!strcmp(argv[5], "--dd") || !strcmp(argv[5], "--decision_directed"))); int decision_directed = !!(argc>5 && (!strcmp(argv[5], "--dd") || !strcmp(argv[5], "--decision_directed")));
if(decision_directed) fprintf(stderr, "csdr bpsk_costas_loop_cc: decision directed mode\n"); if(decision_directed) { errhead(); fprintf(stderr, "decision directed mode\n"); }
bpsk_costas_loop_state_t state; bpsk_costas_loop_state_t state;
init_bpsk_costas_loop_cc(&state, decision_directed, damping_factor, loop_bandwidth, gain); init_bpsk_costas_loop_cc(&state, decision_directed, damping_factor, loop_bandwidth, gain);
@ -2845,7 +2864,7 @@ int main(int argc, char *argv[])
{ {
window=firdes_get_window_from_string(argv[4]); window=firdes_get_window_from_string(argv[4]);
} }
else fprintf(stderr,"firdes_resonator_c: window = %s\n",firdes_get_string_from_window(window)); else { errhead(); fprintf(stderr,"window = %s\n",firdes_get_string_from_window(window)); }
int octave=(argc>=6 && !strcmp("--octave",argv[5])); int octave=(argc>=6 && !strcmp("--octave",argv[5]));
@ -2950,7 +2969,7 @@ int main(int argc, char *argv[])
float signal_amplitude_per_noise = pow(10,snr_db/20); float signal_amplitude_per_noise = pow(10,snr_db/20);
float a_signal=signal_amplitude_per_noise/(signal_amplitude_per_noise+1.0); float a_signal=signal_amplitude_per_noise/(signal_amplitude_per_noise+1.0);
float a_noise=1.0/(signal_amplitude_per_noise+1.0); float a_noise=1.0/(signal_amplitude_per_noise+1.0);
fprintf(stderr, "csdr awgn_cc: a_signal = %f, a_noise = %f\n", a_signal, a_noise); errhead(); fprintf(stderr, "a_signal = %f, a_noise = %f\n", a_signal, a_noise);
if(!initialize_buffers()) return -2; if(!initialize_buffers()) return -2;
sendbufsize(the_bufsize); sendbufsize(the_bufsize);
complexf* awgn_buffer = (complexf*)malloc(sizeof(complexf)*the_bufsize); complexf* awgn_buffer = (complexf*)malloc(sizeof(complexf)*the_bufsize);
@ -2982,7 +3001,7 @@ int main(int argc, char *argv[])
float power_signal = total_logpower_cf((complexf*)input_buffer, the_bufsize); float power_signal = total_logpower_cf((complexf*)input_buffer, the_bufsize);
float power_noise = total_logpower_cf(awgn_buffer, the_bufsize); float power_noise = total_logpower_cf(awgn_buffer, the_bufsize);
//fprintf(stderr, "csdr awgn_cc: after gain_ff, power_signal = %f dB, power_noise = %f dB\n", power_signal, power_noise); //fprintf(stderr, "csdr awgn_cc: after gain_ff, power_signal = %f dB, power_noise = %f dB\n", power_signal, power_noise);
fprintf(stderr, "csdr awgn_cc: SNR = %f dB\n", power_signal - power_noise); errhead(); fprintf(stderr, "SNR = %f dB\n", power_signal - power_noise);
} }
add_ff(input_buffer, (float*)awgn_buffer, (float*)output_buffer, the_bufsize*2); add_ff(input_buffer, (float*)awgn_buffer, (float*)output_buffer, the_bufsize*2);
FWRITE_C; FWRITE_C;
@ -3040,7 +3059,7 @@ int main(int argc, char *argv[])
FREAD_R; //doesn't count, reads 4 bytes per sample anyway FREAD_R; //doesn't count, reads 4 bytes per sample anyway
float nv = normalized_timing_variance_u32_f((unsigned*)input_buffer, temp_buffer, the_bufsize, samples_per_symbol, initial_sample_offset, debug_print); float nv = normalized_timing_variance_u32_f((unsigned*)input_buffer, temp_buffer, the_bufsize, samples_per_symbol, initial_sample_offset, debug_print);
fwrite(&nv, sizeof(float), 1, stdout); fwrite(&nv, sizeof(float), 1, stdout);
fprintf(stderr, "csdr normalized_timing_variance_u32_f: normalized variance = %f\n", nv); errhead(); fprintf(stderr, "normalized variance = %f\n", nv);
TRY_YIELD; TRY_YIELD;
} }
} }
@ -3173,6 +3192,48 @@ int main(int argc, char *argv[])
return 0; return 0;
} }
if(!strcmp(argv[1], "tee")) //<path> [buffers]
{
if(argc<=2) return badsyntax("required parameter <path> is missing.");
FILE* teefile = fopen(argv[2],"w");
if(!teefile) return badsyntax("<path> cannot be opened!");
errhead(); fprintf(stderr, "file opened: %s\n", argv[2]);
int num_buffers=100;
if(argc>3) sscanf(argv[3], "%d", &num_buffers);
if(num_buffers<=0) return badsyntax("num_buffers should be > 0");
SET_NONBLOCK(fileno(teefile));
if(!sendbufsize(initialize_buffers())) return -2;
unsigned char* async_tee_buffers = malloc(sizeof(unsigned char)*the_bufsize*num_buffers);
int current_buffer_read_cntr = 0;
int current_buffer_write_cntr = 0;
int current_byte_write_cntr = 0;
for(;;)
{
FEOF_CHECK;
fread(async_tee_buffers+(the_bufsize*current_buffer_read_cntr), sizeof(unsigned char), the_bufsize, stdin);
fwrite(async_tee_buffers+(the_bufsize*current_buffer_read_cntr++), sizeof(unsigned char), the_bufsize, stdout);
if(current_buffer_read_cntr>=num_buffers) current_buffer_read_cntr = 0;
if(current_buffer_read_cntr==current_buffer_write_cntr) { errhead(); fprintf(stderr, "circular buffer overflow (read pointer gone past write pointer)\n"); }
//errhead(); fprintf(stderr, "new fwrites\n");
while(current_buffer_write_cntr!=current_buffer_read_cntr)
{
int result = fwrite(async_tee_buffers+(the_bufsize*current_buffer_write_cntr)+current_byte_write_cntr, sizeof(unsigned char), the_bufsize-current_byte_write_cntr, teefile);
if(!result) { errhead(); fprintf(stderr, "\t fwrite tee zero, next turn\n"); break; }
current_byte_write_cntr += result;
//errhead(); fprintf(stderr, "\tfwrite tee, current_byte_write_cntr = %d, current_buffer_write_cntr = %d, current_buffer_read_cntr = %d\n",
// current_byte_write_cntr, current_buffer_write_cntr, current_buffer_read_cntr);
if(current_byte_write_cntr >= the_bufsize)
{
current_byte_write_cntr = 0;
current_buffer_write_cntr++;
if(current_buffer_write_cntr>=num_buffers) current_buffer_write_cntr = 0;
}
}
TRY_YIELD;
}
return 0;
}
if(!strcmp(argv[1],"shift_addition_fc")) if(!strcmp(argv[1],"shift_addition_fc"))
{ {
bigbufs=1; bigbufs=1;
@ -3195,7 +3256,7 @@ int main(int argc, char *argv[])
for(;;) for(;;)
{ {
shift_addition_data_t data=shift_addition_init(rate); shift_addition_data_t data=shift_addition_init(rate);
fprintf(stderr,"shift_addition_fc: reinitialized to %g\n",rate); errhead(); fprintf(stderr,"reinitialized to %g\n",rate);
int remain, current_size; int remain, current_size;
float* ibufptr; float* ibufptr;
float* obufptr; float* obufptr;
@ -3261,7 +3322,7 @@ int main(int argc, char *argv[])
float* input=(float*)fft_malloc(sizeof(float)*fft_in_size); float* input=(float*)fft_malloc(sizeof(float)*fft_in_size);
float* windowed=(float*)fft_malloc(sizeof(float)*fft_in_size); float* windowed=(float*)fft_malloc(sizeof(float)*fft_in_size);
complexf* output=(complexf*)fft_malloc(sizeof(complexf)*fft_out_size); complexf* output=(complexf*)fft_malloc(sizeof(complexf)*fft_out_size);
if(benchmark) fprintf(stderr,"fft_cc: benchmarking..."); if(benchmark) { errhead(); fprintf(stderr,"benchmarking..."); }
FFT_PLAN_T* plan=make_fft_r2c(fft_in_size, windowed, output, benchmark); FFT_PLAN_T* plan=make_fft_r2c(fft_in_size, windowed, output, benchmark);
if(benchmark) fprintf(stderr," done\n"); if(benchmark) fprintf(stderr," done\n");
//if(octave) printf("setenv(\"GNUTERM\",\"X11 noraise\");y=zeros(1,%d);semilogy(y,\"ydatasource\",\"y\");\n",fft_size); // TODO //if(octave) printf("setenv(\"GNUTERM\",\"X11 noraise\");y=zeros(1,%d);semilogy(y,\"ydatasource\",\"y\");\n",fft_size); // TODO