From 30040bdb7fbb4c236c5b1275dcdc6ff8d58665be Mon Sep 17 00:00:00 2001 From: drowe67 Date: Sat, 14 Jan 2017 05:32:08 +0000 Subject: [PATCH] refactored FSK modes so it works with complex inputs git-svn-id: https://svn.code.sf.net/p/freetel/code@2971 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/src/freedv_api.c | 83 ++++++++++++------------------------- 1 file changed, 26 insertions(+), 57 deletions(-) diff --git a/codec2-dev/src/freedv_api.c b/codec2-dev/src/freedv_api.c index 1a607282..457e5349 100644 --- a/codec2-dev/src/freedv_api.c +++ b/codec2-dev/src/freedv_api.c @@ -880,7 +880,7 @@ int freedv_rx(struct freedv *f, short speech_out[], short demod_in[]) { // float input samples version -int freedv_floatrx_fsk(struct freedv *f, float demod_in[], int *valid) { +int freedv_comprx_fsk(struct freedv *f, COMP demod_in[], int *valid) { /* Varicode and protocol bits */ uint8_t vc_bits[2]; uint8_t proto_bits[3]; @@ -889,20 +889,17 @@ int freedv_floatrx_fsk(struct freedv *f, float demod_in[], int *valid) { int n_ascii; char ascii_out; - - if(f->mode == FREEDV_MODE_2400A || f->mode == FREEDV_MODE_800XA){ - /* DR: 21/11/16 - temp code while porting fsk_demod to complex */ - int n = fsk_nin(f->fsk); - COMP demod_comp[n]; + if(f->mode == FREEDV_MODE_2400A || f->mode == FREEDV_MODE_800XA){ + fsk_demod(f->fsk,(uint8_t*)f->tx_bits,demod_in); + f->nin = fsk_nin(f->fsk); + }else{ + /* 2400B needs real input samples */ + int n = fmfsk_nin(f->fmfsk); + float demod_in_float[n]; for(i=0; ifsk,(uint8_t*)f->tx_bits,demod_comp); - f->nin = fsk_nin(f->fsk); - }else{ - fmfsk_demod(f->fmfsk,(uint8_t*)f->tx_bits,demod_in); + fmfsk_demod(f->fmfsk,(uint8_t*)f->tx_bits,demod_in_float); f->nin = fmfsk_nin(f->fmfsk); } @@ -938,37 +935,13 @@ int freedv_floatrx(struct freedv *f, short speech_out[], float demod_in[]) { assert(nin <= f->n_max_modem_samples); - /* FSK RX happens in real floats, so demod for those goes here */ - if( (f->mode == FREEDV_MODE_2400A) || (f->mode == FREEDV_MODE_2400B) || (f->mode == FREEDV_MODE_800XA)){ - int valid; - int nout = freedv_floatrx_fsk(f, demod_in, &valid); - if (valid == 0) - for (i = 0; i < nout; i++) - speech_out[i] = 0; - else if (valid < 0){ - for (i = 0; i < nout; i++) - speech_out[i] = demod_in[i]; - }else { - int bits_per_codec_frame = codec2_bits_per_frame(f->codec2); - int bytes_per_codec_frame = (bits_per_codec_frame + 7) / 8; - int frames = f->n_codec_bits / bits_per_codec_frame; - for (i = 0; i < frames; i++) { - codec2_decode(f->codec2, speech_out, f->packed_codec_bits + i * bytes_per_codec_frame); - speech_out += codec2_samples_per_frame(f->codec2); - } - } - return f->n_speech_samples; - } - - if( (f->mode == FREEDV_MODE_1600) || (f->mode == FREEDV_MODE_700) || (f->mode == FREEDV_MODE_700B) || (f->mode == FREEDV_MODE_700C)){ - COMP rx_fdm[f->n_max_modem_samples]; - for(i=0; in_max_modem_samples]; + for(i=0; imode == FREEDV_MODE_700) || (f->mode == FREEDV_MODE_700B) || (f->mode == FREEDV_MODE_700C)) { nout = freedv_comprx_fdmdv_700(f, demod_in, &valid); } + + if( (f->mode == FREEDV_MODE_2400A) || (f->mode == FREEDV_MODE_2400B) || (f->mode == FREEDV_MODE_800XA)){ + nout = freedv_comprx_fsk(f, demod_in, &valid); + } #endif if (valid == 0) @@ -1321,26 +1298,18 @@ int freedv_codecrx(struct freedv *f, unsigned char *packed_codec_bits, short dem int nin = freedv_nin(f); int valid; int ret = 0; - float rx_float[f->n_max_modem_samples]; assert(nin <= f->n_max_modem_samples); - /* FSK RX happens in real floats, so convert to those and call their demod here */ - if( (f->mode == FREEDV_MODE_2400A) || (f->mode == FREEDV_MODE_2400B) || (f->mode == FREEDV_MODE_800XA)){ - for(i=0; imode == FREEDV_MODE_1600) || (f->mode == FREEDV_MODE_700) || (f->mode == FREEDV_MODE_700B) || (f->mode == FREEDV_MODE_700C)){ - for(i=0; imode == FREEDV_MODE_1600) { freedv_comprx_fdmdv_1600(f, rx_fdm, &valid); } + #ifndef CORTEX_M4 if ((f->mode == FREEDV_MODE_700) || (f->mode == FREEDV_MODE_700B) || (f->mode == FREEDV_MODE_700C)) { freedv_comprx_fdmdv_700(f, rx_fdm, &valid); @@ -1348,7 +1317,7 @@ int freedv_codecrx(struct freedv *f, unsigned char *packed_codec_bits, short dem #endif if( (f->mode == FREEDV_MODE_2400A) || (f->mode == FREEDV_MODE_2400B) || (f->mode == FREEDV_MODE_800XA)){ - freedv_floatrx_fsk(f, rx_float, &valid); + freedv_comprx_fsk(f, rx_fdm, &valid); } if (valid == 1) { -- 2.25.1