Fixed generic slicer, etc.
This commit is contained in:
parent
978289e76b
commit
ee5b546439
3 changed files with 33 additions and 31 deletions
9
csdr.c
9
csdr.c
|
@ -144,7 +144,7 @@ char usage[]=
|
||||||
" repeat_u8 <data_bytes × N>\n"
|
" repeat_u8 <data_bytes × N>\n"
|
||||||
" uniform_noise_f\n"
|
" uniform_noise_f\n"
|
||||||
" gaussian_noise_c\n"
|
" gaussian_noise_c\n"
|
||||||
" awgn_cc <snr_db> [--snrshow]\n"
|
" awgn_cc <snr_db> [--awgnfile <file>] [--snrshow]\n"
|
||||||
" pack_bits_8to1_u8_u8\n"
|
" pack_bits_8to1_u8_u8\n"
|
||||||
" pack_bits_1to8_u8_u8\n"
|
" pack_bits_1to8_u8_u8\n"
|
||||||
" firdes_pulse_shaping_filter_f (RRC <samples_per_symbol> <num_taps> <beta> | COSINE <samples_per_symbol>)\n"
|
" firdes_pulse_shaping_filter_f (RRC <samples_per_symbol> <num_taps> <beta> | COSINE <samples_per_symbol>)\n"
|
||||||
|
@ -158,7 +158,9 @@ char usage[]=
|
||||||
" pattern_search_u8_u8 <values_after> <pattern_values × N>\n"
|
" pattern_search_u8_u8 <values_after> <pattern_values × N>\n"
|
||||||
" dbpsk_decoder_c_u8\n"
|
" dbpsk_decoder_c_u8\n"
|
||||||
" bfsk_demod_cf <spacing> <filter_length>\n"
|
" bfsk_demod_cf <spacing> <filter_length>\n"
|
||||||
|
" normalized_timing_variance_u32_f <samples_per_symbol> <initial_sample_offset> [--debug]\n"
|
||||||
" ?<search_the_function_list>\n"
|
" ?<search_the_function_list>\n"
|
||||||
|
" ??<jump_to_function_docs_on_github>\n"
|
||||||
" =<evaluate_python_expression>\n"
|
" =<evaluate_python_expression>\n"
|
||||||
" \n"
|
" \n"
|
||||||
;
|
;
|
||||||
|
@ -2592,11 +2594,12 @@ int main(int argc, char *argv[])
|
||||||
if(argc>=(7+add_q) && !strcmp(argv[6+add_q], "--output_error")) output_error = 1;
|
if(argc>=(7+add_q) && !strcmp(argv[6+add_q], "--output_error")) output_error = 1;
|
||||||
float* timing_error = NULL;
|
float* timing_error = NULL;
|
||||||
if(output_error) timing_error = (float*)malloc(sizeof(float)*the_bufsize);
|
if(output_error) timing_error = (float*)malloc(sizeof(float)*the_bufsize);
|
||||||
errhead(); fprintf(stderr, "--output_error mode\n");
|
if(output_error) { errhead(); fprintf(stderr, "--output_error mode\n"); }
|
||||||
|
|
||||||
if(argc>=(7+add_q) && !strcmp(argv[6+add_q], "--output_indexes")) output_indexes = 1;
|
if(argc>=(7+add_q) && !strcmp(argv[6+add_q], "--output_indexes")) output_indexes = 1;
|
||||||
unsigned* sampled_indexes = NULL;
|
unsigned* sampled_indexes = NULL;
|
||||||
if(output_indexes) sampled_indexes = (unsigned*)malloc(sizeof(float)*the_bufsize);
|
if(output_indexes) sampled_indexes = (unsigned*)malloc(sizeof(float)*the_bufsize);
|
||||||
|
if(output_indexes) { errhead(); fprintf(stderr, "--output_indexes mode\n"); }
|
||||||
|
|
||||||
if(!initialize_buffers()) return -2;
|
if(!initialize_buffers()) return -2;
|
||||||
sendbufsize(the_bufsize/decimation);
|
sendbufsize(the_bufsize/decimation);
|
||||||
|
@ -3595,7 +3598,7 @@ int main(int argc, char *argv[])
|
||||||
if(argv[1][0]=='?')
|
if(argv[1][0]=='?')
|
||||||
{
|
{
|
||||||
char buffer[1000];
|
char buffer[1000];
|
||||||
snprintf(buffer, 1000-1, "csdr 2>&1 | grep %s", argv[1]+1);
|
snprintf(buffer, 1000-1, "csdr 2>&1 | grep -i %s", argv[1]+1);
|
||||||
fprintf(stderr, "csdr ?: %s\n", buffer);
|
fprintf(stderr, "csdr ?: %s\n", buffer);
|
||||||
system(buffer);
|
system(buffer);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -15,11 +15,13 @@ function y=inarg(x)
|
||||||
y=0;
|
y=0;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
bpfcmd="csdr bandpass_fir_fft_cc $(csdr \"=-31.25/8e3\") $(csdr \"=31.25/8e3\") $(csdr \"=31.25/8e3\") | ";
|
||||||
|
|
||||||
if !inarg('--nogen')
|
if !inarg('--nogen')
|
||||||
fwrite(stdout, "===========================================\nGenerating baseband signal from random data\n===========================================\n");
|
fwrite(stdout, "===========================================\nGenerating baseband signal from random data\n===========================================\n");
|
||||||
system('cat /dev/urandom | csdr pack_bits_8to1_u8_u8 | csdr psk_modulator_u8_c 2 | csdr gain_ff 0.25 | csdr psk31_interpolate_sine_cc 256 | csdr add_n_zero_samples_at_beginning_f 170 | pv -ps 2g | dd iflag=fullblock bs=128M count=16 of=/tmp/psk31-raw-data');
|
system(["cat /dev/urandom | csdr pack_bits_8to1_u8_u8 | csdr psk_modulator_u8_c 2 | csdr gain_ff 0.25 | csdr psk31_interpolate_sine_cc 256 | " bpfcmd "csdr add_n_zero_samples_at_beginning_f 170 | pv -ps 2g | dd iflag=fullblock bs=128M count=16 of=/tmp/psk31-raw-data"]);
|
||||||
fwrite(stdout, "===========================================\nGenerating Gaussian white noise for agwn_cc\n===========================================\n");
|
fwrite(stdout, "===========================================\nGenerating Gaussian white noise for agwn_cc\n===========================================\n");
|
||||||
system('csdr gaussian_noise_c | pv -ps 256m | dd of=/tmp/psk31-gaussian-noise iflag=fullblock bs=256M count=1');
|
system(["csdr gaussian_noise_c | " bpfcmd "pv -ps 256m | dd of=/tmp/psk31-gaussian-noise iflag=fullblock bs=256M count=1"]);
|
||||||
end
|
end
|
||||||
if inarg('--onlygen')
|
if inarg('--onlygen')
|
||||||
exit(0)
|
exit(0)
|
||||||
|
@ -49,7 +51,7 @@ end
|
||||||
|
|
||||||
function variance=run_var(snr, which_ted)
|
function variance=run_var(snr, which_ted)
|
||||||
disp('ran a command')
|
disp('ran a command')
|
||||||
out_vect=shrun(sprintf('cat /tmp/psk31-raw-data | csdr awgn_cc %d --awgnfile /tmp/psk31-gaussian-noise | csdr bandpass_fir_fft_cc $(csdr "=-31.25/8e3") $(csdr "=31.25/8e3") $(csdr "=31.25/8e3") | csdr simple_agc_cc 0.0001 0.5 | csdr timing_recovery_cc %s 256 0.5 2 --add_q --output_indexes | CSDR_FIXED_BUFSIZE=1048576 csdr normalized_timing_variance_u32_f 256 85', snr, which_ted), 'float32', 1);
|
out_vect=shrun(sprintf('cat /tmp/psk31-raw-data | csdr awgn_cc %d --awgnfile /tmp/psk31-gaussian-noise | csdr simple_agc_cc 0.0001 0.5 | csdr timing_recovery_cc %s 256 0.5 2 --add_q --output_indexes | CSDR_FIXED_BUFSIZE=1048576 csdr normalized_timing_variance_u32_f 256 85', snr, which_ted), 'float32', 1);
|
||||||
disp('run_var output:');
|
disp('run_var output:');
|
||||||
out_vect'
|
out_vect'
|
||||||
variance=out_vect(1);
|
variance=out_vect(1);
|
||||||
|
@ -77,33 +79,21 @@ function fmtplot(h)
|
||||||
ylabel('Phase error variance [rad^2]');
|
ylabel('Phase error variance [rad^2]');
|
||||||
end
|
end
|
||||||
|
|
||||||
snrs=-15:5:20
|
%snrs=-10:5:10
|
||||||
|
snrs=-10:5:25
|
||||||
%snrs=[10]
|
%snrs=[10]
|
||||||
error_values_gardner=mkvarplot('GARDNER',snrs);
|
error_values=mkvarplot('EARLYLATE',snrs);
|
||||||
%{
|
|
||||||
snrs_earlylate=0:256
|
|
||||||
error_values_earlylate=mkvarplot('EARLYLATE',snrs_earlylate);
|
|
||||||
%}
|
|
||||||
|
|
||||||
%graphics_toolkit("gnuplot")
|
%graphics_toolkit("gnuplot")
|
||||||
h=figure(1);
|
h=figure(1);
|
||||||
|
|
||||||
ebn0=snrs-13.26-10*log10(1/256.)
|
ebn0=snrs+9.7
|
||||||
%13.56 dB is the difference between the real (measured) SNR and the number input to awgn_cc.
|
|
||||||
%This is because agwn_cc assumes a signal with 0dB power at te input, while our BPSK31 baseband signal is of -13.26 dB.
|
|
||||||
|
|
||||||
semilogy(ebn0, error_values_gardner, 'linewidth', 2);
|
semilogy(ebn0, error_values, 'linewidth', 2);
|
||||||
title('Estimation variance');
|
title('Estimation variance');
|
||||||
fmtplot(h)
|
fmtplot(h)
|
||||||
pause
|
pause
|
||||||
|
|
||||||
%{
|
|
||||||
semilogy(snrs_earlylate, error_values_earlylate, 'linewidth', 2);
|
|
||||||
title('S-curve for early-late TED');
|
|
||||||
fmtplot(h)
|
|
||||||
pause
|
|
||||||
%}
|
|
||||||
|
|
||||||
if !inarg('--nogen')
|
if !inarg('--nogen')
|
||||||
system('rm /tmp/psk31-raw-data /tmp/psk31-gaussian-noise');
|
system('rm /tmp/psk31-raw-data /tmp/psk31-gaussian-noise');
|
||||||
end
|
end
|
||||||
|
|
19
libcsdr.c
19
libcsdr.c
|
@ -1730,29 +1730,38 @@ void serial_line_decoder_f_u8(serial_line_t* s, float* input, unsigned char* out
|
||||||
|
|
||||||
void generic_slicer_f_u8(float* input, unsigned char* output, int input_size, int n_symbols)
|
void generic_slicer_f_u8(float* input, unsigned char* output, int input_size, int n_symbols)
|
||||||
{
|
{
|
||||||
float symbol_distance = 2.0/(n_symbols+1);
|
float symbol_distance = 2.0/(n_symbols-1);
|
||||||
for(int i=0;i<input_size;i++)
|
for(int i=0;i<input_size;i++)
|
||||||
for(int j=0;j<n_symbols;i++)
|
for(int j=0;j<n_symbols;j++)
|
||||||
{
|
{
|
||||||
float symbol_center = -1+j*symbol_distance;
|
float symbol_center = -1+j*symbol_distance;
|
||||||
float symbol_low_limit = symbol_center-(symbol_distance/2);
|
float symbol_low_limit = symbol_center-(symbol_distance/2);
|
||||||
float symbol_high_limit = symbol_center+(symbol_distance/2);
|
float symbol_high_limit = symbol_center+(symbol_distance/2);
|
||||||
if(j==0)
|
if(j==0)
|
||||||
{
|
{
|
||||||
if(input[i]<symbol_high_limit) output[i]=j;
|
if(input[i]<symbol_high_limit)
|
||||||
|
{
|
||||||
|
output[i]=j;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else if (j==n_symbols-1)
|
else if (j==n_symbols-1)
|
||||||
{
|
{
|
||||||
if(input[i]>=symbol_low_limit) output[i]=j;
|
if(input[i]>=symbol_low_limit)
|
||||||
|
{
|
||||||
|
output[i]=j;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(input[i]>=symbol_low_limit && input[i]<symbol_high_limit) output[i]=j;
|
if(input[i]>=symbol_low_limit && input[i]<symbol_high_limit)
|
||||||
|
{
|
||||||
|
output[i]=j;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void binary_slicer_f_u8(float* input, unsigned char* output, int input_size)
|
void binary_slicer_f_u8(float* input, unsigned char* output, int input_size)
|
||||||
|
|
Loading…
Reference in a new issue