Added "csdr tee" and unified how csdr messages start
This commit is contained in:
parent
b6143ad4f8
commit
d526744d0c
1 changed files with 117 additions and 56 deletions
173
csdr.c
173
csdr.c
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue