Files
rtphone/src/libs/gsmhr/gsmhr.h
2018-06-05 11:05:37 +03:00

805 lines
28 KiB
C++

#ifndef __GSM_HR_CODEC_H
#define __GSM_HR_CODEC_H
#include <stdint.h>
#include "gsmhr_sp_rom.h"
namespace GsmHr
{
#define DATE "August 8, 1996 "
#define VERSION "Version 4.2 "
#define LW_SIGN (long)0x80000000 /* sign bit */
#define LW_MIN (long)0x80000000
#define LW_MAX (long)0x7fffffff
#define SW_SIGN (short)0x8000 /* sign bit for int16_t type */
#define SW_MIN (short)0x8000 /* smallest Ram */
#define SW_MAX (short)0x7fff /* largest Ram */
#define SPEECH 1
#define CNIFIRSTSID 2
#define PN_INIT_SEED (int32_t)0x1091988L /* initial seed for Comfort
* noise pn-generator */
#define CNICONT 3
#define CNIBFI 4
#define VALIDSID 11
#define INVALIDSID 22
#define GOODSPEECH 33
#define UNUSABLE 44
typedef short int int16_tRom; /* 16 bit ROM data (sr*) */
typedef long int int32_tRom; /* 32 bit ROM data (L_r*) */
struct NormSw
{ /* normalized int16_t fractional
* number snr.man precedes snr.sh (the
* shift count)i */
int16_t man; /* "mantissa" stored in 16 bit
* location */
int16_t sh; /* the shift count, stored in 16 bit
* location */
};
struct QuantList
{
/* structure which points to the beginning of a block of candidate vq
* vectors. It also stores the residual error for each vector. */
int iNum; /* total number in list */
int iRCIndex; /* an index to the first vector of the
* block */
int16_t pswPredErr[PREQ1_NUM_OF_ROWS]; /* PREQ1 is the biggest block */
};
/* Global constants *
********************/
#define NP 10 /* order of the lpc filter */
#define N_SUB 4 /* number of subframes */
#define F_LEN 160 /* number of samples in a frame */
#define S_LEN 40 /* number of samples in a subframe */
#define A_LEN 170 /* LPC analysis length */
#define OS_FCTR 6 /* maximum LTP lag oversampling
* factor */
#define OVERHANG 8 /* vad parameter */
#define strStr strStr16
#define LTP_LEN 147 /* 147==0x93 length of LTP history */
#define CNINTPER 12
class Codec
{
protected:
// From typedefs.h
int giFrmCnt; /* 0,1,2,3,4..... */
int giSfrmCnt = 0; /* 0,1,2,3 */
int giDTXon = 1; /* DTX Mode on/off */
// From err_conc.c
int32_t plSubfrEnergyMem[4];
int16_t swLevelMem[4],
lastR0,
pswLastGood[18],
swState,
swLastFlag;
// From sp_dec.c
int16_t 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];
int16_t swMuteFlagOld; /* error concealment */
int16_t swRxDTXState = CNINTPER - 1; /* DTX State at the rx.
* Modulo */
int16_t swDecoMode = SPEECH;
int16_t swDtxMuting = 0;
int16_t swDtxBfiCnt = 0;
int16_t swOldR0IndexDec = 0;
int16_t swRxGsHistPtr = 0;
int32_t pL_RxGsHist[(OVERHANG - 1) * N_SUB];
int16_t swR0Dec;
int16_t swVoicingMode, /* MODE */
pswVq[3], /* LPC1, LPC2, LPC3 */
swSi, /* INT_LPC */
swEngyRShift; /* for use by spectral postfilter */
int16_t swR0NewCN; /* DTX mode */
int32_tRom ppLr_gsTable[4][32]; /* DTX mode */
int16_t
*pswLtpStateOut = &pswLtpStateBaseDec[LTP_LEN],
pswSythAsSpace[NP * N_SUB],
pswPFNumAsSpace[NP * N_SUB],
pswPFDenomAsSpace[NP * N_SUB],
*ppswSynthAs[N_SUB] = {
&pswSythAsSpace[0],
&pswSythAsSpace[10],
&pswSythAsSpace[20],
&pswSythAsSpace[30],
},
*ppswPFNumAs[N_SUB] = {
&pswPFNumAsSpace[0],
&pswPFNumAsSpace[10],
&pswPFNumAsSpace[20],
&pswPFNumAsSpace[30],
},
*ppswPFDenomAs[N_SUB] = {
&pswPFDenomAsSpace[0],
&pswPFDenomAsSpace[10],
&pswPFDenomAsSpace[20],
&pswPFDenomAsSpace[30],
};
int16_tRom
psrSPFDenomWidenCf[NP] = {
0x6000, 0x4800, 0x3600, 0x2880, 0x1E60,
0x16C8, 0x1116, 0x0CD0, 0x099C, 0x0735,
};
int32_t L_RxPNSeed; /* DTX mode */
int16_t swRxDtxGsIndex; /* DTX mode */
// From dtx.c
int16_t swVadFrmCnt = 0; /* Indicates the number of sequential
* frames where VAD == 0 */
short int siUpdPointer = 0;
int16_t swNElapsed = 50;
int32_t pL_GsHist[N_SUB * (OVERHANG - 1)];
/* history of unquantized parameters */
int32_t pL_R0Hist[OVERHANG];
int32_t ppL_CorrHist[OVERHANG][NP + 1];
/* quantized reference parameters */
int16_t swQntRefR0,
swRefGsIndex;
int piRefVqCodewds[3];
/* handling of short speech bursts */
int16_t swShortBurst;
/* state value of random generator */
int32_t L_TxPNSeed;
int16_t swR0OldCN;
int32_t pL_OldCorrSeq[NP + 1],
pL_NewCorrSeq[NP + 1],
pL_CorrSeq[NP + 1];
// From sp_enc.c
int16_t swTxGsHistPtr = 0;
int16_t pswCNVSCode1[N_SUB],
pswCNVSCode2[N_SUB],
pswCNGsp0Code[N_SUB],
pswCNLpc[3],
swCNR0;
int16_t pswAnalysisState[NP];
int16_t pswWStateNum[NP],
pswWStateDenom[NP];
int16_t swLastLag;
/*_________________________________________________________________________
| |
| Other External Variables |
|_________________________________________________________________________|
*/
int16_tRom *psrTable; /* points to correct table of
* vectors */
int iLimit; /* accessible to all in this file
* and to lpcCorrQntz() in dtx.c */
int iLow; /* the low element in this segment */
int iThree; /* boolean, is this a three element
* vector */
int iWordHalfPtr; /* points to the next byte */
int iWordPtr; /* points to the next word to be */
// from vad.c
int16_t
pswRvad[9],
swNormRvad,
swPt_sacf,
swPt_sav0,
swE_thvad,
swM_thvad,
swAdaptCount,
swBurstCount,
swHangCount,
swOldLagCount,
swVeryOldLagCount,
swOldLag;
int32_t
pL_sacf[27],
pL_sav0[36],
L_lastdm;
public:
// From VAD
void vad_reset(void);
void vad_algorithm
(
int32_t pL_acf[9],
int16_t swScaleAcf,
int16_t pswRc[4],
int16_t swPtch,
int16_t *pswVadFlag
);
void energy_computation
(
int32_t pL_acf[],
int16_t swScaleAcf,
int16_t pswRvad[],
int16_t swNormRvad,
int16_t *pswM_pvad,
int16_t *pswE_pvad,
int16_t *pswM_acf0,
int16_t *pswE_acf0
);
void average_acf
(
int32_t pL_acf[],
int16_t swScaleAcf,
int32_t pL_av0[],
int32_t pL_av1[]
);
void predictor_values
(
int32_t pL_av1[],
int16_t pswRav1[],
int16_t *pswNormRav1
);
void schur_recursion
(
int32_t pL_av1[],
int16_t pswVpar[]
);
void step_up
(
int16_t swNp,
int16_t pswVpar[],
int16_t pswAav1[]
);
void compute_rav1
(
int16_t pswAav1[],
int16_t pswRav1[],
int16_t *pswNormRav1
);
void spectral_comparison
(
int16_t pswRav1[],
int16_t swNormRav1,
int32_t pL_av0[],
int16_t *pswStat
);
void tone_detection
(
int16_t pswRc[4],
int16_t *pswTone
);
void threshold_adaptation
(
int16_t swStat,
int16_t swPtch,
int16_t swTone,
int16_t pswRav1[],
int16_t swNormRav1,
int16_t swM_pvad,
int16_t swE_pvad,
int16_t swM_acf0,
int16_t swE_acf0,
int16_t pswRvad[],
int16_t *pswNormRvad,
int16_t *pswM_thvad,
int16_t *pswE_thvad
);
void vad_decision
(
int16_t swM_pvad,
int16_t swE_pvad,
int16_t swM_thvad,
int16_t swE_thvad,
int16_t *pswVvad
);
void vad_hangover
(
int16_t swVvad,
int16_t *pswVadFlag
);
void periodicity_update
(
int16_t pswLags[4],
int16_t *pswPtch
);
// From err_conc.h
void para_conceal_speech_decoder(int16_t pswErrorFlag[],
int16_t pswSpeechPara[], int16_t *pswMutePermit);
int16_t level_calc(int16_t swInd, int32_t *pl_en);
void level_estimator(int16_t update, int16_t *pswLevelMean,
int16_t *pswLevelMax,
int16_t pswDecodedSpeechFrame[]);
void signal_conceal_sub(int16_t pswPPFExcit[],
int16_t ppswSynthAs[], int16_t pswSynthFiltState[],
int16_t pswLtpStateOut[], int16_t pswPPreState[],
int16_t swLevelMean, int16_t swLevelMax,
int16_t swErrorFlag1, int16_t swMuteFlagOld,
int16_t *pswMuteFlag, int16_t swMutePermit);
void speechDecoder(int16_t pswParameters[],
int16_t pswDecodedSpeechFrame[]);
void aFlatRcDp(int32_t *pL_R, int16_t *pswRc);
void b_con(int16_t swCodeWord, short siNumBits,
int16_t pswVectOut[]);
void fp_ex(int16_t swOrigLagIn, int16_t pswLTPState[]);
int16_t g_corr1(int16_t *pswIn, int32_t *pL_out);
int16_t g_corr1s(int16_t pswIn[], int16_t swEngyRShft,
int32_t *pL_out);
void getSfrmLpc(short int siSoftInterpolation,
int16_t swPrevR0, int16_t swNewR0,
int16_t pswPrevFrmKs[],
int16_t pswPrevFrmAs[],
int16_t pswPrevFrmPFNum[],
int16_t pswPrevFrmPFDenom[],
int16_t pswNewFrmKs[],
int16_t pswNewFrmAs[],
int16_t pswNewFrmPFNum[],
int16_t pswNewFrmPFDenom[],
struct NormSw *psnsSqrtRs,
int16_t *ppswSynthAs[],
int16_t *ppswPFNumAs[],
int16_t *ppswPFDenomAs[]);
void get_ipjj(int16_t swLagIn,
int16_t *pswIp, int16_t *pswJj);
short int interpolateCheck(int16_t pswRefKs[],
int16_t pswRefCoefsA[],
int16_t pswOldCoefsA[],
int16_t pswNewCoefsA[],
int16_t swOldPer,
int16_t swNewPer,
int16_t swRq,
struct NormSw *psnsSqrtRsOut,
int16_t pswCoefOutA[]);
void lpcFir(int16_t pswInput[], int16_t pswCoef[],
int16_t pswState[], int16_t pswFiltOut[]);
void lpcIir(int16_t pswInput[], int16_t pswCoef[],
int16_t pswState[], int16_t pswFiltOut[]);
void lpcIrZsIir(int16_t pswCoef[], int16_t pswFiltOut[]);
void lpcZiIir(int16_t pswCoef[], int16_t pswState[],
int16_t pswFiltOut[]);
void lpcZsFir(int16_t pswInput[], int16_t pswCoef[],
int16_t pswFiltOut[]);
void lpcZsIir(int16_t pswInput[], int16_t pswCoef[],
int16_t pswFiltOut[]);
void lpcZsIirP(int16_t pswCommonIO[], int16_t pswCoef[]);
int16_t r0BasedEnergyShft(int16_t swR0Index);
short rcToADp(int16_t swAscale, int16_t pswRc[],
int16_t pswA[]);
void rcToCorrDpL(int16_t swAshift, int16_t swAscale,
int16_t pswRc[], int32_t pL_R[]);
void res_eng(int16_t pswReflecCoefIn[], int16_t swRq,
struct NormSw *psnsSqrtRsOut);
void rs_rr(int16_t pswExcitation[], struct NormSw snsSqrtRs,
struct NormSw *snsSqrtRsRr);
void rs_rrNs(int16_t pswExcitation[], struct NormSw snsSqrtRs,
struct NormSw *snsSqrtRsRr);
int16_t scaleExcite(int16_t pswVect[],
int16_t swErrTerm, struct NormSw snsRS,
int16_t pswScldVect[]);
int16_t sqroot(int32_t L_SqrtIn);
void v_con(int16_t pswBVects[], int16_t pswOutVect[],
int16_t pswBitArray[], short int siNumBVctrs);
void a_sst(int16_t swAshift, int16_t swAscale,
int16_t pswDirectFormCoefIn[],
int16_t pswDirectFormCoefOut[]);
int16_t agcGain(int16_t pswStateCurr[],
struct NormSw snsInSigEnergy, int16_t swEngyRShft);
void pitchPreFilt(int16_t pswExcite[],
int16_t swRxGsp0,
int16_t swRxLag, int16_t swUvCode,
int16_t swSemiBeta, struct NormSw snsSqrtRs,
int16_t pswExciteOut[],
int16_t pswPPreState[]);
void spectralPostFilter(int16_t pswSPFIn[],
int16_t pswNumCoef[],
int16_t pswDenomCoef[], int16_t pswSPFOut[]);
// From dtx.c
void avgCNHist(int32_t pL_R0History[],
int32_t ppL_CorrHistory[OVERHANG][NP + 1],
int32_t *pL_AvgdR0,
int32_t pL_AvgdCorrSeq[]);
void avgGsHistQntz(int32_t pL_GsHistory[], int32_t *pL_GsAvgd);
int16_t swComfortNoise(int16_t swVadFlag,
int32_t L_UnqntzdR0, int32_t *pL_UnqntzdCorr);
int16_t getPnBits(int iBits, int32_t *L_PnSeed);
int16_t gsQuant(int32_t L_GsIn, int16_t swVoicingMode);
void updateCNHist(int32_t L_UnqntzdR0,
int32_t *pL_UnqntzdCorr,
int32_t pL_R0Hist[],
int32_t ppL_CorrHist[OVERHANG][NP + 1]);
void lpcCorrQntz(int32_t pL_CorrelSeq[],
int16_t pswFinalRc[],
int piVQCodewds[]);
int32_t linInterpSid(int32_t L_New, int32_t L_Old, int16_t swDtxState);
int16_t linInterpSidShort(int16_t swNew,
int16_t swOld,
int16_t swDtxState);
void rxInterpR0Lpc(int16_t *pswOldKs, int16_t *pswNewKs,
int16_t swRxDTXState,
int16_t swDecoMode, int16_t swFrameType);
// From sp_frm.c
void iir_d(int16_t pswCoeff[], int16_t pswIn[],
int16_t pswXstate[],
int16_t pswYstate[],
int npts, int shifts,
int16_t swPreFirDownSh,
int16_t swFinalUpShift);
void filt4_2nd(int16_t pswCoeff[],
int16_t pswIn[],
int16_t pswXstate[],
int16_t pswYstate[],
int npts,
int shifts);
void initPBarVBarL(int32_t pL_PBarFull[],
int16_t pswPBar[],
int16_t pswVBar[]);
void initPBarFullVBarFullL(int32_t pL_CorrelSeq[],
int32_t pL_PBarFull[],
int32_t pL_VBarFull[]);
int16_t aflatRecursion(int16_t pswQntRc[],
int16_t pswPBar[],
int16_t pswVBar[],
int16_t *ppswPAddrs[],
int16_t *ppswVAddrs[],
int16_t swSegmentOrder);
void aflatNewBarRecursionL(int16_t pswQntRc[],
int iSegment,
int32_t pL_PBar[],
int32_t pL_VBar[],
int16_t pswPBar[],
int16_t pswVBar[]);
void setupPreQ(int iSeg, int iVector);
void setupQuant(int iSeg, int iVector);
void getNextVec(int16_t pswRc[]);
void aflat(int16_t pswSpeechToLPC[],
int piR0Index[],
int16_t pswFinalRc[],
int piVQCodewds[],
int16_t swPtch,
int16_t *pswVadFlag,
int16_t *pswSP);
int16_t fnExp2(int32_t L_Input);
int16_t fnLog2(int32_t L_Input);
void weightSpeechFrame(int16_t pswSpeechFrm[],
int16_t pswWNumSpace[],
int16_t pswWDenomSpace[],
int16_t pswWSpeechBuffBase[]);
void getSfrmLpcTx(int16_t swPrevR0, int16_t swNewR0,
int16_t pswPrevFrmKs[],
int16_t pswPrevFrmAs[],
int16_t pswPrevFrmSNWCoef[],
int16_t pswNewFrmKs[],
int16_t pswNewFrmAs[],
int16_t pswNewFrmSNWCoef[],
int16_t pswHPFSpeech[],
short *pswSoftInterp,
struct NormSw *psnsSqrtRs,
int16_t ppswSynthAs[][NP],
int16_t ppswSNWCoefAs[][NP]);
short int fnBest_CG(int16_t pswCframe[],
int16_t pswGframe[],
int16_t *pswCmaxSqr,
int16_t *pswGmax,
short int siNumPairs);
short compResidEnergy(int16_t pswSpeech[],
int16_t ppswInterpCoef[][NP],
int16_t pswPreviousCoef[],
int16_t pswCurrentCoef[],
struct NormSw psnsSqrtRs[]);
int16_t r0Quant(int32_t L_UnqntzdR0);
int16_t cov32(int16_t pswIn[],
int32_t pppL_B[NP][NP][2],
int32_t pppL_F[NP][NP][2],
int32_t pppL_C[NP][NP][2],
int32_t *pL_R0,
int32_t pL_VadAcf[],
int16_t *pswVadScalAuto);
int32_t flat(int16_t pswSpeechIn[],
int16_t pswRc[],
int *piR0Inx,
int32_t pL_VadAcf[],
int16_t *pswVadScalAuto);
void openLoopLagSearch(int16_t pswWSpeech[],
int16_t swPrevR0Index,
int16_t swCurrR0Index,
int16_t *psiUVCode,
int16_t pswLagList[],
int16_t pswNumLagList[],
int16_t pswPitchBuf[],
int16_t pswHNWCoefBuf[],
struct NormSw psnsWSfrmEng[],
int16_t pswVadLags[],
int16_t swSP);
int16_t getCCThreshold(int16_t swRp0,
int16_t swCC,
int16_t swG);
void pitchLags(int16_t swBestIntLag,
int16_t pswIntCs[],
int16_t pswIntGs[],
int16_t swCCThreshold,
int16_t pswLPeaksSorted[],
int16_t pswCPeaksSorted[],
int16_t pswGPeaksSorted[],
int16_t *psiNumSorted,
int16_t *pswPitch,
int16_t *pswHNWCoef);
short CGInterpValid(int16_t swFullResLag,
int16_t pswCIn[],
int16_t pswGIn[],
int16_t pswLOut[],
int16_t pswCOut[],
int16_t pswGOut[]);
void CGInterp(int16_t pswLIn[],
short siNum,
int16_t pswCIn[],
int16_t pswGIn[],
short siLoIntLag,
int16_t pswCOut[],
int16_t pswGOut[]);
int16_t quantLag(int16_t swRawLag,
int16_t *psiCode);
void findBestInQuantList(struct QuantList psqlInList,
int iNumVectOut,
struct QuantList psqlBestOutList[]);
int16_t findPeak(int16_t swSingleResLag,
int16_t pswCIn[],
int16_t pswGIn[]);
void bestDelta(int16_t pswLagList[],
int16_t pswCSfrm[],
int16_t pswGSfrm[],
short int siNumLags,
short int siSfrmIndex,
int16_t pswLTraj[],
int16_t pswCCTraj[],
int16_t pswGTraj[]);
int16_t
maxCCOverGWithSign(int16_t pswCIn[],
int16_t pswGIn[],
int16_t *pswCCMax,
int16_t *pswGMax,
int16_t swNum);
void getNWCoefs(int16_t pswACoefs[],
int16_t pswHCoefs[]);
int16_t lagDecode(int16_t swDeltaLag);
};
// From mathdp31
extern int32_t L_mpy_ls(int32_t L_var2, int16_t var1);
extern int32_t L_mpy_ll(int32_t L_var1, int32_t L_var2);
extern short isSwLimit(int16_t swIn);
extern short isLwLimit(int32_t L_In);
// From mathhalf
/* addition */
/************/
extern int16_t add(int16_t var1, int16_t var2); /* 1 ops */
extern int16_t sub(int16_t var1, int16_t var2); /* 1 ops */
extern int32_t L_add(int32_t L_var1, int32_t L_var2); /* 2 ops */
extern int32_t L_sub(int32_t L_var1, int32_t L_var2); /* 2 ops */
/* multiplication */
/******************/
extern int16_t mult(int16_t var1, int16_t var2); /* 1 ops */
extern int32_t L_mult(int16_t var1, int16_t var2); /* 1 ops */
extern int16_t mult_r(int16_t var1, int16_t var2); /* 2 ops */
/* arithmetic shifts */
/*********************/
extern int16_t shr(int16_t var1, int16_t var2); /* 1 ops */
extern int16_t shl(int16_t var1, int16_t var2); /* 1 ops */
extern int32_t L_shr(int32_t L_var1, int16_t var2); /* 2 ops */
extern int32_t L_shl(int32_t L_var1, int16_t var2); /* 2 ops */
extern int16_t shift_r(int16_t var, int16_t var2); /* 2 ops */
extern int32_t L_shift_r(int32_t L_var, int16_t var2); /* 3 ops */
/* absolute value */
/*******************/
extern int16_t abs_s(int16_t var1); /* 1 ops */
extern int32_t L_abs(int32_t var1); /* 3 ops */
/* multiply accumulate */
/************************/
extern int32_t L_mac(int32_t L_var3,
int16_t var1, int16_t var2); /* 1 op */
extern int16_t mac_r(int32_t L_var3,
int16_t var1, int16_t var2); /* 2 op */
extern int32_t L_msu(int32_t L_var3,
int16_t var1, int16_t var2); /* 1 op */
extern int16_t msu_r(int32_t L_var3,
int16_t var1, int16_t var2); /* 2 op */
/* negation */
/*************/
extern int16_t negate(int16_t var1); /* 1 ops */
extern int32_t L_negate(int32_t L_var1); /* 2 ops */
/* Accumulator manipulation */
/****************************/
extern int32_t L_deposit_l(int16_t var1); /* 1 ops */
extern int32_t L_deposit_h(int16_t var1); /* 1 ops */
extern int16_t extract_l(int32_t L_var1); /* 1 ops */
extern int16_t extract_h(int32_t L_var1); /* 1 ops */
/* Round */
/*********/
extern int16_t round(int32_t L_var1); /* 1 ops */
/* Normalization */
/*****************/
extern int16_t norm_l(int32_t L_var1); /* 30 ops */
extern int16_t norm_s(int16_t var1); /* 15 ops */
/* Division */
/************/
extern int16_t divide_s(int16_t var1, int16_t var2); /* 18 ops */
/* Non-saturating instructions */
/*******************************/
extern int32_t L_add_c(int32_t L_Var1, int32_t L_Var2); /* 2 ops */
extern int32_t L_sub_c(int32_t L_Var1, int32_t L_Var2); /* 2 ops */
extern int32_t L_sat(int32_t L_var1); /* 4 ops */
extern int32_t L_macNs(int32_t L_var3,
int16_t var1, int16_t var2); /* 1 ops */
extern int32_t L_msuNs(int32_t L_var3,
int16_t var1, int16_t var2); /* 1 ops */
}
#endif