FreeCalypso > hg > gsm-codec-lib
changeset 64:1cc2968f883f
libgsmefr: dec_12k2.c compiles
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 26 Nov 2022 02:05:51 +0000 |
parents | 6a623cb57d07 |
children | cb080ec1817e |
files | libgsmefr/Makefile libgsmefr/codec.h libgsmefr/dec_12k2.c |
diffstat | 3 files changed, 62 insertions(+), 138 deletions(-) [+] |
line wrap: on
line diff
--- a/libgsmefr/Makefile Sat Nov 26 01:11:04 2022 +0000 +++ b/libgsmefr/Makefile Sat Nov 26 02:05:51 2022 +0000 @@ -1,8 +1,9 @@ CC= gcc CFLAGS= -O2 OBJS= agc.o autocorr.o az_lsp.o basicop2.o c1035pf.o cod_12k2.o convolve.o \ - d1035pf.o d_gains.o d_homing.o d_plsf_5.o dec_create.o enc_create.o \ - frame2params.o params2frame.o sid_class.o sid_insert.o tls_flags.o + d1035pf.o d_gains.o d_homing.o d_plsf_5.o dec_12k2.o dec_create.o \ + enc_create.o frame2params.o params2frame.o sid_class.o sid_insert.o \ + tls_flags.o HDRS= basic_op.h cnst.h codec.h d_homing.h dec_state.h dtx.h e_homing.h \ enc_state.h gains_tb.h gsm_efr.h memops.h namespace.h no_count.h \ oper_32b.h sig_proc.h typedef.h vad.h
--- a/libgsmefr/codec.h Sat Nov 26 01:11:04 2022 +0000 +++ b/libgsmefr/codec.h Sat Nov 26 02:05:51 2022 +0000 @@ -10,8 +10,8 @@ void Decoder_12k2 ( struct EFR_decoder_state *st, - Word16 parm[], /* input : vector of synthesis parameters - parm[0] = bad frame indicator (bfi) */ + Word16 bfi, /* input : Bad Frame Indication */ + Word16 parm[], /* input : vector of synthesis parameters */ Word16 synth[], /* output: synthesis speech */ Word16 A_t[], /* output: decoded LP filter in 4 subframes */ Word16 TAF,
--- a/libgsmefr/dec_12k2.c Sat Nov 26 01:11:04 2022 +0000 +++ b/libgsmefr/dec_12k2.c Sat Nov 26 02:05:51 2022 +0000 @@ -14,17 +14,19 @@ * ***************************************************************************/ +#include "gsm_efr.h" #include "typedef.h" +#include "namespace.h" #include "basic_op.h" #include "sig_proc.h" -#include "count.h" +#include "memops.h" +#include "no_count.h" #include "codec.h" #include "cnst.h" +#include "dec_state.h" #include "dtx.h" -extern Word16 dtx_mode; - /*---------------------------------------------------------------* * Decoder constant parameters (defined in "cnst.h") * *---------------------------------------------------------------* @@ -43,24 +45,6 @@ * Static memory allocation. * *--------------------------------------------------------*/ - /* Excitation vector */ - -static Word16 old_exc[L_FRAME + PIT_MAX + L_INTERPOL]; -static Word16 *exc; - - /* Lsp (Line spectral pairs) */ - -static Word16 lsp_old[M]; - - /* Filter's memory */ - -static Word16 mem_syn[M]; - - /* Memories for bad frame handling */ - -static Word16 prev_bf; -static Word16 state; - /*************************************************************************** * * FUNCTION: Init_Decoder_12k2 @@ -69,34 +53,30 @@ * ***************************************************************************/ -void Init_Decoder_12k2 (void) +void Init_Decoder_12k2 (struct EFR_decoder_state *st) { - /* Initialize static pointer */ - - exc = old_exc + PIT_MAX + L_INTERPOL; - /* Static vectors to zero */ - Set_zero (old_exc, PIT_MAX + L_INTERPOL); - Set_zero (mem_syn, M); + Set_zero (st->old_exc, PIT_MAX + L_INTERPOL); + Set_zero (st->mem_syn, M); /* Initialize lsp_old [] */ - lsp_old[0] = 30000; - lsp_old[1] = 26000; - lsp_old[2] = 21000; - lsp_old[3] = 15000; - lsp_old[4] = 8000; - lsp_old[5] = 0; - lsp_old[6] = -8000; - lsp_old[7] = -15000; - lsp_old[8] = -21000; - lsp_old[9] = -26000; + st->lsp_old[0] = 30000; + st->lsp_old[1] = 26000; + st->lsp_old[2] = 21000; + st->lsp_old[3] = 15000; + st->lsp_old[4] = 8000; + st->lsp_old[5] = 0; + st->lsp_old[6] = -8000; + st->lsp_old[7] = -15000; + st->lsp_old[8] = -21000; + st->lsp_old[9] = -26000; /* Initialize memories of bad frame handling */ - prev_bf = 0; - state = 0; + st->prev_bf = 0; + st->bf_state = 0; return; } @@ -110,14 +90,16 @@ ***************************************************************************/ void Decoder_12k2 ( - Word16 parm[], /* input : vector of synthesis parameters - parm[0] = bad frame indicator (bfi) */ + struct EFR_decoder_state *st, + Word16 bfi, /* input : Bad Frame Indication */ + Word16 parm[], /* input : vector of synthesis parameters */ Word16 synth[],/* output: synthesis speech */ Word16 A_t[], /* output: decoded LP filter in 4 subframes */ Word16 TAF, Word16 SID_flag ) { + Word16 *exc = st->old_exc + PIT_MAX + L_INTERPOL; /* LPC coefficients */ @@ -140,39 +122,30 @@ Word16 i, i_subfr; Word16 T0, T0_frac, index; - Word16 gain_pit, gain_code, bfi, pit_sharp; + Word16 gain_pit, gain_code, pit_sharp; Word16 temp; Word32 L_temp; - extern Word16 rxdtx_ctrl, rx_dtx_state; - extern Word32 L_pn_seed_rx; - - /* Test bad frame indicator (bfi) */ - - bfi = *parm++; move16 (); - /* Set state machine */ - test (); test (); if (bfi != 0) { - state = add (state, 1); + st->bf_state = add (st->bf_state, 1); } - else if (sub (state, 6) == 0) + else if (sub (st->bf_state, 6) == 0) { - state = 5; + st->bf_state = 5; } else { - state = 0; + st->bf_state = 0; } - test (); - if (sub (state, 6) > 0) + if (sub (st->bf_state, 6) > 0) { - state = 6; + st->bf_state = 6; } - rx_dtx (&rxdtx_ctrl, TAF, bfi, SID_flag); + rx_dtx (st, TAF, bfi, SID_flag); /* If this frame is the first speech frame after CNI period, */ /* set the BFH state machine to an appropriate state depending */ @@ -183,49 +156,31 @@ /* keep the audible noise resulting from a SID frame which is */ /* erroneously interpreted as a good speech frame as small as */ /* possible (the decoder output in this case is quickly muted) */ - test (); logic16 (); - if ((rxdtx_ctrl & RX_FIRST_SP_FLAG) != 0) + if ((st->rxdtx_ctrl & RX_FIRST_SP_FLAG) != 0) { - test (); logic16 (); - if ((rxdtx_ctrl & RX_PREV_DTX_MUTING) != 0) + if ((st->rxdtx_ctrl & RX_PREV_DTX_MUTING) != 0) { - state = 5; move16 (); - prev_bf = 1; move16 (); + st->bf_state = 5; + st->prev_bf = 1; } else { - state = 5; move16 (); - prev_bf = 0; move16 (); + st->bf_state = 5; + st->prev_bf = 0; } } -#if (WMOPS) - fwc (); /* function worst case */ + D_plsf_5 (st, parm, lsp_mid, lsp_new, bfi, st->rxdtx_ctrl, + st->rx_dtx_state); - /* Note! The following test is performed only for determining - whether or not DTX mode is active, in order to switch off - worst worst case complexity printout when DTX mode is active - */ - if ((rxdtx_ctrl & RX_SP_FLAG) == 0) - { - dtx_mode = 1; - } -#endif - - D_plsf_5 (parm, lsp_mid, lsp_new, bfi, rxdtx_ctrl, rx_dtx_state); - -#if (WMOPS) - fwc (); /* function worst case */ -#endif /* Advance synthesis parameters pointer */ parm += 5; move16 (); - test (); logic16 (); - if ((rxdtx_ctrl & RX_SP_FLAG) != 0) + if ((st->rxdtx_ctrl & RX_SP_FLAG) != 0) { /* Interpolation of LPC for the 4 subframes */ - Int_lpc (lsp_old, lsp_mid, lsp_new, A_t); + Int_lpc (st->lsp_old, lsp_mid, lsp_new, A_t); } else { @@ -243,11 +198,8 @@ /* update the LSPs for the next frame */ for (i = 0; i < M; i++) { - lsp_old[i] = lsp_new[i]; move16 (); + st->lsp_old[i] = lsp_new[i]; } -#if (WMOPS) - fwc (); /* function worst case */ -#endif /*---------------------------------------------------------------------* * Loop for every subframe in the analysis frame * @@ -268,23 +220,16 @@ index = *parm++; move16 (); /* pitch index */ - test (); logic16 (); - if ((rxdtx_ctrl & RX_SP_FLAG) != 0) + if ((st->rxdtx_ctrl & RX_SP_FLAG) != 0) { - T0 = Dec_lag6 (index, PIT_MIN, PIT_MAX, i_subfr, L_FRAME_BY2, + T0 = Dec_lag6 (st, index, PIT_MIN, PIT_MAX, i_subfr, L_FRAME_BY2, &T0_frac, bfi); -#if (WMOPS) - fwc (); /* function worst case */ -#endif /*-------------------------------------------------* * - Find the adaptive codebook vector. * *-------------------------------------------------*/ Pred_lt_6 (&exc[i_subfr], T0, T0_frac, L_SUBFR); -#if (WMOPS) - fwc (); /* function worst case */ -#endif } else { @@ -297,30 +242,23 @@ index = *parm++; move16 (); - gain_pit = d_gain_pitch (index, bfi, state, prev_bf, rxdtx_ctrl); - move16 (); -#if (WMOPS) - fwc (); /* function worst case */ -#endif + gain_pit = d_gain_pitch (st, index, bfi, st->bf_state, st->prev_bf, + st->rxdtx_ctrl); /*-------------------------------------------------------* * - Decode innovative codebook. * *-------------------------------------------------------*/ - test (); logic16 (); - if ((rxdtx_ctrl & RX_SP_FLAG) != 0) + if ((st->rxdtx_ctrl & RX_SP_FLAG) != 0) { dec_10i40_35bits (parm, code); } else { /* Use pseudo noise for excitation when SP_flag == 0 */ - build_CN_code (code, &L_pn_seed_rx); + build_CN_code (code, &st->L_pn_seed_rx); } parm += 10; move16 (); -#if (WMOPS) - fwc (); /* function worst case */ -#endif /*-------------------------------------------------------* * - Add the pitch contribution to code[]. * @@ -338,9 +276,7 @@ code[i] = add (code[i], temp); move16 (); } -#if (WMOPS) - fwc (); /* function worst case */ -#endif + /* post processing of excitation elements */ test (); /* This test is not passed when SP_FLAG is 0 */ @@ -361,11 +297,8 @@ index = *parm++; move16 (); /* index of energy VQ */ - d_gain_code (index, code, L_SUBFR, &gain_code, bfi, state, prev_bf, - rxdtx_ctrl, i_subfr, rx_dtx_state); -#if (WMOPS) - fwc (); /* function worst case */ -#endif + d_gain_code (st, index, code, L_SUBFR, &gain_code, bfi, st->bf_state, + st->prev_bf, st->rxdtx_ctrl, i_subfr, st->rx_dtx_state); /*-------------------------------------------------------* * - Find the total excitation. * @@ -382,29 +315,22 @@ exc[i + i_subfr] = round (L_temp); move16 (); } -#if (WMOPS) - fwc (); /* function worst case */ -#endif - test (); if (sub (pit_sharp, 16384) > 0) { for (i = 0; i < L_SUBFR; i++) { excp[i] = add (excp[i], exc[i + i_subfr]); - move16 (); } agc2 (&exc[i_subfr], excp, L_SUBFR); - Syn_filt (Az, excp, &synth[i_subfr], L_SUBFR, mem_syn, 1); + Syn_filt (Az, excp, &synth[i_subfr], L_SUBFR, st->mem_syn, 1); } else { - Syn_filt (Az, &exc[i_subfr], &synth[i_subfr], L_SUBFR, mem_syn, 1); + Syn_filt (Az, &exc[i_subfr], &synth[i_subfr], L_SUBFR, + st->mem_syn, 1); } -#if (WMOPS) - fwc (); /* function worst case */ -#endif /* interpolated LPC parameters for next subframe */ Az += MP1; move16 (); } @@ -414,11 +340,8 @@ * -> shift to the left by L_FRAME exc[] * *--------------------------------------------------*/ - Copy (&old_exc[L_FRAME], &old_exc[0], PIT_MAX + L_INTERPOL); -#if (WMOPS) - fwc (); /* function worst case */ -#endif - prev_bf = bfi; move16 (); + Copy (&st->old_exc[L_FRAME], &st->old_exc[0], PIT_MAX + L_INTERPOL); + st->prev_bf = bfi; return; }