Added simple_agc_cc

This commit is contained in:
ha7ilm 2017-04-06 20:38:44 +02:00
parent e7f9be41c2
commit fc350d594c
3 changed files with 53 additions and 1 deletions

33
csdr.c
View file

@ -135,6 +135,7 @@ char usage[]=
" duplicate_samples_ntimes_u8_u8 <sample_size_bytes> <ntimes>\n"
" bpsk_costas_loop_cc <samples_per_bits>\n"
" binary_slicer_f_u8\n"
" simple_agc_cc <rate> [reference [max_gain]]\n"
" ?<search_the_function_list>\n"
" =<evaluate_python_expression>\n"
" \n"
@ -2652,7 +2653,7 @@ int main(int argc, char *argv[])
float samples_per_bits;
if(argc<=2) return badsyntax("need required parameter (samples_per_bits)");
sscanf(argv[2],"%f",&samples_per_bits);
if(samples_per_bits<=0) badsyntax("samples_per_bits should be >= 0");
if(samples_per_bits<=0) badsyntax("samples_per_bits should be > 0");
bpsk_costas_loop_state_t state = init_bpsk_costas_loop_cc(samples_per_bits);
@ -2669,6 +2670,36 @@ int main(int argc, char *argv[])
}
}
if(!strcmp(argv[1],"simple_agc_cc")) //<rate> [reference [max_gain]]
{
float rate;
if(argc<=2) return badsyntax("need required parameter (rate)");
sscanf(argv[2],"%f",&rate);
if(rate<=0) badsyntax("rate should be > 0");
float reference = 1.;
if(argc>3) sscanf(argv[3],"%f",&reference);
if(reference<=0) badsyntax("reference should be > 0");
float max_gain = 65535.;
if(argc>4) sscanf(argv[4],"%f",&max_gain);
if(max_gain<=0) badsyntax("max_gain should be > 0");
float current_gain = 1.;
if(!initialize_buffers()) return -2;
sendbufsize(the_bufsize);
for(;;)
{
FEOF_CHECK;
FREAD_C;
simple_agc_cc((complexf*)input_buffer, (complexf*)output_buffer, the_bufsize, rate, reference, max_gain, &current_gain);
FWRITE_C;
TRY_YIELD;
}
}
if(!strcmp(argv[1],"none"))
{
return 0;

View file

@ -1990,6 +1990,26 @@ void bpsk_costas_loop_cc(complexf* input, complexf* output, int input_size, bpsk
}
}
void simple_agc_cc(complexf* input, complexf* output, int input_size, float rate, float reference, float max_gain, float* current_gain)
{
float rate_1minus=1-rate;
int debugn = 0;
for(int i=0;i<input_size;i++)
{
float amplitude = sqrt(input[i].i*input[i].i+input[i].q*input[i].q);
float ideal_gain = (reference/amplitude);
if(ideal_gain>max_gain) ideal_gain = max_gain;
if(ideal_gain<=0) ideal_gain = 0;
//*current_gain += (ideal_gain-(*current_gain))*rate;
*current_gain = (ideal_gain-(*current_gain))*rate + (*current_gain)*rate_1minus;
if(debugn<100) fprintf(stderr, "cgain: %g\n", *current_gain), debugn++;
output[i].i=(*current_gain)*input[i].i;
output[i].q=(*current_gain)*input[i].q;
}
}
/*
_____ _ _

View file

@ -337,3 +337,4 @@ typedef struct bpsk_costas_loop_state_s
bpsk_costas_loop_state_t init_bpsk_costas_loop_cc(float samples_per_bits);
void bpsk_costas_loop_cc(complexf* input, complexf* output, int input_size, bpsk_costas_loop_state_t* state);
void simple_agc_cc(complexf* input, complexf* output, int input_size, float rate, float reference, float max_gain, float* current_gain);