From d1af45a588f547c351ed722c0f21688d51c8144b Mon Sep 17 00:00:00 2001 From: ha7ilm Date: Sun, 30 Apr 2017 17:51:35 +0200 Subject: [PATCH] Added matched filter --- csdr.c | 70 +++++++++++++++++++++++++++++++++------ libcsdr.c | 99 +++++++++++++++++++++++++++++++++++++++++++------------ libcsdr.h | 14 ++++++++ 3 files changed, 152 insertions(+), 31 deletions(-) diff --git a/csdr.c b/csdr.c index 52f1c66..0c415ee 100755 --- a/csdr.c +++ b/csdr.c @@ -3030,26 +3030,76 @@ int main(int argc, char *argv[]) fwrite(zeros, sizeof(float), n_zero_samples, stdout); clone_(the_bufsize); } -/* - if(!strcmp(argv[1], "matched_filter_cc")) // + + int matched_filter_which = 0; + if( + (!strcmp(argv[1], "firdes_matched_filter_f") && (matched_filter_which = 1)) || + (!strcmp(argv[1], "matched_filter_cc") && (matched_filter_which = 2)) + ) //(RRC | COSINE ) { + if(argc<=2) return badsyntax("required parameter is missing."); + matched_filter_type_t type = matched_filter_get_type_from_string(argv[2]); int samples_per_symbol = 0; - if(argc<=2) return badsyntax("required parameter is missing."); - sscanf(argv[2],"%d",&samples_per_symbol); + + if(argc<=3) return badsyntax("required parameter is missing."); + sscanf(argv[3],"%d",&samples_per_symbol); + int num_taps = 0; - if(argc<=2) return badsyntax("required parameter is missing."); - sscanf(argv[2],"%d",&num_taps); + if(argc<=4 && type!=MATCHED_FILTER_COSINE) + return badsyntax("required parameter is missing."); + sscanf(argv[4],"%d",&num_taps); + + float beta = 0; + if(argc<=5 && type==MATCHED_FILTER_RRC) + return badsyntax("required parameter is missing."); + sscanf(argv[5],"%f",&beta); + + if(type==MATCHED_FILTER_COSINE) num_taps = (2*samples_per_symbol)+1; + float* taps = (float*)malloc(sizeof(float)*num_taps); + switch(type) + { + case MATCHED_FILTER_RRC: + firdes_rrc_f(taps, num_taps, samples_per_symbol, beta); + break; + case MATCHED_FILTER_COSINE: + firdes_cosine_f(taps, num_taps, samples_per_symbol); + break; + } + + if(!sendbufsize(initialize_buffers())) return -2; + + if(matched_filter_which==1) + { + for(int i=0;i + { + int n_symbols = 0; + if(argc<=2) return badsyntax("required parameter is missing."); + sscanf(argv[2],"%d",&n_symbols); if(!sendbufsize(initialize_buffers())) return -2; for(;;) { FEOF_CHECK; - FREAD_C; - - FWRITE_C; + if(!FREAD_R) break; + generic_slicer_f_u8(input_buffer, (unsigned char*)output_buffer, the_bufsize, n_symbols); + FWRITE_U8; TRY_YIELD; } + return 0; } -*/ if(!strcmp(argv[1],"none")) { diff --git a/libcsdr.c b/libcsdr.c index f2ea3e8..89e4b10 100755 --- a/libcsdr.c +++ b/libcsdr.c @@ -1721,6 +1721,33 @@ void serial_line_decoder_f_u8(serial_line_t* s, float* input, unsigned char* out DEBUG_SERIAL_LINE_DECODER && fprintf(stderr, "sld: >> output_size = %d (+%d)\n", s->output_size, s->input_used); } +void generic_slicer_f_u8(float* input, unsigned char* output, int input_size, int n_symbols) +{ + float symbol_distance = 2.0/(n_symbols+1); + for(int i=0;i=symbol_low_limit) output[i]=j; + break; + } + else + { + if(input[i]>=symbol_low_limit && input[i] 0; @@ -2169,6 +2196,24 @@ int apply_fir_cc(complexf* input, complexf* output, int input_size, complexf* ta return i; } + +int apply_real_fir_cc(complexf* input, complexf* output, int input_size, float* taps, int taps_length) +{ + int i; + for(i=0; i1); - iof(output, i)=(1/0.82)*iof(output, i); - qof(output, i)=(1/0.82)*qof(output, i); - } -} -*/ - - int deinit_get_random_samples_f(FILE* status) { return fclose(status); } +int firdes_cosine_f(float* taps, int taps_length, int samples_per_symbol) +{ + //needs a taps_length 2 × samples_per_symbol + 1 + int middle_i=taps_length/2; + for(int i=0;i