sp_dec.c
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:157k
源码类别:

Symbian

开发平台:

Visual C++

  1. /*
  2.  * ===================================================================
  3.  *  TS 26.104
  4.  *  R99   V3.4.0 2002-02
  5.  *  REL-4 V4.3.0 2002-02
  6.  *  3GPP AMR Floating-point Speech Codec
  7.  * ===================================================================
  8.  *
  9.  */
  10. /*
  11.  * sp_dec.c
  12.  *
  13.  *
  14.  * Project:
  15.  *    AMR Floating-Point Codec
  16.  *
  17.  * Contains:
  18.  *    This module contains all the functions needed decoding AMR
  19.  *    encoder parameters to 16-bit speech samples
  20.  *
  21.  */
  22. /*
  23.  * include files
  24.  */
  25. #include "hlxclib/stdio.h"
  26. #include "hlxclib/stdlib.h"
  27. #include "hlxclib/memory.h"
  28. #include "hlxclib/math.h"
  29. #include "sp_dec.h"
  30. #include "rom_dec.h"
  31. /*
  32.  * Declare structure types
  33.  */
  34. enum DTXStateType
  35. {
  36.    SPEECH = 0, DTX, DTX_MUTE
  37. };
  38. /*
  39.  * Decoder memory structure
  40.  */
  41. typedef struct
  42. {
  43.    /* history vector of past synthesis speech energy */
  44.    Word32 frameEnergyHist[L_ENERGYHIST];
  45.    /* state flags */
  46.    Word16 bgHangover;   /* counter; number of frames after last speech frame */
  47. }Bgn_scdState;
  48. typedef struct
  49. {
  50.    Word32 hangCount;   /* counter; */
  51.    /* history vector of past synthesis speech energy */
  52.    Word32 cbGainHistory[L_CBGAINHIST];
  53.    Word16 hangVar;   /* counter; */
  54. }Cb_gain_averageState;
  55. typedef struct
  56. {
  57.    Word32 lsp_meanSave[M];   /* Averaged LSPs saved for efficiency  */
  58. }lsp_avgState;
  59. typedef struct
  60. {
  61.    Word32 past_r_q[M];   /* Past quantized prediction error, Q15 */
  62.    Word32 past_lsf_q[M];   /* Past dequantized lsfs, Q15 */
  63. }D_plsfState;
  64. typedef struct
  65. {
  66.    Word32 pbuf[5];
  67.    Word32 past_gain_pit;
  68.    Word32 prev_gp;
  69. }ec_gain_pitchState;
  70. typedef struct
  71. {
  72.    Word32 gbuf[5];
  73.    Word32 past_gain_code;
  74.    Word32 prev_gc;
  75. }ec_gain_codeState;
  76. typedef struct
  77. {
  78.    /*
  79.     * normal MA predictor memory, Q10
  80.     * (contains 20*log10(quaErr))
  81.     */
  82.    Word32 past_qua_en[4];
  83.    /*
  84.     * MA predictor memory for MR122 mode, Q10
  85.     * (contains log2(quaErr))
  86.     */
  87.    Word32 past_qua_en_MR122[4];
  88. }gc_predState;
  89. typedef struct
  90. {
  91.    Word32 gainMem[PHDGAINMEMSIZE];
  92.    Word32 prevCbGain;
  93.    Word32 prevState;
  94.    Word16 lockFull;
  95.    Word16 onset;
  96. }ph_dispState;
  97. typedef struct
  98. {
  99.    enum DTXStateType dtxGlobalState;   /* contains previous state */
  100.    Word32 log_en;
  101.    Word32 old_log_en;
  102.    Word32 pn_seed_rx;
  103.    Word32 lsp[M];
  104.    Word32 lsp_old[M];
  105.    Word32 lsf_hist[M * DTX_HIST_SIZE];
  106.    Word32 lsf_hist_mean[M * DTX_HIST_SIZE];
  107.    Word32 log_en_hist[DTX_HIST_SIZE];
  108.    Word32 true_sid_period_inv;
  109.    Word16 since_last_sid;
  110.    Word16 lsf_hist_ptr;
  111.    Word16 log_pg_mean;
  112.    Word16 log_en_hist_ptr;
  113.    Word16 log_en_adjust;
  114.    Word16 dtxHangoverCount;
  115.    Word16 decAnaElapsedCount;
  116.    Word16 sid_frame;
  117.    Word16 valid_data;
  118.    Word16 dtxHangoverAdded;
  119.    /* updated in main decoder */
  120.    Word16 data_updated;   /* marker to know if CNI data is ever renewed */
  121. }dtx_decState;
  122. typedef struct
  123. {
  124.    Word32 past_gain;
  125. }agcState;
  126. typedef struct
  127. {
  128.    /* Excitation vector */
  129.    Word32 old_exc[L_SUBFR + PIT_MAX + L_INTERPOL];
  130.    Word32 *exc;
  131.    Word32 lsp_old[M];
  132.    /* Filter's memory */
  133.    Word32 mem_syn[M];
  134.    /* pitch sharpening */
  135.    Word32 sharp;
  136.    Word32 old_T0;
  137.    /* Variable holding received ltpLag, used in background noise and BFI */
  138.    Word32 T0_lagBuff;
  139.    /* Variables for the source characteristic detector (SCD) */
  140.    Word32 inBackgroundNoise;
  141.    Word32 voicedHangover;
  142.    Word32 ltpGainHistory[9];
  143.    /* Memories for bad frame handling */
  144.    Word32 excEnergyHist[9];
  145.    Word16 prev_bf;
  146.    Word16 prev_pdf;
  147.    Word16 state;
  148.    Word16 nodataSeed;
  149.    Bgn_scdState * background_state;
  150.    Cb_gain_averageState * Cb_gain_averState;
  151.    lsp_avgState * lsp_avg_st;
  152.    D_plsfState * lsfState;
  153.    ec_gain_pitchState * ec_gain_p_st;
  154.    ec_gain_codeState * ec_gain_c_st;
  155.    gc_predState * pred_state;
  156.    ph_dispState * ph_disp_st;
  157.    dtx_decState * dtxDecoderState;
  158. }Decoder_amrState;
  159. typedef struct
  160. {
  161.    Word32 res2[L_SUBFR];
  162.    Word32 mem_syn_pst[M];
  163.    Word32 synth_buf[M + L_FRAME];
  164.    Word32 preemph_state_mem_pre;
  165.    agcState * agc_state;
  166. }Post_FilterState;
  167. typedef struct
  168. {
  169.    Word32 y2_hi;
  170.    Word32 y2_lo;
  171.    Word32 y1_hi;
  172.    Word32 y1_lo;
  173.    Word32 x0;
  174.    Word32 x1;
  175. }Post_ProcessState;
  176. typedef struct
  177. {
  178.    Decoder_amrState * decoder_amrState;
  179.    Post_FilterState * post_state;
  180.    Post_ProcessState * postHP_state;
  181. }Speech_Decode_FrameState;
  182. /*
  183.  * CodAmrReset
  184.  *
  185.  *
  186.  * Parameters:
  187.  *    state             B: state structure
  188.  *    mode              I: AMR mode
  189.  *
  190.  * Function:
  191.  *    Resets state memory
  192.  *
  193.  * Returns:
  194.  *    void
  195.  */
  196. static void Decoder_amr_reset( Decoder_amrState *state, enum Mode mode )
  197. {
  198.    Word32 i;
  199.    /* Cb_gain_average_reset */
  200.    memset(state->Cb_gain_averState->cbGainHistory, 0, L_CBGAINHIST << 2);
  201.    state->Cb_gain_averState->hangVar = 0;
  202.    state->Cb_gain_averState->hangCount= 0;
  203.    /* Initialize static pointer */
  204.    state->exc = state->old_exc + PIT_MAX + L_INTERPOL;
  205.    /* Static vectors to zero */
  206.    memset( state->old_exc, 0, ( PIT_MAX + L_INTERPOL )<<2 );
  207.    if ( mode != MRDTX )
  208.       memset( state->mem_syn, 0, M <<2 );
  209.    /* initialize pitch sharpening */
  210.    state->sharp = SHARPMIN;
  211.    state->old_T0 = 40;
  212.    /* Initialize state->lsp_old [] */
  213.    if ( mode != MRDTX ) {
  214.       state->lsp_old[0] = 30000;
  215.       state->lsp_old[1] = 26000;
  216.       state->lsp_old[2] = 21000;
  217.       state->lsp_old[3] = 15000;
  218.       state->lsp_old[4] = 8000;
  219.       state->lsp_old[5] = 0;
  220.       state->lsp_old[6] = -8000;
  221.       state->lsp_old[7] = -15000;
  222.       state->lsp_old[8] = -21000;
  223.       state->lsp_old[9] = -26000;
  224.    }
  225.    /* Initialize memories of bad frame handling */
  226.    state->prev_bf = 0;
  227.    state->prev_pdf = 0;
  228.    state->state = 0;
  229.    state->T0_lagBuff = 40;
  230.    state->inBackgroundNoise = 0;
  231.    state->voicedHangover = 0;
  232.    if ( mode != MRDTX )
  233.       memset( state->excEnergyHist, 0, 9 <<2 );
  234.    memset( state->ltpGainHistory, 0, 9 <<2 );
  235.    if ( mode != MRDTX ) {
  236.       state->lsp_avg_st->lsp_meanSave[0] = 1384;
  237.       state->lsp_avg_st->lsp_meanSave[1] = 2077;
  238.       state->lsp_avg_st->lsp_meanSave[2] = 3420;
  239.       state->lsp_avg_st->lsp_meanSave[3] = 5108;
  240.       state->lsp_avg_st->lsp_meanSave[4] = 6742;
  241.       state->lsp_avg_st->lsp_meanSave[5] = 8122;
  242.       state->lsp_avg_st->lsp_meanSave[6] = 9863;
  243.       state->lsp_avg_st->lsp_meanSave[7] = 11092;
  244.       state->lsp_avg_st->lsp_meanSave[8] = 12714;
  245.       state->lsp_avg_st->lsp_meanSave[9] = 13701;
  246.    }
  247.    memset( state->lsfState->past_r_q, 0, M <<2 );
  248.    /* Past dequantized lsfs */
  249.    state->lsfState->past_lsf_q[0] = 1384;
  250.    state->lsfState->past_lsf_q[1] = 2077;
  251.    state->lsfState->past_lsf_q[2] = 3420;
  252.    state->lsfState->past_lsf_q[3] = 5108;
  253.    state->lsfState->past_lsf_q[4] = 6742;
  254.    state->lsfState->past_lsf_q[5] = 8122;
  255.    state->lsfState->past_lsf_q[6] = 9863;
  256.    state->lsfState->past_lsf_q[7] = 11092;
  257.    state->lsfState->past_lsf_q[8] = 12714;
  258.    state->lsfState->past_lsf_q[9] = 13701;
  259.    for ( i = 0; i < 5; i++ )
  260.       state->ec_gain_p_st->pbuf[i] = 1640;
  261.    state->ec_gain_p_st->past_gain_pit = 0;
  262.    state->ec_gain_p_st->prev_gp = 16384;
  263.    for ( i = 0; i < 5; i++ )
  264.       state->ec_gain_c_st->gbuf[i] = 1;
  265.    state->ec_gain_c_st->past_gain_code = 0;
  266.    state->ec_gain_c_st->prev_gc = 1;
  267.    if ( mode != MRDTX ) {
  268.       for ( i = 0; i < NPRED; i++ ) {
  269.          state->pred_state->past_qua_en[i] = MIN_ENERGY;
  270.          state->pred_state->past_qua_en_MR122[i] = MIN_ENERGY_MR122;
  271.       }
  272.    }
  273.    state->nodataSeed = 21845;
  274.    /* Static vectors to zero */
  275.    memset( state->background_state->frameEnergyHist, 0, L_ENERGYHIST <<2 );
  276.    /* Initialize hangover handling */
  277.    state->background_state->bgHangover = 0;
  278.    /* phDispReset */
  279.    memset( state->ph_disp_st->gainMem, 0, PHDGAINMEMSIZE <<2 );
  280.    state->ph_disp_st->prevState = 0;
  281.    state->ph_disp_st->prevCbGain = 0;
  282.    state->ph_disp_st->lockFull = 0;
  283.    state->ph_disp_st->onset = 0;   /* assume no onset in start */
  284.    if ( mode != MRDTX ) {
  285.       state->dtxDecoderState->since_last_sid = 0;
  286.       state->dtxDecoderState->true_sid_period_inv = 8192;
  287.       state->dtxDecoderState->log_en = 3500;
  288.       state->dtxDecoderState->old_log_en = 3500;
  289.       /* low level noise for better performance in  DTX handover cases*/
  290.       state->dtxDecoderState->pn_seed_rx = PN_INITIAL_SEED;
  291.       /* Initialize state->lsp [] */
  292.       state->dtxDecoderState->lsp[0] = 30000;
  293.       state->dtxDecoderState->lsp[1] = 26000;
  294.       state->dtxDecoderState->lsp[2] = 21000;
  295.       state->dtxDecoderState->lsp[3] = 15000;
  296.       state->dtxDecoderState->lsp[4] = 8000;
  297.       state->dtxDecoderState->lsp[5] = 0;
  298.       state->dtxDecoderState->lsp[6] = -8000;
  299.       state->dtxDecoderState->lsp[7] = -15000;
  300.       state->dtxDecoderState->lsp[8] = -21000;
  301.       state->dtxDecoderState->lsp[9] = -26000;
  302.       /* Initialize state->lsp_old [] */
  303.       state->dtxDecoderState->lsp_old[0] = 30000;
  304.       state->dtxDecoderState->lsp_old[1] = 26000;
  305.       state->dtxDecoderState->lsp_old[2] = 21000;
  306.       state->dtxDecoderState->lsp_old[3] = 15000;
  307.       state->dtxDecoderState->lsp_old[4] = 8000;
  308.       state->dtxDecoderState->lsp_old[5] = 0;
  309.       state->dtxDecoderState->lsp_old[6] = -8000;
  310.       state->dtxDecoderState->lsp_old[7] = -15000;
  311.       state->dtxDecoderState->lsp_old[8] = -21000;
  312.       state->dtxDecoderState->lsp_old[9] = -26000;
  313.       state->dtxDecoderState->lsf_hist_ptr = 0;
  314.       state->dtxDecoderState->log_pg_mean = 0;
  315.       state->dtxDecoderState->log_en_hist_ptr = 0;
  316.       /* initialize decoder lsf history */
  317.       state->dtxDecoderState->lsf_hist[0] = 1384;
  318.       state->dtxDecoderState->lsf_hist[1] = 2077;
  319.       state->dtxDecoderState->lsf_hist[2] = 3420;
  320.       state->dtxDecoderState->lsf_hist[3] = 5108;
  321.       state->dtxDecoderState->lsf_hist[4] = 6742;
  322.       state->dtxDecoderState->lsf_hist[5] = 8122;
  323.       state->dtxDecoderState->lsf_hist[6] = 9863;
  324.       state->dtxDecoderState->lsf_hist[7] = 11092;
  325.       state->dtxDecoderState->lsf_hist[8] = 12714;
  326.       state->dtxDecoderState->lsf_hist[9] = 13701;
  327.       for ( i = 1; i < DTX_HIST_SIZE; i++ ) {
  328.          memcpy( &state->dtxDecoderState->lsf_hist[M * i], &state->
  329.                dtxDecoderState->lsf_hist[0], M <<2 );
  330.       }
  331.       memset( state->dtxDecoderState->lsf_hist_mean, 0, M * DTX_HIST_SIZE <<2 );
  332.       /* initialize decoder log frame energy */
  333.       for ( i = 0; i < DTX_HIST_SIZE; i++ ) {
  334.          state->dtxDecoderState->log_en_hist[i] = state->dtxDecoderState->log_en
  335.          ;
  336.       }
  337.       state->dtxDecoderState->log_en_adjust = 0;
  338.       state->dtxDecoderState->dtxHangoverCount = DTX_HANG_CONST;
  339.       state->dtxDecoderState->decAnaElapsedCount = 31;
  340.       state->dtxDecoderState->sid_frame = 0;
  341.       state->dtxDecoderState->valid_data = 0;
  342.       state->dtxDecoderState->dtxHangoverAdded = 0;
  343.       state->dtxDecoderState->dtxGlobalState = DTX;
  344.       state->dtxDecoderState->data_updated = 0;
  345.    }
  346.    return;
  347. }
  348. /*
  349.  * rx_dtx_handler
  350.  *
  351.  *
  352.  * Parameters:
  353.  *    st->dtxGlobalState      I: DTX state
  354.  *    st->since_last_sid      B: Frames after last SID frame
  355.  *    st->data_updated        I: SID update flag
  356.  *    st->decAnaElapsedCount  B: state machine that synch with the GSMEFR txDtx machine
  357.  *    st->dtxHangoverAdded    B: DTX hangover
  358.  *    st->sid_frame           O: SID frame indicator
  359.  *    st->valid_data          O: Vaild data indicator
  360.  *    frame_type              O: Frame type
  361.  *
  362.  * Function:
  363.  *    Find the new DTX state
  364.  *
  365.  * Returns:
  366.  *    DTXStateType            DTX, DTX_MUTE or SPEECH
  367.  */
  368. static enum DTXStateType rx_dtx_handler( dtx_decState *st, enum RXFrameType frame_type )
  369. {
  370.    enum DTXStateType newState;
  371.    enum DTXStateType encState;
  372.    /* DTX if SID frame or previously in DTX{_MUTE} and (NO_RX OR BAD_SPEECH) */
  373.    if ( table_SID[frame_type] | ( ( st->dtxGlobalState != SPEECH ) &
  374.          table_speech_bad[frame_type] ) ) {
  375.       newState = DTX;
  376.       /* stay in mute for these input types */
  377.       if ( ( st->dtxGlobalState == DTX_MUTE ) & table_mute[frame_type] ) {
  378.          newState = DTX_MUTE;
  379.       }
  380.       /*
  381.        * evaluate if noise parameters are too old
  382.        * since_last_sid is reset when CN parameters have been updated
  383.        */
  384.       st->since_last_sid += 1;
  385.       /* no update of sid parameters in DTX for a long while */
  386.       if ((frame_type != RX_SID_UPDATE) & ( st->since_last_sid > DTX_MAX_EMPTY_THRESH )) {
  387.          newState = DTX_MUTE;
  388.       }
  389.    }
  390.    else {
  391.       newState = SPEECH;
  392.       st->since_last_sid = 0;
  393.    }
  394.    /*
  395.     * reset the decAnaElapsed Counter when receiving CNI data the first
  396.     * time, to robustify counter missmatch after handover
  397.     * this might delay the bwd CNI analysis in the new decoder slightly.
  398.     */
  399.    if ( ( st->data_updated == 0 ) & ( frame_type == RX_SID_UPDATE ) ) {
  400.       st->decAnaElapsedCount = 0;
  401.    }
  402.    /*
  403.     * update the SPE-SPD DTX hangover synchronization
  404.     * to know when SPE has added dtx hangover
  405.     */
  406.    st->decAnaElapsedCount += 1;
  407.    st->dtxHangoverAdded = 0;
  408.    encState = SPEECH;
  409.    if ( table_DTX[frame_type] ) {
  410.       encState = DTX;
  411.       if( ( frame_type == RX_NO_DATA ) & ( newState == SPEECH ) ) {
  412.          encState = SPEECH;
  413.       }
  414.    }
  415.    if ( encState == SPEECH ) {
  416.       st->dtxHangoverCount = DTX_HANG_CONST;
  417.    }
  418.    else {
  419.       if ( st->decAnaElapsedCount > DTX_ELAPSED_FRAMES_THRESH ) {
  420.          st->dtxHangoverAdded = 1;
  421.          st->decAnaElapsedCount = 0;
  422.          st->dtxHangoverCount = 0;
  423.       }
  424.       else if ( st->dtxHangoverCount == 0 ) {
  425.          st->decAnaElapsedCount = 0;
  426.       }
  427.       else {
  428.          st->dtxHangoverCount -= 1;
  429.       }
  430.    }
  431.    if ( newState != SPEECH ) {
  432.       /*
  433.        * DTX or DTX_MUTE
  434.        * CN data is not in a first SID, first SIDs are marked as SID_BAD
  435.        * but will do backwards analysis if a hangover period has been added
  436.        * according to the state machine above
  437.        */
  438.       st->sid_frame = 0;
  439.       st->valid_data = 0;
  440.       if ( frame_type == RX_SID_FIRST ) {
  441.          st->sid_frame = 1;
  442.       }
  443.       else if ( frame_type == RX_SID_UPDATE ) {
  444.          st->sid_frame = 1;
  445.          st->valid_data = 1;
  446.       }
  447.       else if ( frame_type == RX_SID_BAD ) {
  448.          st->sid_frame = 1;
  449.          /* use old data */
  450.          st->dtxHangoverAdded = 0;
  451.       }
  452.    }
  453.    /* newState is used by both SPEECH AND DTX synthesis routines */
  454.    return newState;
  455. }
  456. /*
  457.  * Lsf_lsp
  458.  *
  459.  *
  460.  * Parameters:
  461.  *    lsf               I: vector of LSFs
  462.  *    lsp               O: vector of LSPs
  463.  *
  464.  * Function:
  465.  *    Transformation lsf to lsp, order M
  466.  *
  467.  * Returns:
  468.  *    void
  469.  */
  470. static void Lsf_lsp( Word32 lsf[], Word32 lsp[] )
  471. {
  472.    Word32 i, ind, offset, tmp;
  473.    for ( i = 0; i < M; i++ ) {
  474.       /* ind = b8-b15 of lsf[i] */
  475.       ind = lsf[i] >> 8;
  476.       /* offset = b0-b7  of lsf[i] */
  477.       offset = lsf[i] & 0x00ff;
  478.       /* lsp[i] = table[ind]+ ((table[ind+1]-table[ind])*offset) / 256 */
  479.       tmp = ( ( cos_table[ind+1]-cos_table[ind] )*offset ) << 1;
  480.       lsp[i] = cos_table[ind] + ( tmp >> 9 );
  481.    }
  482.    return;
  483. }
  484. /*
  485.  * D_plsf_3
  486.  *
  487.  *
  488.  * Parameters:
  489.  *    st->past_lsf_q    I: Past dequantized LFSs
  490.  *    st->past_r_q      B: past quantized residual
  491.  *    mode              I: AMR mode
  492.  *    bfi               B: bad frame indicator
  493.  *    indice            I: quantization indices of 3 submatrices, Q0
  494.  *    lsp1_q            O: quantized 1st LSP vector
  495.  *
  496.  * Function:
  497.  *    Decodes the LSP parameters using the received quantization indices.
  498.  *    1st order MA prediction and split by 3 vector quantization (split-VQ)
  499.  *
  500.  * Returns:
  501.  *    void
  502.  */
  503. static void D_plsf_3( D_plsfState *st, enum Mode mode, Word16 bfi, Word16 *
  504.       indice, Word32 *lsp1_q )
  505. {
  506.    Word32 lsf1_r[M], lsf1_q[M];
  507.    Word32 i, index, temp;
  508.    const Word32 *p_cb1, *p_cb2, *p_cb3, *p_dico;
  509.    /* if bad frame */
  510.    if ( bfi != 0 ) {
  511.       /* use the past LSFs slightly shifted towards their mean */
  512.       for ( i = 0; i < M; i++ ) {
  513.          /* lsfi_q[i] = ALPHA*past_lsf_q[i] + ONE_ALPHA*meanLsf[i]; */
  514.          lsf1_q[i] = ( ( st->past_lsf_q[i] * ALPHA ) >> 15 ) + ( ( mean_lsf_3[i]
  515.                * ONE_ALPHA ) >> 15 );
  516.       }
  517.       /* estimate past quantized residual to be used in next frame */
  518.       if ( mode != MRDTX ) {
  519.          for ( i = 0; i < M; i++ ) {
  520.             /* temp  = meanLsf[i] +  pastR2_q[i] * pred_fac; */
  521.             temp = mean_lsf_3[i] + ( ( st->past_r_q[i] * pred_fac[i] ) >> 15 );
  522.             st->past_r_q[i] = lsf1_q[i] - temp;
  523.          }
  524.       }
  525.       else {
  526.          for ( i = 0; i < M; i++ ) {
  527.             /* temp  = meanLsf[i] +  pastR2_q[i]; */
  528.             temp = mean_lsf_3[i] + st->past_r_q[i];
  529.             st->past_r_q[i] = lsf1_q[i] - temp;
  530.          }
  531.       }
  532.    }
  533.    /* if good LSFs received */
  534.    else {
  535.       if ( ( mode == MR475 ) | ( mode == MR515 ) ) {
  536.          /* MR475, MR515 */
  537.          p_cb1 = dico1_lsf_3;
  538.          p_cb2 = dico2_lsf_3;
  539.          p_cb3 = mr515_3_lsf;
  540.       }
  541.       else if ( mode == MR795 ) {
  542.          /* MR795 */
  543.          p_cb1 = mr795_1_lsf;
  544.          p_cb2 = dico2_lsf_3;
  545.          p_cb3 = dico3_lsf_3;
  546.       }
  547.       else {
  548.          /* MR59, MR67, MR74, MR102, MRDTX */
  549.          p_cb1 = dico1_lsf_3;
  550.          p_cb2 = dico2_lsf_3;
  551.          p_cb3 = dico3_lsf_3;
  552.       }
  553.       /* decode prediction residuals from 3 received indices */
  554.       index = *indice++;
  555.       p_dico = &p_cb1[index + index + index];
  556.       index = *indice++;
  557.       lsf1_r[0] = *p_dico++;
  558.       lsf1_r[1] = *p_dico++;
  559.       lsf1_r[2] = *p_dico++;
  560.       if ( ( mode == MR475 ) | ( mode == MR515 ) ) {
  561.          /* MR475, MR515 only using every second entry */
  562.          index = index << 1;
  563.       }
  564.       p_dico = &p_cb2[index + index + index];
  565.       index = *indice++;
  566.       lsf1_r[3] = *p_dico++;
  567.       lsf1_r[4] = *p_dico++;
  568.       lsf1_r[5] = *p_dico++;
  569.       p_dico = &p_cb3[index << 2];
  570.       lsf1_r[6] = *p_dico++;
  571.       lsf1_r[7] = *p_dico++;
  572.       lsf1_r[8] = *p_dico++;
  573.       lsf1_r[9] = *p_dico++;
  574.       /* Compute quantized LSFs and update the past quantized residual */
  575.       if ( mode != MRDTX ) {
  576.          for ( i = 0; i < M; i++ ) {
  577.             lsf1_q[i] = lsf1_r[i] + ( mean_lsf_3[i] + ( ( st->past_r_q[i] *
  578.                   pred_fac[i] ) >> 15 ) );
  579.          }
  580.          memcpy( st->past_r_q, lsf1_r, M <<2 );
  581.       }
  582.       else {
  583.          for ( i = 0; i < M; i++ ) {
  584.             lsf1_q[i] = lsf1_r[i] + ( mean_lsf_3[i] + st->past_r_q[i] );
  585.          }
  586.          memcpy( st->past_r_q, lsf1_r, M <<2 );
  587.       }
  588.    }
  589.    /* verification that LSFs has minimum distance of LSF_GAP Hz */
  590.    temp = LSF_GAP;
  591.    for ( i = 0; i < M; i++ ) {
  592.       if ( lsf1_q[i] < temp ) {
  593.          lsf1_q[i] = temp;
  594.       }
  595.       temp = lsf1_q[i] + LSF_GAP;
  596.    }
  597.    memcpy( st->past_lsf_q, lsf1_q, M <<2 );
  598.    /*  convert LSFs to the cosine domain */
  599.    Lsf_lsp( lsf1_q, lsp1_q );
  600.    return;
  601. }
  602. /*
  603.  * pseudonoise
  604.  *
  605.  *
  606.  * Parameters:
  607.  *    shift_reg         B: Old CN generator shift register state
  608.  *    no_bits           I: Number of bits
  609.  *
  610.  * Function:
  611.  *    pseudonoise
  612.  *
  613.  * Returns:
  614.  *    noise_bits
  615.  */
  616. static Word32 pseudonoise( Word32 *shift_reg, Word32 no_bits )
  617. {
  618.    Word32 noise_bits, Sn, i;
  619.    Word32 s_reg;
  620.    s_reg = *shift_reg;
  621.    noise_bits = 0;
  622.    for ( i = 0; i < no_bits; i++ ) {
  623.       /* State n == 31 */
  624.       Sn = s_reg & 0x00000001L;
  625.       /* State n == 3 */
  626.       if ( s_reg & 0x10000000L ) {
  627.          Sn = Sn ^ 0x1L;
  628.       }
  629.       else {
  630.          Sn = Sn ^ 0x0L;
  631.       }
  632.       noise_bits = ( noise_bits << 1 ) | ( s_reg & 1 );
  633.       s_reg = s_reg >> 1;
  634.       if ( Sn & 1 ) {
  635.          s_reg = s_reg | 0x40000000L;
  636.       }
  637.    }
  638.    *shift_reg = s_reg;
  639.    return noise_bits;
  640. }
  641. /*
  642.  * Lsp_lsf
  643.  *
  644.  *
  645.  * Parameters:
  646.  *    lsp               I: LSP vector (range: -1<=val<1)
  647.  *    lsf               O: LSF vector Old CN generator shift register state
  648.  *
  649.  * Function:
  650.  *    Transformation lsp to lsf, LPC order M
  651.  *    lsf[i] = arccos(lsp[i])/(2*pi)
  652.  *
  653.  * Returns:
  654.  *    void
  655.  */
  656. static void Lsp_lsf( Word32 lsp[], Word32 lsf[] )
  657. {
  658.    Word32 i, ind = 63;   /* begin at end of table -1 */
  659.    for ( i = M - 1; i >= 0; i-- ) {
  660.       /* find value in table that is just greater than lsp[i] */
  661.       while ( cos_table[ind] < lsp[i] ) {
  662.          ind--;
  663.       }
  664.       lsf[i] = ( ( ( ( lsp[i] - cos_table[ind] ) * acos_slope[ind] ) + 0x800 )
  665.             >> 12 ) + ( ind << 8 );
  666.    }
  667.    return;
  668. }
  669. /*
  670.  * Reorder_lsf
  671.  *
  672.  *
  673.  * Parameters:
  674.  *    lsf            B: vector of LSFs (range: 0<=val<=0.5)
  675.  *    min_dist       I: minimum required distance
  676.  *
  677.  * Function:
  678.  *    Make sure that the LSFs are properly ordered and to keep a certain minimum
  679.  *    distance between adjacent LSFs. LPC order = M.
  680.  *
  681.  * Returns:
  682.  *    void
  683.  */
  684. static void Reorder_lsf( Word32 *lsf, Word32 min_dist )
  685. {
  686.    Word32 lsf_min, i;
  687.    lsf_min = min_dist;
  688.    for ( i = 0; i < M; i++ ) {
  689.       if ( lsf[i] < lsf_min ) {
  690.          lsf[i] = lsf_min;
  691.       }
  692.       lsf_min = lsf[i] + min_dist;
  693.    }
  694. }
  695. /* VC5.0 Global optimization does not work with this function */
  696. #if _MSC_VER == 1100
  697. #pragma optimize( "g", off )
  698. #endif
  699. /*
  700.  * Get_lsp_pol
  701.  *
  702.  *
  703.  * Parameters:
  704.  *    lsp               I: line spectral frequencies
  705.  *    f                 O: polynomial F1(z) or F2(z)
  706.  *
  707.  * Function:
  708.  *    Find the polynomial F1(z) or F2(z) from the LSPs.
  709.  *
  710.  *    F1(z) = product ( 1 - 2 lsp[i] z^-1 + z^-2 )
  711.  *             i=0,2,4,6,8
  712.  *    F2(z) = product   ( 1 - 2 lsp[i] z^-1 + z^-2 )
  713.  *             i=1,3,5,7,9
  714.  *
  715.  *    where lsp[] is the LSP vector in the cosine domain.
  716.  *
  717.  *    The expansion is performed using the following recursion:
  718.  *
  719.  *    f[0] = 1
  720.  *    b = -2.0 * lsp[0]
  721.  *    f[1] = b
  722.  *    for i=2 to 5 do
  723.  *       b = -2.0 * lsp[2*i-2];
  724.  *       f[i] = b*f[i-1] + 2.0*f[i-2];
  725.  *       for j=i-1 down to 2 do
  726.  *          f[j] = f[j] + b*f[j-1] + f[j-2];
  727.  *       f[1] = f[1] + b;
  728.  *
  729.  * Returns:
  730.  *    void
  731.  */
  732. static void Get_lsp_pol( Word32 *lsp, Word32 *f )
  733. {
  734.    volatile Word32 f0, f1, f2, f3, f4, f5;
  735.    Word32 l1, l2, l3, l4;
  736.    /* f[0] = 1.0; */
  737.    f0 = 16777216L;
  738.    /* f1 = *lsp * -1024; */
  739.    f1 = -lsp[0] << 10;
  740.    l1 = lsp[2];
  741.    l2 = lsp[4];
  742.    l3 = lsp[6];
  743.    l4 = lsp[8];
  744.    f2 = f0 << 1;
  745.    f2 -= ( ( ( f1 >> 16 ) * l1 ) + ( ( ( f1 & 0xFFFE ) * l1 ) >> 16 ) ) << 2;
  746.    f1 -= l1 << 10;
  747.    f3 = f1 << 1;
  748.    f3 -= ( ( ( f2 >> 16 ) * l2 ) + ( ( ( f2 & 0xFFFE ) * l2 ) >> 16 ) ) << 2;
  749.    f2 += f0;
  750.    f2 -= ( ( ( f1 >> 16 ) * l2 ) + ( ( ( f1 & 0xFFFE ) * l2 ) >> 16 ) ) << 2;
  751.    f1 -= l2 << 10;
  752.    f4 = f2 << 1;
  753.    f4 -= ( ( ( f3 >> 16 ) * l3 ) + ( ( ( f3 & 0xFFFE ) * l3 ) >> 16 ) ) << 2;
  754.    f3 += f1;
  755.    f3 -= ( ( ( f2 >> 16 ) * l3 ) + ( ( ( f2 & 0xFFFE ) * l3 ) >> 16 ) ) << 2;
  756.    f2 += f0;
  757.    f2 -= ( ( ( f1 >> 16 ) * l3 ) + ( ( ( f1 & 0xFFFE ) * l3 ) >> 16 ) ) << 2;
  758.    f1 -= l3 << 10;
  759.    f5 = f3 << 1;
  760.    f5 -= ( ( ( f4 >> 16 ) * l4 ) + ( ( ( f4 & 0xFFFE ) * l4 ) >> 16 ) ) << 2;
  761.    f4 += f2;
  762.    f4 -= ( ( ( f3 >> 16 ) * l4 ) + ( ( ( f3 & 0xFFFE ) * l4 ) >> 16 ) ) << 2;
  763.    f3 += f1;
  764.    f3 -= ( ( ( f2 >> 16 ) * l4 ) + ( ( ( f2 & 0xFFFE ) * l4 ) >> 16 ) ) << 2;
  765.    f2 += f0;
  766.    f2 -= ( ( ( f1 >> 16 ) * l4 ) + ( ( ( f1 & 0xFFFE ) * l4 ) >> 16 ) ) << 2;
  767.    f1 -= l4 << 10;
  768.    f[0] = f0;
  769.    f[1] = f1;
  770.    f[2] = f2;
  771.    f[3] = f3;
  772.    f[4] = f4;
  773.    f[5] = f5;
  774.    return;
  775. }
  776. #if _MSC_VER == 1100
  777. #pragma optimize( "", on )
  778. #endif
  779. /*
  780.  * Lsp_Az
  781.  *
  782.  *
  783.  * Parameters:
  784.  *    lsp                 I: Line spectral frequencies
  785.  *    a                   O: Predictor coefficients
  786.  *
  787.  * Function:
  788.  *    Converts from the line spectral pairs (LSP) to LP coefficients,
  789.  *    for a 10th order filter.
  790.  *
  791.  *    Find the coefficients of F1(z) and F2(z)
  792.  *    Multiply F1(z) by 1+z^{-1} and F2(z) by 1-z^{-1}
  793.  *    A(z) = ( F1(z) + F2(z) ) / 2
  794.  *
  795.  * Returns:
  796.  *    void
  797.  */
  798. static void Lsp_Az( Word32 lsp[], Word32 a[] )
  799. {
  800.    Word32 f1[6], f2[6];
  801.    Word32 T0, i, j;
  802.    Get_lsp_pol( &lsp[0], f1 );
  803.    Get_lsp_pol( &lsp[1], f2 );
  804.    for ( i = 5; i > 0; i-- ) {
  805.       f1[i] += f1[i - 1];
  806.       f2[i] -= f2[i - 1];
  807.    }
  808.    a[0] = 4096;
  809.    for ( i = 1, j = 10; i <= 5; i++, j-- ) {
  810.       T0 = f1[i] + f2[i];
  811.       a[i] = (Word16)(T0 >> 13);  /* emulate fixed point bug */
  812.       if ( ( T0 & 4096 ) != 0 ) {
  813.          a[i]++;
  814.       }
  815.       T0 = f1[i] - f2[i];
  816.       a[j] = (Word16)(T0 >> 13);   /* emulate fixed point bug */
  817.       if ( ( T0 & 4096 ) != 0 ) {
  818.          a[j]++;
  819.       }
  820.    }
  821.    return;
  822. }
  823. /*
  824.  * A_Refl
  825.  *
  826.  *
  827.  * Parameters:
  828.  *    a                 I: Directform coefficients
  829.  *    refl              O: Reflection coefficients
  830.  *
  831.  * Function:
  832.  *    Converts from the directform coefficients to reflection coefficients
  833.  *
  834.  * Returns:
  835.  *    void
  836.  */
  837. static void A_Refl( Word32 a[], Word32 refl[] )
  838. {
  839.    /* local variables */
  840.    int normShift;
  841.    Word32 aState[M], bState[M];
  842.    Word32 normProd, acc, temp, mult, scale, i, j;
  843.    /* initialize states */
  844.    memcpy( aState, a, M <<2 );
  845.    /* backward Levinson recursion */
  846.    for ( i = M - 1; i >= 0; i-- ) {
  847.       if ( labs( aState[i] ) >= 4096 ) {
  848.          goto ExitRefl;
  849.       }
  850.       refl[i] = aState[i] << 3;
  851.       temp = ( refl[i] * refl[i] ) << 1;
  852.       acc = ( MAX_32 - temp );
  853.       normShift=0;
  854.       if (acc != 0){
  855.          temp = acc;
  856.          while (!(temp & 0x40000000))
  857.          {
  858.             normShift++;
  859.             temp = temp << 1;
  860.          }
  861.       }
  862.       else{
  863.          normShift = 0;
  864.       }
  865.       scale = 15 - normShift;
  866.       acc = ( acc << normShift );
  867.       temp = ( acc + ( Word32 )0x00008000L );
  868.       if ( temp > 0 ) {
  869.          normProd = temp >> 16;
  870.          mult = 0x20000000L / normProd;
  871.       }
  872.       else
  873.          mult = 16384;
  874.       for ( j = 0; j < i; j++ ) {
  875.          acc = aState[j] << 16;
  876.          acc -= ( refl[i] * aState[i - j - 1] ) << 1;
  877.          temp = ( acc + ( Word32 )0x00008000L ) >> 16;
  878.          temp = ( mult * temp ) << 1;
  879.          if ( scale > 0 ) {
  880.             if ( ( temp & ( ( Word32 )1 << ( scale - 1 ) ) ) != 0 ) {
  881.                temp = ( temp >> scale ) + 1;
  882.             }
  883.             else
  884.                temp = ( temp >> scale );
  885.          }
  886.          else
  887.             temp = ( temp >> scale );
  888.          if ( labs( temp ) > 32767 ) {
  889.             goto ExitRefl;
  890.          }
  891.          bState[j] = temp;
  892.       }
  893.       memcpy( aState, bState, i <<2 );
  894.    }
  895.    return;
  896. ExitRefl:
  897.    memset( refl, 0, M <<2 );
  898. }
  899. /*
  900.  * Log2_norm
  901.  *
  902.  *
  903.  * Parameters:
  904.  *    x                 I: input value
  905.  *    exp               I: exponent
  906.  *    exponent          O: Integer part of Log2. (range: 0<=val<=30)
  907.  *    fraction          O: Fractional part of Log2. (range: 0<=val<1)
  908.  *
  909.  * Function:
  910.  *    Computes log2
  911.  *
  912.  *    Computes log2(L_x, exp),  where   L_x is positive and
  913.  *    normalized, and exp is the normalisation exponent
  914.  *    If L_x is negative or zero, the result is 0.
  915.  *
  916.  *    The function Log2(L_x) is approximated by a table and linear
  917.  *    interpolation. The following steps are used to compute Log2(L_x)
  918.  *
  919.  *    exponent = 30-normExponent
  920.  *    i = bit25-b31 of L_x;  32<=i<=63  (because of normalization).
  921.  *    a = bit10-b24
  922.  *    i -=32
  923.  *    fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2
  924.  *
  925.  * Returns:
  926.  *    void
  927.  */
  928. static void Log2_norm( Word32 x, Word32 exp, Word32 *exponent, Word32 *
  929.       fraction )
  930. {
  931.    Word32 y, i, a;
  932.    if ( x <= 0 ) {
  933.       *exponent = 0;
  934.       *fraction = 0;
  935.       return;
  936.    }
  937.    /* Extract b25-b31 */
  938.    i = x >> 25;
  939.    i = i - 32;
  940.    /* Extract b10-b24 of fraction */
  941.    a = x >> 9;
  942.    a = a & 0xFFFE;   /* 2a */
  943.    /* fraction */
  944.    y = ( log2_table[i] << 16 ) - a * ( log2_table[i] - log2_table[i + 1] );
  945.    *fraction = y >> 16;
  946.    *exponent = 30 - exp;
  947.    return;
  948. }
  949. /*
  950.  * Log2
  951.  *
  952.  *
  953.  * Parameters:
  954.  *    x                 I: input value
  955.  *    exponent          O: Integer part of Log2. (range: 0<=val<=30)
  956.  *    fraction          O: Fractional part of Log2. (range: 0<=val<1)
  957.  *
  958.  * Function:
  959.  *    Computes log2(L_x)
  960.  *    If x is negative or zero, the result is 0.
  961.  *
  962.  * Returns:
  963.  *    void
  964.  */
  965. static void Log2( Word32 x, Word32 *exponent, Word32 *fraction )
  966. {
  967.    int tmp, exp=0;
  968.    if (x != 0){
  969.          tmp = x;
  970.          while (!((tmp & 0x80000000) ^ ((tmp & 0x40000000) << 1)))
  971.          {
  972.             exp++;
  973.             tmp = tmp << 1;
  974.          }
  975.       }
  976.    Log2_norm( x <<exp, exp, exponent, fraction );
  977. }
  978. /*
  979.  * Pow2
  980.  *
  981.  *
  982.  * Parameters:
  983.  *    exponent          I: Integer part. (range: 0<=val<=30)
  984.  *    fraction          O: Fractional part. (range: 0.0<=val<1.0)
  985.  *
  986.  * Function:
  987.  *    pow(2.0, exponent.fraction)
  988.  *
  989.  *    The function Pow2(L_x) is approximated by a table and linear interpolation.
  990.  *
  991.  *    i = bit10-b15 of fraction, 0 <= i <= 31
  992.  *    a = biT0-b9   of fraction
  993.  *    x = table[i]<<16 - (table[i] - table[i+1]) * a * 2
  994.  *    x = L_x >> (30-exponent) (with rounding)
  995.  *
  996.  * Returns:
  997.  *    result (range: 0<=val<=0x7fffffff)
  998.  */
  999. static Word32 Pow2( Word32 exponent, Word32 fraction )
  1000. {
  1001.    Word32 i, a, tmp, x, exp;
  1002.    /* Extract b10-b16 of fraction */
  1003.    i = fraction >> 10;
  1004.    /* Extract b0-b9 of fraction */
  1005.    a = ( fraction << 5 ) & 0x7fff;
  1006.    /* table[i] << 16 */
  1007.    x = pow2_table[i] << 16;
  1008.    /* table[i] - table[i+1] */
  1009.    tmp = pow2_table[i] - pow2_table[i + 1];
  1010.    /* L_x -= tmp*a*2 */
  1011.    x -= ( tmp * a ) << 1;
  1012.    if ( exponent >= -1 ) {
  1013.       exp = ( 30 - exponent );
  1014.       /* Rounding */
  1015.       if ( ( x & ( ( Word32 )1 << ( exp - 1 ) ) ) != 0 ) {
  1016.          x = ( x >> exp ) + 1;
  1017.       }
  1018.       else
  1019.          x = x >> exp;
  1020.    }
  1021.    else
  1022.       x = 0;
  1023.    return( x );
  1024. }
  1025. /*
  1026.  * Build_CN_code
  1027.  *
  1028.  *
  1029.  * Parameters:
  1030.  *    seed              B: Old CN generator shift register state
  1031.  *    cod               O: Generated CN fixed codebook vector
  1032.  *
  1033.  * Function:
  1034.  *    Generate CN fixed codebook vector
  1035.  *
  1036.  * Returns:
  1037.  *    void
  1038.  */
  1039. static void Build_CN_code( Word32 *seed, Word32 cod[] )
  1040. {
  1041.    Word32 i, j, k;
  1042.    memset( cod, 0, L_SUBFR <<2 );
  1043.    for ( k = 0; k < 10; k++ ) {
  1044.       i = pseudonoise( seed, 2 );   /* generate pulse position */
  1045.       i = ( i * 20 ) >> 1;
  1046.       i = ( i + k );
  1047.       j = pseudonoise( seed, 1 );   /* generate sign           */
  1048.       if ( j > 0 ) {
  1049.          cod[i] = 4096;
  1050.       }
  1051.       else {
  1052.          cod[i] = -4096;
  1053.       }
  1054.    }
  1055.    return;
  1056. }
  1057. /*
  1058.  * Build_CN_param
  1059.  *
  1060.  *
  1061.  * Parameters:
  1062.  *    seed              B: Old CN generator shift register state
  1063.  *    nParam            I: number of params
  1064.  *    paramSizeTable    I: size of params
  1065.  *    parm              O: CN Generated params
  1066.  *
  1067.  * Function:
  1068.  *    Generate parameters for comfort noise generation
  1069.  *
  1070.  * Returns:
  1071.  *    void
  1072.  */
  1073. static void Build_CN_param( Word16 *seed, enum Mode mode, Word16 parm[] )
  1074. {
  1075.    Word32 i;
  1076.    const Word32 *p;
  1077.    *seed = ( Word16 )( ( *seed * 31821 ) + 13849L );
  1078.    p = &window_200_40[ * seed & 0x7F];
  1079.    switch ( mode ) {
  1080.       case MR122:
  1081.          for ( i = 0; i < PRMNO_MR122; i++ ) {
  1082.             parm[i] = ( Word16 )( *p++ & ~( 0xFFFF << bitno_MR122[i] ) );
  1083.          }
  1084.          break;
  1085.       case MR102:
  1086.          for ( i = 0; i < PRMNO_MR102; i++ ) {
  1087.             parm[i] = ( Word16 )( *p++ & ~( 0xFFFF << bitno_MR102[i] ) );
  1088.          }
  1089.          break;
  1090.       case MR795:
  1091.          for ( i = 0; i < PRMNO_MR795; i++ ) {
  1092.             parm[i] = ( Word16 )( *p++ & ~( 0xFFFF << bitno_MR795[i] ) );
  1093.          }
  1094.          break;
  1095.       case MR74:
  1096.          for ( i = 0; i < PRMNO_MR74; i++ ) {
  1097.             parm[i] = ( Word16 )( *p++ & ~( 0xFFFF << bitno_MR74[i] ) );
  1098.          }
  1099.          break;
  1100.       case MR67:
  1101.          for ( i = 0; i < PRMNO_MR67; i++ ) {
  1102.             parm[i] = ( Word16 )( *p++ & ~( 0xFFFF << bitno_MR67[i] ) );
  1103.          }
  1104.          break;
  1105.       case MR59:
  1106.          for ( i = 0; i < PRMNO_MR59; i++ ) {
  1107.             parm[i] = ( Word16 )( *p++ & ~( 0xFFFF << bitno_MR59[i] ) );
  1108.          }
  1109.          break;
  1110.       case MR515:
  1111.          for ( i = 0; i < PRMNO_MR515; i++ ) {
  1112.             parm[i] = ( Word16 )( *p++ & ~( 0xFFFF << bitno_MR515[i] ) );
  1113.          }
  1114.          break;
  1115.       case MR475:
  1116.          for ( i = 0; i < PRMNO_MR475; i++ ) {
  1117.             parm[i] = ( Word16 )( *p++ & ~( 0xFFFF << bitno_MR475[i] ) );
  1118.          }
  1119.          break;
  1120.    }
  1121. }
  1122. /*
  1123.  * Syn_filt
  1124.  *
  1125.  *
  1126.  * Parameters:
  1127.  *    a                 I: prediction coefficients [M+1]
  1128.  *    x                 I: input signal
  1129.  *    y                 O: output signal
  1130.  *    lg                I: size of filtering
  1131.  *    mem               B: memory associated with this filtering
  1132.  *    update            I: 0=no update, 1=update of memory.
  1133.  *
  1134.  * Function:
  1135.  *    Perform synthesis filtering through 1/A(z).
  1136.  *
  1137.  * Returns:
  1138.  *    void
  1139.  */
  1140. static Word32 Syn_filt( Word32 a[], Word32 x[], Word32 y[], Word32 lg, Word32 mem[]
  1141.       , Word32 update )
  1142. {
  1143.    Word32 tmp[50];   /* malloc is slow */
  1144.    Word32 s, a0, overflow = 0;
  1145.    Word32 *yy, *yy_limit;
  1146.    /* Copy mem[] to yy[] */
  1147.    memcpy( tmp, mem, 40 );
  1148.    yy = tmp + M;
  1149.    yy_limit = yy + lg;
  1150.    a0 = a[0];
  1151.    /* Do the filtering. */
  1152.    while ( yy < yy_limit ) {
  1153.       s = *x++ * a0;
  1154.       s -= yy[-1] * a[1];
  1155.       s -= yy[-2] * a[2];
  1156.       s -= yy[-3] * a[3];
  1157.       s -= yy[-4] * a[4];
  1158.       s -= yy[-5] * a[5];
  1159.       s -= yy[-6] * a[6];
  1160.       s -= yy[-7] * a[7];
  1161.       s -= yy[-8] * a[8];
  1162.       s -= yy[-9] * a[9];
  1163.       s -= yy[-10] * a[10];
  1164.       if ( labs( s ) < 0x7ffffff )
  1165.          *yy = ( s + 0x800L ) >> 12;
  1166.       else if ( s > 0 ) {
  1167.          *yy = 32767;
  1168.          overflow = 1;
  1169.       }
  1170.       else {
  1171.          *yy = -32768;
  1172.          overflow = 1;
  1173.       }
  1174.       yy++;
  1175.    }
  1176.    memcpy( y, &tmp[M], lg <<2 );
  1177.    /* Update of memory if update==1 */
  1178.    if ( update ) {
  1179.       memcpy( mem, &y[lg - M], 40 );
  1180.    }
  1181.    return overflow;
  1182. }
  1183. /*
  1184.  * Syn_filt_overflow
  1185.  *
  1186.  *
  1187.  * Parameters:
  1188.  *    a                 I: prediction coefficients [M+1]
  1189.  *    x                 I: input signal
  1190.  *    y                 O: output signal
  1191.  *    lg                I: size of filtering
  1192.  *    mem               B: memory associated with this filtering
  1193.  *    update            I: 0=no update, 1=update of memory.
  1194.  *
  1195.  * Function:
  1196.  *    Perform synthesis filtering through 1/A(z).
  1197.  *    Saturate after every multiplication.
  1198.  * Returns:
  1199.  *    void
  1200.  */
  1201. static void Syn_filt_overflow( Word32 a[], Word32 x[], Word32 y[], Word32 lg, Word32 mem[]
  1202.       , Word32 update )
  1203. {
  1204.    Word32 tmp[50];   /* malloc is slow */
  1205.    Word32 i, j, s, a0;
  1206.    Word32 *yy;
  1207.    /* Copy mem[] to yy[] */
  1208.    memcpy( tmp, mem, 40 );
  1209.    yy = tmp + M;
  1210.    a0 = a[0];
  1211.    /* Do the filtering. */
  1212.    for ( i = 0; i < lg; i++ ) {
  1213.       s = x[i] * a0;
  1214.       for ( j = 1; j <= M; j++ ) {
  1215.          s -= a[j] * yy[ - j];
  1216.          if (s > 1073741823){
  1217.             s = 1073741823;
  1218.          }
  1219.          else if ( s < -1073741824) {
  1220.             s = -1073741824;
  1221.          }
  1222.       }
  1223.       if ( labs( s ) < 0x7FFE800 )
  1224.          *yy = ( s + 0x800L ) >> 12;
  1225.       else if ( s > 0 ) {
  1226.          *yy = 32767;
  1227.       }
  1228.       else {
  1229.          *yy = -32768;
  1230.       }
  1231.       yy++;
  1232.    }
  1233.    memcpy( y, &tmp[M], lg <<2 );
  1234.    /* Update of memory if update==1 */
  1235.    if ( update ) {
  1236.       memcpy( mem, &y[lg - M], 40 );
  1237.    }
  1238.    return;
  1239. }
  1240. /*
  1241.  * dtx_dec
  1242.  *
  1243.  *
  1244.  * Parameters:
  1245.  *    st                            B: DTX state struct
  1246.  *    mem_syn                       I: AMR decoder state
  1247.  *    lsfState                      B: LSF state struct
  1248.  *    pred_state->past_qua_en       O: table of past quantized energies
  1249.  *    pred_state->past_qua_en_MR122 O: table of past quantized energies MR122
  1250.  *    averState->hangVar            O:
  1251.  *    averState->hangCount          O: hangover variable
  1252.  *    new_state                     I: new DTX state
  1253.  *    mode                          I: AMR mode
  1254.  *    parm                          I: vector of synthesis parameters
  1255.  *    synth                         O: synthesised speech
  1256.  *    A_t                           O: decoded LP filter in 4 subframes
  1257.  *
  1258.  * Function:
  1259.  *    DTX
  1260.  *
  1261.  * Returns:
  1262.  *    void
  1263.  */
  1264. static void dtx_dec( dtx_decState *st, Word32 *mem_syn, D_plsfState *lsfState,
  1265.       gc_predState *pred_state, Cb_gain_averageState *averState, enum
  1266.       DTXStateType new_state, enum Mode mode, Word16 parm[], Word32 synth[],
  1267.       Word32 A_t[] )
  1268. {
  1269.    Word32 ex[L_SUBFR], acoeff[11], acoeff_variab[M + 1], lsp_int[M];
  1270.    Word32 refl[M], lsf[M], lsf_int[M], lsf_int_variab[M], lsp_int_variab[M];
  1271.    Word32 i, j, int_fac, log_en_int, pred_err, log_pg_e, log_pg_m, log_pg;
  1272.    Word32 negative, lsf_mean, lsf_variab_index, lsf_variab_factor, ptr;
  1273.    Word16 log_en_index, log_en_int_e, log_en_int_m, level, ma_pred_init,
  1274.          tmp_int_length;
  1275.    if ( ( st->dtxHangoverAdded != 0 ) & ( st->sid_frame != 0 ) ) {
  1276.       /*
  1277.        * sidFirst after dtx hangover period
  1278.        * or sidUpd after dtxhangover
  1279.        */
  1280.       /* set log_en_adjust to correct value */
  1281.       st->log_en_adjust = dtx_log_en_adjust[mode];
  1282.       ptr = st->lsf_hist_ptr + M;
  1283.       if ( ptr == 80 ) {
  1284.          ptr = 0;
  1285.       }
  1286.       memcpy( &st->lsf_hist[ptr], &st->lsf_hist[st->lsf_hist_ptr], M <<2 );
  1287.       ptr = st->log_en_hist_ptr + 1;
  1288.       if ( ptr == DTX_HIST_SIZE ) {
  1289.          ptr = 0;
  1290.       }
  1291.       st->log_en_hist[ptr] = st->log_en_hist[st->log_en_hist_ptr];   /* Q11 */
  1292.       /*
  1293.        * compute mean log energy and lsp
  1294.        * from decoded signal (SID_FIRST)
  1295.        */
  1296.       st->log_en = 0;
  1297.       memset( lsf, 0, M <<2 );
  1298.       /* average energy and lsp */
  1299.       for ( i = 0; i < DTX_HIST_SIZE; i++ ) {
  1300.          st->log_en = st->log_en + ( st->log_en_hist[i] >> 3 );
  1301.          for ( j = 0; j < M; j++ ) {
  1302.             lsf[j] += st->lsf_hist[i * M + j];
  1303.          }
  1304.       }
  1305.       for ( j = 0; j < M; j++ ) {
  1306.          lsf[j] = lsf[j] >> 3;   /* divide by 8 */
  1307.       }
  1308.       Lsf_lsp( lsf, st->lsp );
  1309.       /*
  1310.        * make log_en speech coder mode independent
  1311.        * added again later before synthesis
  1312.        */
  1313.       st->log_en = st->log_en - st->log_en_adjust;
  1314.       /* compute lsf variability vector */
  1315.       memcpy( st->lsf_hist_mean, st->lsf_hist, 80 <<2 );
  1316.       for ( i = 0; i < M; i++ ) {
  1317.          lsf_mean = 0;
  1318.          /* compute mean lsf */
  1319.          for ( j = 0; j < 8; j++ ) {
  1320.             lsf_mean += st->lsf_hist_mean[i + j * M];
  1321.          }
  1322.          lsf_mean = lsf_mean >> 3;
  1323.          /*
  1324.           * subtract mean and limit to within reasonable limits
  1325.           * moreover the upper lsf's are attenuated
  1326.           */
  1327.          for ( j = 0; j < 8; j++ ) {
  1328.             /* subtract mean */
  1329.             st->lsf_hist_mean[i + j * M] = st->lsf_hist_mean[i + j * M] -
  1330.                   lsf_mean;
  1331.             /* attenuate deviation from mean, especially for upper lsf's */
  1332.             st->lsf_hist_mean[i + j * M] = ( st->lsf_hist_mean[i + j * M] *
  1333.                   lsf_hist_mean_scale[i] ) >> 15;
  1334.             /* limit the deviation */
  1335.             if ( st->lsf_hist_mean[i + j * M] < 0 ) {
  1336.                negative = 1;
  1337.             }
  1338.             else {
  1339.                negative = 0;
  1340.             }
  1341.             st->lsf_hist_mean[i + j * M] = labs( st->lsf_hist_mean[i + j * M] );
  1342.             /* apply soft limit */
  1343.             if ( st->lsf_hist_mean[i + j * M] > 655 ) {
  1344.                st->lsf_hist_mean[i + j * M] = 655 + ( ( st->lsf_hist_mean[i + j
  1345.                      * M] - 655 ) >> 2 );
  1346.             }
  1347.             /* apply hard limit */
  1348.             if ( st->lsf_hist_mean[i + j * M] > 1310 ) {
  1349.                st->lsf_hist_mean[i + j * M] = 1310;
  1350.             }
  1351.             if ( negative != 0 ) {
  1352.                st->lsf_hist_mean[i + j * M] = -st->lsf_hist_mean[i + j * M];
  1353.             }
  1354.          }
  1355.       }
  1356.    }
  1357.    if ( st->sid_frame != 0 ) {
  1358.       /*
  1359.        * Set old SID parameters, always shift
  1360.        * even if there is no new valid_data
  1361.        */
  1362.       memcpy( st->lsp_old, st->lsp, M <<2 );
  1363.       st->old_log_en = st->log_en;
  1364.       if ( st->valid_data != 0 ) /* new data available (no CRC) */ {
  1365.       /* Compute interpolation factor, since the division only works
  1366.        * for values of since_last_sid < 32 we have to limit the
  1367.        * interpolation to 32 frames
  1368.        */
  1369.          tmp_int_length = st->since_last_sid;
  1370.          st->since_last_sid = 0;
  1371.          if ( tmp_int_length > 32 ) {
  1372.             tmp_int_length = 32;
  1373.          }
  1374.          if ( tmp_int_length >= 2 ) {
  1375.             st->true_sid_period_inv = 0x2000000 / ( tmp_int_length
  1376.                   << 10 );
  1377.          }
  1378.          else {
  1379.             st->true_sid_period_inv = 16384;   /* 0.5 it Q15 */
  1380.          }
  1381.          memcpy( lsfState->past_r_q, &past_rq_init[parm[0] * M], M <<2 );
  1382.          D_plsf_3( lsfState, MRDTX, 0, &parm[1], st->lsp );
  1383.          /* reset for next speech frame */
  1384.          memset( lsfState->past_r_q, 0, M <<2 );
  1385.          log_en_index = parm[4];
  1386.          /* Q11 and divide by 4 */
  1387.          st->log_en = ( Word16 )( log_en_index << 9 );
  1388.          /* Subtract 2.5 in Q11 */
  1389.          st->log_en = ( Word16 )( st->log_en - 5120 );
  1390.          /* Index 0 is reserved for silence */
  1391.          if ( log_en_index == 0 ) {
  1392.             st->log_en = MIN_16;
  1393.          }
  1394.          /*
  1395.           * no interpolation at startup after coder reset
  1396.           * or when SID_UPD has been received right after SPEECH
  1397.           */
  1398.          if ( ( st->data_updated == 0 ) || ( st->dtxGlobalState == SPEECH ) ) {
  1399.             memcpy( st->lsp_old, st->lsp, M <<2 );
  1400.             st->old_log_en = st->log_en;
  1401.          }
  1402.       }   /* endif valid_data */
  1403.       /* initialize gain predictor memory of other modes */
  1404.       ma_pred_init = ( Word16 )( ( st->log_en >> 1 ) - 9000 );
  1405.       if ( ma_pred_init > 0 ) {
  1406.          ma_pred_init = 0;
  1407.       }
  1408.       if ( ma_pred_init < - 14436 ) {
  1409.          ma_pred_init = -14436;
  1410.       }
  1411.       pred_state->past_qua_en[0] = ma_pred_init;
  1412.       pred_state->past_qua_en[1] = ma_pred_init;
  1413.       pred_state->past_qua_en[2] = ma_pred_init;
  1414.       pred_state->past_qua_en[3] = ma_pred_init;
  1415.       /* past_qua_en for other modes than MR122 */
  1416.       ma_pred_init = ( Word16 )( ( 5443*ma_pred_init ) >> 15 );
  1417.       /* scale down by factor 20*log10(2) in Q15 */
  1418.       pred_state->past_qua_en_MR122[0] = ma_pred_init;
  1419.       pred_state->past_qua_en_MR122[1] = ma_pred_init;
  1420.       pred_state->past_qua_en_MR122[2] = ma_pred_init;
  1421.       pred_state->past_qua_en_MR122[3] = ma_pred_init;
  1422.    }   /* endif sid_frame */
  1423.    /*
  1424.     * CN generation
  1425.     * recompute level adjustment factor Q11
  1426.     * st->log_en_adjust = 0.9*st->log_en_adjust +
  1427.     *                     0.1*dtx_log_en_adjust[mode]);
  1428.     */
  1429.    st->log_en_adjust = ( Word16 )( ( ( st->log_en_adjust * 29491 ) >> 15 ) + ( (
  1430.          ( dtx_log_en_adjust[mode] << 5 ) * 3277 ) >> 20 ) );
  1431.    /* Interpolate SID info */
  1432.    /* Q10 */
  1433.    if ( st->since_last_sid > 30 )
  1434.       int_fac = 32767;
  1435.    else
  1436.       int_fac = ( Word16 )( (st->since_last_sid + 1) << 10 );
  1437.    /* Q10 * Q15 -> Q10 */
  1438.    int_fac = ( int_fac * st->true_sid_period_inv ) >> 15;
  1439.    /* Maximize to 1.0 in Q10 */
  1440.    if ( int_fac > 1024 ) {
  1441.       int_fac = 1024;
  1442.    }
  1443.    /* Q10 -> Q14 */
  1444.    int_fac = ( Word16 )( int_fac << 4 );
  1445.    /* Q14 * Q11->Q26 */
  1446.    log_en_int = ( int_fac * st->log_en ) << 1;
  1447.    for ( i = 0; i < M; i++ ) {
  1448.       /* Q14 * Q15 -> Q14 */
  1449.       lsp_int[i] = ( int_fac * st->lsp[i] ) >> 15;
  1450.    }
  1451.    /* 1-k in Q14 */
  1452.    int_fac = 16384 - int_fac;
  1453.    /* (Q14 * Q11 -> Q26) + Q26 -> Q26 */
  1454.    log_en_int += ( int_fac * st->old_log_en ) << 1;
  1455.    for ( i = 0; i < M; i++ ) {
  1456.       /* Q14 + (Q14 * Q15 -> Q14) -> Q14 */
  1457.       lsp_int[i] = lsp_int[i] + ( ( int_fac * st->lsp_old[i] ) >> 15 );
  1458.       /* Q14 -> Q15 */
  1459.       lsp_int[i] = lsp_int[i] << 1;
  1460.    }
  1461.    /* compute the amount of lsf variability */
  1462.    /* -0.6 in Q12 */
  1463.    lsf_variab_factor = st->log_pg_mean - 2457;
  1464.    /* *0.3 Q12*Q15 -> Q12 */
  1465.    lsf_variab_factor = 4096 - ( ( lsf_variab_factor * 9830 ) >> 15 );
  1466.    /* limit to values between 0..1 in Q12 */
  1467.    if ( lsf_variab_factor >= 4096 ) {
  1468.       lsf_variab_factor = 32767;
  1469.    }
  1470.    else if ( lsf_variab_factor < 0 ) {
  1471.       lsf_variab_factor = 0;
  1472.    }
  1473.    else
  1474.       lsf_variab_factor = lsf_variab_factor << 3;   /* -> Q15 */
  1475.    /* get index of vector to do variability with */
  1476.    lsf_variab_index = pseudonoise( &st->pn_seed_rx, 3 );
  1477.    /* convert to lsf */
  1478.    Lsp_lsf( lsp_int, lsf_int );
  1479.    /* apply lsf variability */
  1480.    memcpy( lsf_int_variab, lsf_int, M <<2 );
  1481.    for ( i = 0; i < M; i++ ) {
  1482.       lsf_int_variab[i] = lsf_int_variab[i] + ( ( lsf_variab_factor * st->
  1483.             lsf_hist_mean[i + lsf_variab_index * M] ) >> 15 );
  1484.    }
  1485.    /* make sure that LSP's are ordered */
  1486.    Reorder_lsf( lsf_int, LSF_GAP );
  1487.    Reorder_lsf( lsf_int_variab, LSF_GAP );
  1488.    /* copy lsf to speech decoders lsf state */
  1489.    memcpy( lsfState->past_lsf_q, lsf_int, M <<2 );
  1490.    /* convert to lsp */
  1491.    Lsf_lsp( lsf_int, lsp_int );
  1492.    Lsf_lsp( lsf_int_variab, lsp_int_variab );
  1493.      /* Compute acoeffs Q12 acoeff is used for level
  1494.       * normalization and Post_Filter, acoeff_variab is
  1495.       * used for synthesis filter
  1496.       * by doing this we make sure that the level
  1497.       * in high frequenncies does not jump up and down
  1498.       */
  1499.    Lsp_Az( lsp_int, acoeff );
  1500.    Lsp_Az( lsp_int_variab, acoeff_variab );
  1501.    /* For use in Post_Filter */
  1502.    memcpy( &A_t[0], acoeff, MP1 <<2 );
  1503.    memcpy( &A_t[MP1], acoeff, MP1 <<2 );
  1504.    memcpy( &A_t[MP1 <<1], acoeff, MP1 <<2 );
  1505.    memcpy( &A_t[MP1 + MP1 + MP1], acoeff, MP1 <<2 );
  1506.    /* Compute reflection coefficients Q15 */
  1507.    A_Refl( &acoeff[1], refl );
  1508.    /* Compute prediction error in Q15 */
  1509.    /* 0.99997 in Q15 */
  1510.    pred_err = MAX_16;
  1511.    for ( i = 0; i < M; i++ ) {
  1512.       pred_err = ( pred_err * ( MAX_16 - ( ( refl[i] * refl[i] ) >> 15 ) ) ) >>
  1513.             15;
  1514.    }
  1515.    /* compute logarithm of prediction gain */
  1516.    Log2( pred_err, &log_pg_e, &log_pg_m );
  1517.    /* convert exponent and mantissa to Word16 Q12 */
  1518.    /* Q12 */
  1519.    log_pg = ( log_pg_e - 15 ) << 12;
  1520.    /* saturate */
  1521.    if (log_pg < -32768) {
  1522.       log_pg = -32768;
  1523.    }
  1524.    log_pg = ( -( log_pg + ( log_pg_m >> 3 ) ) ) >> 1;
  1525.    st->log_pg_mean = ( Word16 )( ( ( 29491*st->log_pg_mean ) >> 15 ) + ( ( 3277
  1526.          * log_pg ) >> 15 ) );
  1527.    /* Compute interpolated log energy */
  1528.    /* Q26 -> Q16 */
  1529.    log_en_int = log_en_int >> 10;
  1530.    /* Add 4 in Q16 */
  1531.    log_en_int += 262144L;
  1532.    /* subtract prediction gain */
  1533.    log_en_int = log_en_int - ( log_pg << 4 );
  1534.    /* adjust level to speech coder mode */
  1535.    log_en_int += st->log_en_adjust << 5;
  1536.    log_en_int_e = ( Word16 )( log_en_int >> 16 );
  1537.    log_en_int_m = ( Word16 )( ( log_en_int - ( log_en_int_e << 16 ) ) >> 1 );
  1538.    /* Q4 */
  1539.    level = ( Word16 )( Pow2( log_en_int_e, log_en_int_m ) );
  1540.    for ( i = 0; i < 4; i++ ) {
  1541.       /* Compute innovation vector */
  1542.       Build_CN_code( &st->pn_seed_rx, ex );
  1543.       for ( j = 0; j < L_SUBFR; j++ ) {
  1544.          ex[j] = ( level * ex[j] ) >> 15;
  1545.       }
  1546.       /* Synthesize */
  1547.       Syn_filt( acoeff_variab, ex, &synth[i * L_SUBFR], L_SUBFR, mem_syn, 1 );
  1548.    }   /* next i */
  1549.    /* reset codebook averaging variables */
  1550.    averState->hangVar = 20;
  1551.    averState->hangCount = 0;
  1552.    if ( new_state == DTX_MUTE ) {
  1553.         /*
  1554.          * mute comfort noise as it has been quite a long time since
  1555.          * last SID update  was performed
  1556.          */
  1557.       Word32 num, denom;
  1558.       tmp_int_length = st->since_last_sid;
  1559.       if ( tmp_int_length > 32 ) {
  1560.          tmp_int_length = 32;
  1561.       }
  1562.       if ( tmp_int_length == 1 ) {
  1563.          st->true_sid_period_inv = MAX_16;
  1564.       }
  1565.       else {
  1566.          num = 1024;
  1567.          denom = ( tmp_int_length << 10 );
  1568.          st->true_sid_period_inv = 0;
  1569.          for ( i = 0; i < 15; i++ ) {
  1570.             st->true_sid_period_inv <<= 1;
  1571.             num <<= 1;
  1572.             if ( num >= denom ) {
  1573.                num = num - denom;
  1574.                st->true_sid_period_inv += 1;
  1575.             }
  1576.          }
  1577.       }
  1578.       st->since_last_sid = 0;
  1579.       memcpy( st->lsp_old, st->lsp, M << 2 );
  1580.       st->old_log_en = st->log_en;
  1581.       /* subtract 1/8 in Q11 i.e -6/8 dB */
  1582.       st->log_en = st->log_en - 256;
  1583.       if (st->log_en < -32768) st->log_en = -32768;
  1584.    }
  1585.      /*
  1586.       * reset interpolation length timer
  1587.       * if data has been updated.
  1588.       */
  1589.    if ( ( st->sid_frame != 0 ) & ( ( st->valid_data != 0 ) || ( ( st->valid_data
  1590.          == 0 ) & ( st->dtxHangoverAdded != 0 ) ) ) ) {
  1591.       st->since_last_sid = 0;
  1592.       st->data_updated = 1;
  1593.    }
  1594.    return;
  1595. }
  1596. /*
  1597.  * lsp_avg
  1598.  *
  1599.  *
  1600.  * Parameters:
  1601.  *    st->lsp_meanSave  B: LSP averages
  1602.  *    lsp               I: LSPs
  1603.  *
  1604.  * Function:
  1605.  *    Calculate the LSP averages
  1606.  *
  1607.  * Returns:
  1608.  *    void
  1609.  */
  1610. static void lsp_avg( lsp_avgState *st, Word32 *lsp )
  1611. {
  1612.    Word32 i, tmp;
  1613.    for ( i = 0; i < M; i++ ) {
  1614.       /* mean = 0.84*mean */
  1615.       tmp = ( st->lsp_meanSave[i] << 16 );
  1616.       tmp -= ( EXPCONST * st->lsp_meanSave[i] ) << 1;
  1617.       /* Add 0.16 of newest LSPs to mean */
  1618.       tmp += ( EXPCONST * lsp[i] ) << 1;
  1619.       /* Save means */
  1620.       tmp += 0x00008000L;
  1621.       st->lsp_meanSave[i] = tmp >> 16;
  1622.    }
  1623.    return;
  1624. }
  1625. /*
  1626.  * Int_lpc_1and3
  1627.  *
  1628.  *
  1629.  * Parameters:
  1630.  *    lsp_old        I: LSP vector at the 4th subfr. of past frame      [M]
  1631.  *    lsp_mid        I: LSP vector at the 2nd subframe of present frame [M]
  1632.  *    lsp_new        I: LSP vector at the 4th subframe of present frame [M]
  1633.  *    Az             O: interpolated LP parameters in subframes 1 and 3
  1634.  *                                                                   [AZ_SIZE]
  1635.  *
  1636.  * Function:
  1637.  *    Interpolates the LSPs and converts to LPC parameters
  1638.  *    to get a different LP filter in each subframe.
  1639.  *
  1640.  *    The 20 ms speech frame is divided into 4 subframes.
  1641.  *    The LSPs are quantized and transmitted at the 2nd and
  1642.  *    4th subframes (twice per frame) and interpolated at the
  1643.  *    1st and 3rd subframe.
  1644.  *
  1645.  * Returns:
  1646.  *    void
  1647.  */
  1648. static void Int_lpc_1and3( Word32 lsp_old[], Word32 lsp_mid[], Word32 lsp_new[],
  1649.       Word32 Az[] )
  1650. {
  1651.    Word32 lsp[M];
  1652.    Word32 i;
  1653.    /* lsp[i] = lsp_mid[i] * 0.5 + lsp_old[i] * 0.5 */
  1654.    for ( i = 0; i < 10; i++ ) {
  1655.       lsp[i] = ( lsp_mid[i] >> 1 ) + ( lsp_old[i] >> 1 );
  1656.    }
  1657.    /* Subframe 1 */
  1658.    Lsp_Az( lsp, Az );
  1659.    Az += MP1;
  1660.    /* Subframe 2 */
  1661.    Lsp_Az( lsp_mid, Az );
  1662.    Az += MP1;
  1663.    for ( i = 0; i < 10; i++ ) {
  1664.       lsp[i] = ( lsp_mid[i] >> 1 ) + ( lsp_new[i] >> 1 );
  1665.    }
  1666.    /* Subframe 3 */
  1667.    Lsp_Az( lsp, Az );
  1668.    Az += MP1;
  1669.    /* Subframe 4 */
  1670.    Lsp_Az( lsp_new, Az );
  1671.    return;
  1672. }
  1673. /*
  1674.  * Int_lpc_1to3
  1675.  *
  1676.  *
  1677.  * Parameters:
  1678.  *    lsp_old           I: LSP vector at the 4th subframe of past frame    [M]
  1679.  *    lsp_new           I: LSP vector at the 4th subframe of present frame [M]
  1680.  *    Az                O: interpolated LP parameters in all subframes
  1681.  *                                                                   [AZ_SIZE]
  1682.  *
  1683.  * Function:
  1684.  *    Interpolates the LSPs and converts to LPC parameters to get a different
  1685.  *    LP filter in each subframe.
  1686.  *
  1687.  *    The 20 ms speech frame is divided into 4 subframes.
  1688.  *    The LSPs are quantized and transmitted at the 4th
  1689.  *    subframes (once per frame) and interpolated at the
  1690.  *    1st, 2nd and 3rd subframe.
  1691.  *
  1692.  * Returns:
  1693.  *    void
  1694.  */
  1695. static void Int_lpc_1to3( Word32 lsp_old[], Word32 lsp_new[], Word32 Az[] )
  1696. {
  1697.    Word32 lsp[M];
  1698.    Word32 i;
  1699.    for ( i = 0; i < 10; i++ ) {
  1700.       lsp[i] = ( lsp_new[i] >> 2 ) + ( lsp_old[i] - ( lsp_old[i] >> 2 ) );
  1701.    }
  1702.    /* Subframe 1 */
  1703.    Lsp_Az( lsp, Az );
  1704.    Az += MP1;
  1705.    for ( i = 0; i < 10; i++ ) {
  1706.       lsp[i] = ( lsp_old[i] >> 1 ) + ( lsp_new[i] >> 1 );
  1707.    }
  1708.    /* Subframe 2 */
  1709.    Lsp_Az( lsp, Az );
  1710.    Az += MP1;
  1711.    for ( i = 0; i < 10; i++ ) {
  1712.       lsp[i] = ( lsp_old[i] >> 2 ) + ( lsp_new[i] - ( lsp_new[i] >> 2 ) );
  1713.    }
  1714.    /* Subframe 3 */
  1715.    Lsp_Az( lsp, Az );
  1716.    Az += MP1;
  1717.    /* Subframe 4 */
  1718.    Lsp_Az( lsp_new, Az );
  1719.    return;
  1720. }
  1721. /*
  1722.  * D_plsf_5
  1723.  *
  1724.  *
  1725.  * Parameters:
  1726.  *    st->past_lsf_q I: Past dequantized LFSs
  1727.  *    st->past_r_q      B: past quantized residual
  1728.  *    bfi               B: bad frame indicator
  1729.  *    indice            I: quantization indices of 3 submatrices, Q0
  1730.  *    lsp1_q            O: quantized 1st LSP vector
  1731.  *    lsp2_q            O: quantized 2nd LSP vector
  1732.  *
  1733.  * Function:
  1734.  *    Decodes the 2 sets of LSP parameters in a frame
  1735.  *    using the received quantization indices.
  1736.  *
  1737.  * Returns:
  1738.  *    void
  1739.  */
  1740. static void D_plsf_5( D_plsfState *st, Word16 bfi, Word16 *indice, Word32 *lsp1_q
  1741.       , Word32 *lsp2_q )
  1742. {
  1743.    Word32 lsf1_r[M], lsf2_r[M], lsf1_q[M], lsf2_q[M];
  1744.    Word32 i, temp1, temp2, sign;
  1745.    const Word32 *p_dico;
  1746.    /* if bad frame */
  1747.    if ( bfi != 0 ) {
  1748.       /* use the past LSFs slightly shifted towards their mean */
  1749.       for ( i = 0; i < M; i += 2 ) {
  1750.          /* lsfi_q[i] = ALPHA*st->past_lsf_q[i] + ONE_ALPHA*meanLsf[i]; */
  1751.          lsf1_q[i] = ( ( st->past_lsf_q[i] * ALPHA_122 ) >> 15 ) + ( ( mean_lsf_5[i]
  1752.                * ONE_ALPHA_122 ) >> 15 );
  1753.          lsf1_q[i + 1] = ( ( st->past_lsf_q[i + 1] * ALPHA_122 ) >> 15 ) + ( (
  1754.                mean_lsf_5[i + 1] * ONE_ALPHA_122 ) >> 15 );
  1755.       }
  1756.       memcpy( lsf2_q, lsf1_q, M <<2 );
  1757.       /* estimate past quantized residual to be used in next frame */
  1758.       for ( i = 0; i < M; i += 2 ) {
  1759.          /* temp  = meanLsf[i] +  st->past_r_q[i] * LSPPpred_facMR122; */
  1760.          temp1 = mean_lsf_5[i] + ( ( st->past_r_q[i] * LSP_PRED_FAC_MR122 ) >>
  1761.                15 );
  1762.          temp2 = mean_lsf_5[i + 1] +( ( st->past_r_q[i + 1] *LSP_PRED_FAC_MR122
  1763.                ) >> 15 );
  1764.          st->past_r_q[i] = lsf2_q[i] - temp1;
  1765.          st->past_r_q[i + 1] = lsf2_q[i + 1] -temp2;
  1766.       }
  1767.    }
  1768.    /* if good LSFs received */
  1769.    else {
  1770.       /* decode prediction residuals from 5 received indices */
  1771.       p_dico = &dico1_lsf_5[indice[0] << 2];
  1772.       lsf1_r[0] = *p_dico++;
  1773.       lsf1_r[1] = *p_dico++;
  1774.       lsf2_r[0] = *p_dico++;
  1775.       lsf2_r[1] = *p_dico++;
  1776.       p_dico = &dico2_lsf_5[indice[1] << 2];
  1777.       lsf1_r[2] = *p_dico++;
  1778.       lsf1_r[3] = *p_dico++;
  1779.       lsf2_r[2] = *p_dico++;
  1780.       lsf2_r[3] = *p_dico++;
  1781.       sign = ( Word16 )( indice[2] & 1 );
  1782.       i = indice[2] >> 1;
  1783.       p_dico = &dico3_lsf_5[i << 2];
  1784.       if ( sign == 0 ) {
  1785.          lsf1_r[4] = *p_dico++;
  1786.          lsf1_r[5] = *p_dico++;
  1787.          lsf2_r[4] = *p_dico++;
  1788.          lsf2_r[5] = *p_dico++;
  1789.       }
  1790.       else {
  1791.          lsf1_r[4] = ( Word16 )( -( *p_dico++ ) );
  1792.          lsf1_r[5] = ( Word16 )( -( *p_dico++ ) );
  1793.          lsf2_r[4] = ( Word16 )( -( *p_dico++ ) );
  1794.          lsf2_r[5] = ( Word16 )( -( *p_dico++ ) );
  1795.       }
  1796.       p_dico = &dico4_lsf_5[( indice[3]<<2 )];
  1797.       lsf1_r[6] = *p_dico++;
  1798.       lsf1_r[7] = *p_dico++;
  1799.       lsf2_r[6] = *p_dico++;
  1800.       lsf2_r[7] = *p_dico++;
  1801.       p_dico = &dico5_lsf_5[( indice[4]<<2 )];
  1802.       lsf1_r[8] = *p_dico++;
  1803.       lsf1_r[9] = *p_dico++;
  1804.       lsf2_r[8] = *p_dico++;
  1805.       lsf2_r[9] = *p_dico++;
  1806.       /* Compute quantized LSFs and update the past quantized residual */
  1807.       for ( i = 0; i < M; i++ ) {
  1808.          temp1 = mean_lsf_5[i] + ( ( st->past_r_q[i] * LSP_PRED_FAC_MR122 ) >>
  1809.                15 );
  1810.          lsf1_q[i] = lsf1_r[i] + temp1;
  1811.          lsf2_q[i] = lsf2_r[i] + temp1;
  1812.          st->past_r_q[i] = lsf2_r[i];
  1813.       }
  1814.    }
  1815.    /* verification that LSFs have minimum distance of LSF_GAP Hz */
  1816.    Reorder_lsf( lsf1_q, LSF_GAP );
  1817.    Reorder_lsf( lsf2_q, LSF_GAP );
  1818.    memcpy( st->past_lsf_q, lsf2_q, M <<2 );
  1819.    /*  convert LSFs to the cosine domain */
  1820.    Lsf_lsp( lsf1_q, lsp1_q );
  1821.    Lsf_lsp( lsf2_q, lsp2_q );
  1822.    return;
  1823. }
  1824. /*
  1825.  * Dec_lag3
  1826.  *
  1827.  *
  1828.  * Parameters:
  1829.  *    index             I: received pitch index
  1830.  *    t0_min            I: minimum of search range
  1831.  *    t0_max            I: maximum of search range
  1832.  *    i_subfr           I: subframe flag
  1833.  *    T0_prev           I: integer pitch delay of last subframe used
  1834.  *                         in 2nd and 4th subframes
  1835.  *    T0                O: integer part of pitch lag
  1836.  *    T0_frac           O : fractional part of pitch lag
  1837.  *    flag4             I : flag for encoding with 4 bits
  1838.  * Function:
  1839.  *    Decoding of fractional pitch lag with 1/3 resolution.
  1840.  *    Extract the integer and fraction parts of the pitch lag from
  1841.  *    the received adaptive codebook index.
  1842.  *
  1843.  *    The fractional lag in 1st and 3rd subframes is encoded with 8 bits
  1844.  *    while that in 2nd and 4th subframes is relatively encoded with 4, 5
  1845.  *    and 6 bits depending on the mode.
  1846.  *
  1847.  * Returns:
  1848.  *    void
  1849.  */
  1850. static void Dec_lag3( Word32 index, Word32 t0_min, Word32 t0_max, Word32 i_subfr
  1851.       , Word32 T0_prev, Word32 *T0, Word32 *T0_frac, Word32 flag4 )
  1852. {
  1853.    Word32 i, tmp_lag;
  1854.    /* if 1st or 3rd subframe */
  1855.    if ( i_subfr == 0 ) {
  1856.       if ( index < 197 ) {
  1857.          *T0 = ( ( ( index + 2 ) * 10923 ) >> 15 ) + 19;
  1858.          i = *T0 + *T0 + *T0;
  1859.          *T0_frac = ( index - i ) + 58;
  1860.       }
  1861.       else {
  1862.          *T0 = index - 112;
  1863.          *T0_frac = 0;
  1864.       }
  1865.    }
  1866.    /* 2nd or 4th subframe */
  1867.    else {
  1868.       if ( flag4 == 0 ) {
  1869.          /* 'normal' decoding: either with 5 or 6 bit resolution */
  1870.          i = ( ( ( index + 2 ) * 10923 ) >> 15 ) - 1;
  1871.          *T0 = i + t0_min;
  1872.          i = i + i + i;
  1873.          *T0_frac = ( index - 2 ) - i;
  1874.       }
  1875.       else {
  1876.          /* decoding with 4 bit resolution */
  1877.          tmp_lag = T0_prev;
  1878.          if ( ( tmp_lag - t0_min ) > 5 )
  1879.             tmp_lag = t0_min + 5;
  1880.          if ( ( t0_max - tmp_lag ) > 4 )
  1881.             tmp_lag = t0_max - 4;
  1882.          if ( index < 4 ) {
  1883.             i = ( tmp_lag - 5 );
  1884.             *T0 = i + index;
  1885.             *T0_frac = 0;
  1886.          }
  1887.          else {
  1888.             if ( index < 12 ) {
  1889.                i = ( ( ( index - 5 ) * 10923 ) >> 15 ) - 1;
  1890.                *T0 = i + tmp_lag;
  1891.                i = i + i + i;
  1892.                *T0_frac = ( index - 9 ) - i;
  1893.             }
  1894.             else {
  1895.                i = ( index - 12 ) + tmp_lag;
  1896.                *T0 = i + 1;
  1897.                *T0_frac = 0;
  1898.             }
  1899.          }
  1900.       }   /* end if (decoding with 4 bit resolution) */
  1901.    }
  1902.    return;
  1903. }
  1904. /*
  1905.  * Pred_lt_3or6_40
  1906.  *
  1907.  *
  1908.  * Parameters:
  1909.  *    exc               B: excitation buffer
  1910.  *    T0                I: integer pitch lag
  1911.  *    frac              I: fraction of lag
  1912.  *    flag3             I: if set, upsampling rate = 3 (6 otherwise)
  1913.  *
  1914.  * Function:
  1915.  *    Compute the result of long term prediction with fractional
  1916.  *    interpolation of resolution 1/3 or 1/6. (Interpolated past excitation).
  1917.  *
  1918.  *    Once the fractional pitch lag is determined,
  1919.  *    the adaptive codebook vector v(n) is computed by interpolating
  1920.  *    the past excitation signal u(n) at the given integer delay k
  1921.  *    and phase (fraction)  :
  1922.  *
  1923.  *          9                       9
  1924.  *    v(n) = SUM[ u(n-k-i) * b60(t+i*6) ] + SUM[ u(n-k+1+i) * b60(6-t+i*6) ],
  1925.  *          i=0                       i=0
  1926.  *    n = 0, ...,39, t = 0, ...,5.
  1927.  *
  1928.  *    The interpolation filter b60 is based on a Hamming windowed sin(x)/x
  1929.  *    function truncated at