FreeCalypso > hg > gsm-codec-lib
view libgsmefr/dtx.h @ 242:f081a6850fb5
libgsmfrp: new refined implementation
The previous implementation exhibited the following defects,
which are now fixed:
1) The last received valid SID was cached forever for the purpose of
handling future invalid SIDs - we could have received some valid
SID ages ago, then lots of speech or NO_DATA, and if we then get
an invalid SID, we would resurrect the last valid SID from ancient
history - a bad design. In our new design, we handle invalid SID
based on the current state, much like BFI.
2) GSM 06.11 spec says clearly that after the second lost SID
(received BFI=1 && TAF=1 in CN state) we need to gradually decrease
the output level, rather than jump directly to emitting silence
frames - we previously failed to implement such logic.
3) Per GSM 06.12 section 5.2, Xmaxc should be the same in all 4 subframes
in a SID frame. What should we do if we receive an otherwise valid
SID frame with different Xmaxc? Our previous approach would
replicate this Xmaxc oddity in every subsequent generated CN frame,
which is rather bad. In our new design, the very first CN frame
(which can be seen as a transformation of the SID frame itself)
retains the original 4 distinct Xmaxc, but all subsequent CN frames
are based on the Xmaxc from the last subframe of the most recent SID.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 09 May 2023 05:16:31 +0000 |
parents | a18782a7d270 |
children |
line wrap: on
line source
/*************************************************************************** * * File Name: dtx.h * * Purpose: Contains the prototypes for all the functions of DTX. * Also contains definitions of constants used in DTX functions. * **************************************************************************/ #define PN_INITIAL_SEED 0x70816958L /* Pseudo noise generator seed value */ #define CN_INT_PERIOD 24 /* Comfort noise interpolation period (nbr of frames between successive SID updates in the decoder) */ #define DTX_HANGOVER 7 /* Period when SP=1 although VAD=0. Used for comfort noise averaging */ /* Frame classification constants */ #define VALID_SID_FRAME 1 #define INVALID_SID_FRAME 2 #define GOOD_SPEECH_FRAME 3 #define UNUSABLE_FRAME 4 /* Encoder DTX control flags */ #define TX_SP_FLAG 0x0001 #define TX_VAD_FLAG 0x0002 #define TX_HANGOVER_ACTIVE 0x0004 #define TX_PREV_HANGOVER_ACTIVE 0x0008 #define TX_SID_UPDATE 0x0010 #define TX_USE_OLD_SID 0x0020 /* Decoder DTX control flags */ #define RX_SP_FLAG 0x0001 #define RX_UPD_SID_QUANT_MEM 0x0002 #define RX_FIRST_SID_UPDATE 0x0004 #define RX_CONT_SID_UPDATE 0x0008 #define RX_LOST_SID_FRAME 0x0010 #define RX_INVALID_SID_FRAME 0x0020 #define RX_NO_TRANSMISSION 0x0040 #define RX_DTX_MUTING 0x0080 #define RX_PREV_DTX_MUTING 0x0100 #define RX_CNI_BFI 0x0200 #define RX_FIRST_SP_FLAG 0x0400 void reset_tx_dtx (struct EFR_encoder_state *st); /* Reset tx dtx variables */ void reset_rx_dtx (struct EFR_decoder_state *st); /* Reset rx dtx variables */ void tx_dtx ( struct EFR_encoder_state *st, Word16 VAD_flag ); void rx_dtx ( struct EFR_decoder_state *st, Word16 TAF, Word16 bfi, Word16 SID_flag ); void CN_encoding ( struct EFR_encoder_state *st, Word16 params[], Word16 txdtx_ctrl ); void update_lsf_history ( Word16 lsf1[M], Word16 lsf2[M], Word16 lsf_old[DTX_HANGOVER][M] ); void update_lsf_p_CN ( Word16 lsf_old[DTX_HANGOVER][M], Word16 lsf_p_CN[M] ); void aver_lsf_history ( Word16 lsf_old[DTX_HANGOVER][M], Word16 lsf1[M], Word16 lsf2[M], Word16 lsf_aver[M] ); void update_gain_code_history_tx ( struct EFR_encoder_state *st, Word16 new_gain_code ); void update_gain_code_history_rx ( struct EFR_decoder_state *st, Word16 new_gain_code ); Word16 compute_CN_excitation_gain ( Word16 res2[L_SUBFR] ); Word16 update_gcode0_CN ( Word16 gain_code_old_tx[4 * DTX_HANGOVER] ); Word16 aver_gain_code_history ( Word16 CN_excitation_gain, Word16 gain_code_old[4 * DTX_HANGOVER] ); void build_CN_code ( Word16 cod[], Word32 *seed ); Word16 pseudonoise ( Word32 *shift_reg, Word16 no_bits ); Word16 interpolate_CN_param ( Word16 old_param, Word16 new_param, Word16 rx_dtx_state ); void interpolate_CN_lsf ( Word16 lsf_old_CN[M], Word16 lsf_new_CN[M], Word16 lsf_interp_CN[M], Word16 rx_dtx_state );