FreeCalypso > hg > gsm-codec-lib
view libgsmefr/dec_main.c @ 553:ebcf414b7d99
doc/TFO-transform: describe details for FRv1, both modes
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 07 Oct 2024 08:24:24 +0000 |
parents | 18866c0354ef |
children |
line wrap: on
line source
/* * This module contains our GSM EFR decoder main function, EFR_decode_params(), * that stands at the boundary between our public interface and the guts of * ETSI-based codec. */ #include "gsm_efr.h" #include "typedef.h" #include "namespace.h" #include "basic_op.h" #include "cnst.h" #include "codec.h" #include "sig_proc.h" #include "memops.h" #include "dec_state.h" #include "d_homing.h" /* These constants define the number of consecutive parameters that function decoder_homing_frame_test() checks */ #define WHOLE_FRAME 57 #define TO_FIRST_SUBFRAME 18 void EFR_decode_params(struct EFR_decoder_state *st, const int16_t *params, int bfi, int SID_flag, int TAF, int16_t *pcm_out) { Word16 *synth = st->synth_buf + M; Word16 Az_dec[AZ_SIZE]; Word16 i, temp; Word16 reset_flag; if (!bfi) /* BFI == 0, perform DHF check */ { if (st->reset_flag_old) /* Check for second and further successive DHF (to first subfr.) */ { reset_flag = decoder_homing_frame_test (params, TO_FIRST_SUBFRAME); } else { reset_flag = 0; } } else /* BFI==1, bypass DHF check (frame is taken as not being a DHF) */ { reset_flag = 0; } if (reset_flag && st->reset_flag_old) { /* Force the output to be the encoder homing frame pattern */ for (i = 0; i < L_FRAME; i++) { synth[i] = EHF_MASK; } } else { /* Synthesis */ Decoder_12k2 (st, bfi, params, synth, Az_dec, TAF, SID_flag); Post_Filter (st, synth, Az_dec); /* Post-filter */ for (i = 0; i < L_FRAME; i++) /* Upscale the 15 bit linear PCM to 16 bits, then truncate to 13 bits */ { temp = shl (synth[i], 1); synth[i] = temp & 0xfff8; } } /* else */ Copy (synth, pcm_out, L_FRAME); /* BFI == 0, perform check for first DHF (whole frame) */ if (!bfi && !st->reset_flag_old) { reset_flag = decoder_homing_frame_test (params, WHOLE_FRAME); } if (reset_flag) { /* Bring the decoder and receive DTX to the home state */ EFR_decoder_reset(st); } else { st->reset_flag_old = 0; } }