FreeCalypso > hg > gsmhr-codec-ref
diff homing.c @ 0:9008dbc8ca74
import original C code from GSM 06.06
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 14 Jun 2024 23:27:16 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homing.c Fri Jun 14 23:27:16 2024 +0000 @@ -0,0 +1,648 @@ +/************************************************************************** + * + * File Name: homing.c + * + * Purpose: + * This file contains the following functions: + * + * decoderHomingFrameTest() - checks if a frame of input speech + * parameters matches the Decoder Homing + * Frame pattern. + * + * decoderReset() - called by resetDec() to reset all of the state + * variables for the decoder + * + * encoderHomingFrameTest() - checks if a frame of input samples + * matches the Encoder Homing Frame pattern. + * + * encoderReset() - called by resetEnc() to reset all the state + * variables for the encoder. + * + * resetDec() - calls functions to reset the state variables for the + * decoder, and for the receive DTX and Comfort Noise. + * + * resetEnc() - calls functions to reset the state variables for the + * encoder and VAD, and for the transmit DTX and + * Comfort Noise. + * + * dtxResetTx() - called by resetEnc() to reset all of the transmit + * DTX and Comfort Noise state variables + * + * dtxResetRx() - called by resetDec() to reset all of the receive + * DTX and Comfort Noise state variables + * + **************************************************************************/ + +/*_________________________________________________________________________ + | | + | Include Files | + |_________________________________________________________________________| +*/ + +#include "typedefs.h" +#include "vad.h" +#include "dtx.h" +#include "homing.h" + +/*_________________________________________________________________________ + | | + | Local Defines | + |_________________________________________________________________________| +*/ + +#define EHF_MASK 0x0008 /* Encoder Homing Frame pattern */ +#define LMAX 142 /* largest lag (integer sense) */ +#define CG_INT_MACS 6 /* Number of multiply-accumulates in + * one interpolation */ +#define NUM_CLOSED 3 /* maximum number of lags searched */ +#define LPCSTARTINDEX 25 /* where the LPC analysis window + * starts */ +#define INBUFFSZ LPCSTARTINDEX + A_LEN /* input buffer size */ + + +#define LTP_LEN 147 /* maximum ltp lag */ +#define LSMAX (LMAX + CG_INT_MACS/2) +#define HNW_BUFF_LEN LSMAX + + +/*************************************************************************** + * + * FUNCTION NAME: decoderHomingFrameTest + * + * PURPOSE: + * Checks if a frame of input speech parameters matches the Decoder + * Homing Frame pattern, which is: + * + * parameter decimal value hexidecimal value + * --------- ------------- ----------------- + * R0 0 0x0000 + * LPC1 881 0x0371 + * LPC2 350 0x015E + * LPC3 195 0x00c3 + * INT_LPC 1 0x0001 + * MODE 0 0x0000 + * CODE1_1 71 0x0047 + * CODE2_1 74 0x004a + * GSP0_1 0 0x0000 + * CODE1_2 9 0x0009 + * CODE2_2 38 0x0026 + * GSP0_2 7 0x0007 + * CODE1_3 0 0x0000 + * CODE2_3 0 0x0000 + * GSP0_3 0 0x0000 + * CODE1_4 0 0x0000 + * CODE2_4 0 0x0000 + * GSP0_4 0 0x0000 + * + * INPUT: + * pswSpeechPara[] - one frame of speech parameters + * in decoder input format + * + * iLastPara - the number of consecutive parameters in + * pswSpeechPara[] to match. + * + * OUTPUT: + * None + * + * RETURN: + * 0 input frame does not match the Decoder Homing Frame pattern. + * 1 input frame matches the Decoder Homing Frame pattern. + * + * REFERENCES: Sub-clause 10 of GSM Recomendation 06.02 + * + * KEYWORDS: + * pswSpeechPara + **************************************************************************/ + +int decoderHomingFrameTest(Shortword pswSpeechPara[], int iLastPara) +{ + /* the n[] array contains the number of bits in each speech parameter */ + static int n[] = {5, 11, 9, 8, 1, 2, 7, 7, 5, 7, 7, 5, 7, 7, 5, 7, 7, 5}; + + static Shortword dhf_mask[] = + { + 0x0000, /* R0 */ + 0x0371, /* LPC1 */ + 0x015E, /* LPC2 */ + 0x00c3, /* LPC3 */ + 0x0001, /* INT_LPC */ + 0x0000, /* MODE */ + 0x0047, /* CODE1_1 */ + 0x004a, /* CODE2_1 */ + 0x0000, /* GSP0_1 */ + 0x0009, /* CODE1_2 */ + 0x0026, /* CODE2_2 */ + 0x0007, /* GSP0_2 */ + 0x0000, /* CODE1_3 */ + 0x0000, /* CODE2_3 */ + 0x0000, /* GSP0_3 */ + 0x0000, /* CODE1_4 */ + 0x0000, /* CODE2_4 */ + 0x0000 /* GSP0_4 */ + }; + + int i; + int j; + + for (i = 0; i < iLastPara; i++) + { + j = ((pswSpeechPara[i] & ~(~0 << n[i])) ^ dhf_mask[i]); + if (j) + break; + } + + return !j; +} + + +/*************************************************************************** + * + * FUNCTION NAME: decoderReset + * + * PURPOSE: + * resets all of the state variables for the decoder + * + * INPUT: + * None + * + * OUTPUT: + * None + * + * RETURN: + * None + * + * REFERENCES: Sub-clause 10 of GSM Recomendation 06.02 + * + * KEYWORDS: + **************************************************************************/ + +void decoderReset(void) +{ +/*_________________________________________________________________________ + | | + | External declarations for decoder variables which need to be reset | + |_________________________________________________________________________| +*/ + + /* variables defined in sp_dec.c */ + /* ----------------------------- */ + + extern Shortword gswPostFiltAgcGain, + gpswPostFiltStateNum[NP], + gpswPostFiltStateDenom[NP], + swPostEmphasisState, + pswSynthFiltState[NP], + pswOldFrmKsDec[NP], + pswOldFrmAsDec[NP], + pswOldFrmPFNum[NP], + pswOldFrmPFDenom[NP], + swOldR0Dec, + pswLtpStateBaseDec[LTP_LEN + S_LEN], + pswPPreState[LTP_LEN + S_LEN]; + + extern Shortword swMuteFlagOld; /* error concealment */ + + + /* variables defined in err_conc.c *//* error concealment */ + /* ------------------------------- *//* error concealment */ + + extern Longword plSubfrEnergyMem[4]; /* error concealment */ + extern Shortword swLevelMem[4], + lastR0, /* error concealment */ + pswLastGood[18], /* error concealment */ + swState, + swLastFlag; /* error concealment */ + +/*_________________________________________________________________________ + | | + | Automatic Variables | + |_________________________________________________________________________| +*/ + + int i; + +/*_________________________________________________________________________ + | | + | Executable code | + |_________________________________________________________________________| +*/ + + /* reset all the decoder state variables */ + /* ------------------------------------- */ + + swOldR0Dec = 0; + + gswPostFiltAgcGain = 0; + + swPostEmphasisState = 0; + + for (i = 0; i < NP; i++) + { + gpswPostFiltStateNum[i] = 0; + gpswPostFiltStateDenom[i] = 0; + pswSynthFiltState[i] = 0; + pswOldFrmKsDec[i] = 0; + pswOldFrmAsDec[i] = 0; + pswOldFrmPFNum[i] = 0; + pswOldFrmPFDenom[i] = 0; + } + + for (i = 0; i < (LTP_LEN + S_LEN); i++) + { + pswLtpStateBaseDec[i] = 0; + pswPPreState[i] = 0; + } + + + /* reset all the error concealment state variables */ + /* ----------------------------------------------- */ + + swMuteFlagOld = 0; + + lastR0 = 0; + swState = 7; + swLastFlag = 0; + for (i = 0; i < 3; i++) + { + plSubfrEnergyMem[i] = 80; + swLevelMem[i] = -72; + } + for (i = 0; i < 18; i++) + { + pswLastGood[i] = 0; + } + + +} + +/*************************************************************************** + * + * FUNCTION NAME: encoderHomingFrameTest + * + * PURPOSE: + * Checks if a frame of input samples matches the Encoder Homing Frame + * pattern, which is 0x0008 for all 160 samples in the frame. + * + * INPUT: + * pswSpeech[] one frame of speech samples + * + * OUTPUT: + * None + * + * RETURN: + * 0 input frame does not match the Encoder Homing Frame pattern. + * 1 input frame matches the Encoder Homing Frame pattern. + * + * REFERENCES: Sub-clause 10 of GSM Recomendation 06.02 + * + * KEYWORDS: + * pswSpeech + **************************************************************************/ + +int encoderHomingFrameTest(Shortword pswSpeech[]) +{ + int i; + Shortword j; + + for (i = 0; i < F_LEN; i++) + { + j = pswSpeech[i] ^ EHF_MASK; + if (j) + break; + } + + return !j; +} + +/*************************************************************************** + * + * FUNCTION NAME: encoderReset + * + * PURPOSE: + * resets all of the state variables for the encoder + * + * INPUT: + * None + * + * OUTPUT: + * None + * + * RETURN: + * None + * + * REFERENCES: Sub-clause 10 of GSM Recomendation 06.02 + * + * KEYWORDS: + **************************************************************************/ + +void encoderReset(void) +{ + +/*_________________________________________________________________________ + | | + | External declarations for encoder variables which need to be reset | + |_________________________________________________________________________| +*/ + + /* variables defined in sp_enc.c */ + /* ----------------------------- */ + + extern Shortword swOldR0; + extern Shortword swOldR0Index; + + extern struct NormSw psnsWSfrmEngSpace[]; + + extern Shortword pswHPFXState[]; + extern Shortword pswHPFYState[]; + extern Shortword pswOldFrmKs[]; + extern Shortword pswOldFrmAs[]; + extern Shortword pswOldFrmSNWCoefs[]; + extern Shortword pswWgtSpeechSpace[]; + + extern Shortword pswSpeech[]; /* input speech */ + + extern Shortword swPtch; + + + /* variables defined in sp_frm.c */ + /* ----------------------------- */ + + extern Shortword pswAnalysisState[NP]; + + extern Shortword pswWStateNum[NP], + pswWStateDenom[NP]; + + + /* variables defined in sp_sfrm.c */ + /* ------------------------------ */ + + extern Shortword pswLtpStateBase[LTP_LEN + S_LEN]; + extern Shortword pswHState[NP]; + extern Shortword pswHNWState[HNW_BUFF_LEN]; + +/*_________________________________________________________________________ + | | + | Automatic Variables | + |_________________________________________________________________________| +*/ + + int i; + +/*_________________________________________________________________________ + | | + | Executable code | + |_________________________________________________________________________| +*/ + + /* reset all the encoder state variables */ + /* ------------------------------------- */ + + swOldR0Index = 0; + swOldR0 = 0; + + for (i = 0; i < 2 * N_SUB; i++) + { + psnsWSfrmEngSpace[i].man = 0; + psnsWSfrmEngSpace[i].sh = 0; + } + + for (i = 0; i < 4; i++) + pswHPFXState[i] = 0; + + for (i = 0; i < 8; i++) + pswHPFYState[i] = 0; + + for (i = 0; i < NP; i++) + { + pswOldFrmKs[i] = 0; + pswOldFrmAs[i] = 0; + pswOldFrmSNWCoefs[i] = 0; + pswAnalysisState[i] = 0; + pswWStateNum[i] = 0; + pswWStateDenom[i] = 0; + pswHState[i] = 0; + } + + for (i = 0; i < (F_LEN + LMAX + CG_INT_MACS / 2); i++) + pswWgtSpeechSpace[i] = 0; + + for (i = 0; i < INBUFFSZ; i++) + pswSpeech[i] = 0; + + for (i = 0; i < (LTP_LEN + S_LEN); i++) + pswLtpStateBase[i] = 0; + + for (i = 0; i < HNW_BUFF_LEN; i++) + pswHNWState[i] = 0; + + swPtch = 1; +} + +/*************************************************************************** + * + * FUNCTION NAME: resetDec + * + * PURPOSE: + * resets all of the state variables for the decoder, and for the + * receive DTX and Comfort Noise. + * + * INPUT: + * None + * + * OUTPUT: + * None + * + * RETURN: + * None + * + * REFERENCES: Sub-clause 10 of GSM Recomendation 06.02 + * + * KEYWORDS: + **************************************************************************/ + +void resetDec(void) +{ + decoderReset(); /* reset all the state variables in + * the speech decoder */ + dtxResetRx(); /* reset all the receive DTX and CN + * state variables */ +} + +/*************************************************************************** + * + * FUNCTION NAME: resetEnc + * + * PURPOSE: + * resets all of the state variables for the encoder and VAD, and for + * the transmit DTX and Comfort Noise. + * + * INPUT: + * None + * + * OUTPUT: + * None + * + * RETURN: + * None + * + * REFERENCES: Sub-clause 10 of GSM Recomendation 06.02 + * + * KEYWORDS: + **************************************************************************/ + +void resetEnc(void) +{ + + encoderReset(); /* reset all the state variables in + * the speech encoder */ + vad_reset(); /* reset all the VAD state variables */ + + dtxResetTx(); /* reset all the transmit DTX and CN + * state variables */ +} + +/*************************************************************************** + * + * FUNCTION NAME: dtxResetTx + * + * PURPOSE: + * reset all the transmit DTX and CN state variables + * + * INPUT: + * None + * + * OUTPUT: + * None + * + * RETURN: + * None + * + * REFERENCES: Sub-clause 10 of GSM Recomendation 06.02 + * + * KEYWORDS: + **************************************************************************/ + +void dtxResetTx(void) +{ + +/*_________________________________________________________________________ + | | + | External declarations for encoder variables which need to be reset | + |_________________________________________________________________________| +*/ + + /* variables defined in sp_enc.c */ + /* ----------------------------- */ + + extern Shortword swTxGsHistPtr; + + + /* variables defined in dtx.c */ + /* -------------------------- */ + + extern Shortword swVadFrmCnt; /* Indicates the number of sequential + * frames where VAD == 0 */ + extern short int siUpdPointer; + extern Shortword swNElapsed; + +/*_________________________________________________________________________ + | | + | Automatic Variables | + |_________________________________________________________________________| +*/ + + +/*_________________________________________________________________________ + | | + | Executable code | + |_________________________________________________________________________| +*/ + + /* reset all the transmit DTX and CN state variables */ + /* ------------------------------------------------- */ + + swTxGsHistPtr = 0; + + swVadFrmCnt = 0; + + siUpdPointer = 0; + + swNElapsed = 50; + +} + +/*************************************************************************** + * + * FUNCTION NAME: dtxResetRx + * + * PURPOSE: + * reset all the receive DTX and CN state variables + * + * INPUT: + * None + * + * OUTPUT: + * None + * + * RETURN: + * None + * + * REFERENCES: Sub-clause 10 of GSM Recomendation 06.02 + * + * KEYWORDS: + **************************************************************************/ + +void dtxResetRx(void) +{ + +/*_________________________________________________________________________ + | | + | External declarations for encoder variables which need to be reset | + |_________________________________________________________________________| +*/ + + /* variables defined in sp_dec.c */ + /* ----------------------------- */ + + extern Shortword swRxDTXState; + extern Shortword swDecoMode; + extern Shortword swDtxMuting; + extern Shortword swDtxBfiCnt; + + extern Shortword swOldR0IndexDec; + + extern Shortword swRxGsHistPtr; + extern Longword pL_RxGsHist[(OVERHANG - 1) * N_SUB]; + + +/*_________________________________________________________________________ + | | + | Automatic Variables | + |_________________________________________________________________________| +*/ + + int i; + + +/*_________________________________________________________________________ + | | + | Executable code | + |_________________________________________________________________________| +*/ + + /* reset all the receive DTX and CN state variables */ + /* ------------------------------------------------ */ + + swRxDTXState = CNINTPER - 1; + swDecoMode = SPEECH; + swDtxMuting = 0; + swDtxBfiCnt = 0; + + swOldR0IndexDec = 0; + + swRxGsHistPtr = 0; + + for (i = 0; i < (OVERHANG - 1) * N_SUB; i++) + pL_RxGsHist[i] = 0; + +}