sp_enc.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:315k
源码类别:

Symbian

开发平台:

C/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_enc.c
  12.  *
  13.  *
  14.  * Project:
  15.  *    AMR Floating-Point Codec
  16.  *
  17.  * Contains:
  18.  *    This module contains all the functions needed encoding 160
  19.  *    16-bit speech samples to AMR encoder parameters.
  20.  *
  21.  */
  22. #include <stdlib.h>
  23. #include <stdio.h>
  24. #include "hlxclib/memory.h"
  25. #include <math.h>
  26. #include <float.h>
  27. #include "sp_enc.h"
  28. #include "rom_enc.h"
  29. /*
  30.  * Definition of structures used in encoding process
  31.  */
  32. typedef struct
  33. {
  34.    Float32 y2;
  35.    Float32 y1;
  36.    Float32 x0;
  37.    Float32 x1;
  38. }Pre_ProcessState;
  39. #ifdef VAD2
  40. /* Defines for VAD2 */
  41. #define FRM_LEN1 80
  42. #define DELAY0 24
  43. #define FFT_LEN1 128
  44. #define UPDATE_CNT_THLD1 50
  45. #define INIT_FRAMES 4
  46. #define CNE_SM_FAC1 0.1
  47. #define CEE_SM_FAC1 0.55
  48. #define HYSTER_CNT_THLD1 6 /* forced update constants... */
  49. #define HIGH_ALPHA1 0.9
  50. #define LOW_ALPHA1 0.7
  51. #define ALPHA_RANGE1 (HIGH_ALPHA1-LOW_ALPHA1)
  52. #define NORM_ENRG (4.0) /* account for div by 2 by the HPF */
  53. #define MIN_CHAN_ENRG (0.0625 / NORM_ENRG)
  54. #define INE (16.0 / NORM_ENRG)
  55. #define NOISE_FLOOR (1.0 / NORM_ENRG)
  56. #define PRE_EMP_FAC1 (-0.8)
  57. #define NUM_CHAN 16
  58. #define LO_CHAN 0
  59. #define HI_CHAN 15
  60. #define UPDATE_THLD 35
  61. #define SINE_START_CHAN 2
  62. #define P2A_THRESH 10.0
  63. #define DEV_THLD1 28.0
  64. /* Defines for the FFT function */
  65. #define SIZE 128
  66. #define SIZE_BY_TWO 64
  67. #define NUM_STAGE 6
  68. #define PI 3.141592653589793
  69. #define TRUE 1
  70. #define FALSE 0
  71. /* Macros */
  72. #define min(a,b) ((a)<(b)?(a):(b))
  73. #define max(a,b) ((a)>(b)?(a):(b))
  74. #define square(a) ((a)*(a))
  75. /* structures */
  76. typedef struct
  77. {
  78.   Float32 pre_emp_mem;
  79.   Word16  update_cnt;
  80.   Word16  hyster_cnt;
  81.   Word16  last_update_cnt;
  82.   Float32 ch_enrg_long_db[NUM_CHAN];
  83.   Word32  Lframe_cnt;
  84.   Float32 ch_enrg[NUM_CHAN];
  85.   Float32 ch_noise[NUM_CHAN];
  86.   Float32 tsnr;
  87.   Word16  hangover;
  88.   Word16  burstcount;
  89.   Word16  fupdate_flag;
  90.   Float32 negSNRvar;
  91.   Float32 negSNRbias;
  92.   Float32 R0;
  93.   Float32 Rmax;
  94.   Word16  LTP_flag;
  95. }vadState;
  96. #else
  97. typedef struct
  98. {
  99.    Float32 bckr_est[COMPLEN];   /* background noise estimate */
  100.    Float32 ave_level[COMPLEN];
  101.    /* averaged input components for stationary estimation */
  102.    Float32 old_level[COMPLEN];   /* input levels of the previous frame */
  103.    Float32 sub_level[COMPLEN];
  104.    /* input levels calculated at the end of a frame (lookahead) */
  105.    Float32 a_data5[3][2];   /* memory for the filter bank */
  106.    Float32 a_data3[5];   /* memory for the filter bank */
  107.    Float32 best_corr_hp;   /* FIP filtered value */
  108.    /* counts length of a speech burst incl HO addition */
  109.    Float32 corr_hp_fast;   /* filtered value */
  110.    Word32 vadreg;   /* flags for intermediate VAD decisions */
  111.    Word32 pitch;   /* flags for pitch detection */
  112.    Word32 oldlag_count, oldlag;   /* variables for pitch detection */
  113.    Word32 complex_high;   /* flags for complex detection */
  114.    Word32 complex_low;   /* flags for complex detection */
  115.    Word32 complex_warning;   /* complex background warning */
  116.    Word32 tone;   /* flags for tone detection */
  117.    Word16 burst_count;   /* counts length of a speech burst */
  118.    Word16 hang_count;   /* hangover counter */
  119.    Word16 stat_count;   /* stationary counter */
  120.    Word16 complex_hang_count;   /* complex hangover counter, used by VAD */
  121.    Word16 complex_hang_timer;   /* hangover initiator, used by CAD */
  122.    Word16 speech_vad_decision;   /* final decision */
  123.    Word16 sp_burst_count;
  124. }vadState;
  125. #endif
  126. #define DTX_HIST_SIZE 8
  127. #define DTX_ELAPSED_FRAMES_THRESH (24 + 7 -1)
  128. #define DTX_HANG_CONST 7   /* yields eight frames of SP HANGOVER */
  129. typedef struct
  130. {
  131.    Float32 lsp_hist[M * DTX_HIST_SIZE];
  132.    Float32 log_en_hist[DTX_HIST_SIZE];
  133.    Word32 init_lsf_vq_index;
  134.    Word16 hist_ptr;
  135.    Word16 log_en_index;
  136.    Word16 lsp_index[3];
  137.    /* DTX handler stuff */
  138.    Word16 dtxHangoverCount;
  139.    Word16 decAnaElapsedCount;
  140. }dtx_encState;
  141. typedef struct
  142. {
  143.    /* gain history */
  144.    Float32 gp[N_FRAME];
  145.    /* counters */
  146.    Word16 count;
  147. }tonStabState;
  148. typedef struct
  149. {
  150.    Word32 past_qua_en[4];
  151.    /* normal MA predictor memory, (contains 20*log10(qua_err)) */
  152. }gc_predState;
  153. typedef struct
  154. {
  155.    Float32 prev_alpha;   /* previous adaptor output, */
  156.    Float32 prev_gc;   /* previous code gain, */
  157.    Float32 ltpg_mem[LTPG_MEM_SIZE];   /* LTP coding gain history, */
  158.    Word16 onset;   /* onset state, */
  159.    /* (ltpg_mem[0] not used for history) */
  160. }gain_adaptState;
  161. typedef struct
  162. {
  163.    Float32 sf0_target_en;
  164.    Float32 sf0_coeff[5];
  165.    Word32 sf0_gcode0_exp;
  166.    Word32 sf0_gcode0_fra;
  167.    Word16 *gain_idx_ptr;
  168.    gc_predState * gc_predSt;
  169.    gc_predState * gc_predUncSt;
  170.    gain_adaptState * adaptSt;
  171. }gainQuantState;
  172. typedef struct
  173. {
  174.    Word32 T0_prev_subframe;   /* integer pitch lag of previous sub-frame */
  175. }Pitch_frState;
  176. typedef struct
  177. {
  178.    Pitch_frState * pitchSt;
  179. }clLtpState;
  180. typedef struct
  181. {
  182.    Float32 ada_w;
  183.    Word32 old_T0_med;
  184.    Word16 wght_flg;
  185. }pitchOLWghtState;
  186. typedef struct
  187. {
  188.    Float32 past_rq[M];   /* Past quantized prediction error */
  189. }Q_plsfState;
  190. typedef struct
  191. {
  192.    /* Past LSPs */
  193.    Float32 lsp_old[M];
  194.    Float32 lsp_old_q[M];
  195.    /* Quantization state */
  196.    Q_plsfState * qSt;
  197. }lspState;
  198. typedef struct
  199. {
  200.    Float32 old_A[M + 1];   /* Last A(z) for case of unstable filter */
  201. }LevinsonState;
  202. typedef struct
  203. {
  204.    LevinsonState * LevinsonSt;
  205. }lpcState;
  206. typedef struct
  207. {
  208.    /* Speech vector */
  209.    Float32 old_speech[L_TOTAL];
  210.    Float32 *speech, *p_window, *p_window_12k2;
  211.    Float32 *new_speech;   /* Global variable */
  212.    /* Weight speech vector */
  213.    Float32 old_wsp[L_FRAME + PIT_MAX];
  214.    Float32 *wsp;
  215.    /* OL LTP states */
  216.    Word32 old_lags[5];
  217.    Float32 ol_gain_flg[2];
  218.    /* Excitation vector */
  219.    Float32 old_exc[L_FRAME + PIT_MAX + L_INTERPOL];
  220.    Float32 *exc;
  221.    /* Zero vector */
  222.    Float32 ai_zero[L_SUBFR + MP1];
  223.    Float32 *zero;
  224.    /* Impulse response vector */
  225.    Float32 *h1;
  226.    Float32 hvec[L_SUBFR * 2];
  227.    /* Substates */
  228.    lpcState * lpcSt;
  229.    lspState * lspSt;
  230.    clLtpState * clLtpSt;
  231.    gainQuantState * gainQuantSt;
  232.    pitchOLWghtState * pitchOLWghtSt;
  233.    tonStabState * tonStabSt;
  234.    vadState * vadSt;
  235.    Word32 dtx;
  236.    dtx_encState * dtxEncSt;
  237.    /* Filter's memory */
  238.    Float32 mem_syn[M], mem_w0[M], mem_w[M];
  239.    Float32 mem_err[M + L_SUBFR], *error;
  240.    Float32 sharp;
  241. }cod_amrState;
  242. typedef struct
  243. {
  244.    cod_amrState * cod_amr_state;
  245.    Pre_ProcessState * pre_state;
  246.    Word32 dtx;
  247. }Speech_Encode_FrameState;
  248. /*
  249.  * Dotproduct40
  250.  *
  251.  *
  252.  * Parameters:
  253.  *    x                 I: First input
  254.  *    y                 I: Second input
  255.  * Function:
  256.  *    Computes dot product size 40
  257.  *
  258.  * Returns:
  259.  *    acc                dot product
  260.  */
  261. static Float64 Dotproduct40( Float32 *x, Float32 *y )
  262. {
  263.    Float64 acc;
  264.    acc = x[0] * y[0] + x[1] * y[1] + x[2] * y[2] + x[3] * y[3];
  265.    acc += x[4] * y[4] + x[5] * y[5] + x[6] * y[6] + x[7] * y[7];
  266.    acc += x[8] * y[8] + x[9] * y[9] + x[10] * y[10] + x[11] * y[11];
  267.    acc += x[12] * y[12] + x[13] * y[13] + x[14] * y[14] + x[15] * y[15];
  268.    acc += x[16] * y[16] + x[17] * y[17] + x[18] * y[18] + x[19] * y[19];
  269.    acc += x[20] * y[20] + x[21] * y[21] + x[22] * y[22] + x[23] * y[23];
  270.    acc += x[24] * y[24] + x[25] * y[25] + x[26] * y[26] + x[27] * y[27];
  271.    acc += x[28] * y[28] + x[29] * y[29] + x[30] * y[30] + x[31] * y[31];
  272.    acc += x[32] * y[32] + x[33] * y[33] + x[34] * y[34] + x[35] * y[35];
  273.    acc += x[36] * y[36] + x[37] * y[37] + x[38] * y[38] + x[39] * y[39];
  274.    return( acc );
  275. }
  276. /*
  277.  * Autocorr
  278.  *
  279.  *
  280.  * Parameters:
  281.  *    x                 I: Input signal
  282.  *    r                 O: Autocorrelations
  283.  *    wind              I: Window for LPC analysis
  284.  * Function:
  285.  *    Calculate autocorrelation with window, LPC order = M
  286.  *
  287.  * Returns:
  288.  *    void
  289.  */
  290. static void Autocorr( Float32 x[], Float32 r[], const Float32 wind[] )
  291. {
  292.    Word32 i, j;   /* Counters */
  293.    Float32 y[L_WINDOW + M + 1];   /* Windowed signal */
  294.    Float64 sum;   /* temp */
  295.    /*
  296.     * Windowing of signal
  297.     */
  298.    for ( i = 0; i < L_WINDOW; i++ ) {
  299.       y[i] = x[i] * wind[i];
  300.    }
  301.    /*
  302.     * Zero remaining memory
  303.     */
  304.    memset( &y[L_WINDOW], 0, 44 );
  305.    /*
  306.     * Autocorrelation
  307.     */
  308.    for ( i = 0; i <= M; i++ ) {
  309.       sum = 0;
  310.       for ( j = 0; j < L_WINDOW; j += 40 ) {
  311.          sum += Dotproduct40( &y[j], &y[j + i] );
  312.       }
  313.       r[i] = (Float32)sum;
  314.    }
  315. }
  316. /*
  317.  * Levinson
  318.  *
  319.  *
  320.  * Parameters:
  321.  *    old_A             I: Vector of old LP coefficients [M+1]
  322.  *    r                 I: Vector of autocorrelations    [M+1]
  323.  *    a                 O: LP coefficients               [M+1]
  324.  *    rc                O: Reflection coefficients       [4]
  325.  * Function:
  326.  *    Levinson-Durbin algorithm
  327.  *
  328.  * Returns:
  329.  *    void
  330.  *
  331.  */
  332. static void Levinson( Float32 *old_A, Float32 *r, Float32 *A, Float32 *rc )
  333. {
  334.    Float32 sum, at, err;
  335.    Word32 l, j, i;
  336.    Float32 rct[M];   /* temporary reflection coefficients  0,...,m-1 */
  337.    rct[0] = ( -r[1] ) / r[0];
  338.    A[0] = 1.0F;
  339.    A[1] = rct[0];
  340.    err = r[0] + r[1] * rct[0];
  341.    if ( err <= 0.0 )
  342.       err = 0.01F;
  343.    for ( i = 2; i <= M; i++ ) {
  344.       sum = 0.0F;
  345.       for ( j = 0; j < i; j++ )
  346.          sum += r[i - j] * A[j];
  347.       rct[i - 1] = ( -sum ) / ( err );
  348.       for ( j = 1; j <= ( i / 2 ); j++ ) {
  349.          l = i - j;
  350.          at = A[j] + rct[i - 1] *A[l];
  351.          A[l] += rct[i - 1] *A[j];
  352.          A[j] = at;
  353.       }
  354.       A[i] = rct[i - 1];
  355.       err += rct[i - 1] *sum;
  356.       if ( err <= 0.0 )
  357.          err = 0.01F;
  358.    }
  359.    memcpy( rc, rct, 4 * sizeof( Float32 ) );
  360.    memcpy( old_A, A, MP1 * sizeof( Float32 ) );
  361. }
  362. /*
  363.  * lpc
  364.  *
  365.  *
  366.  * Parameters:
  367.  *    old_A             O: Vector of old LP coefficients [M+1]
  368.  *    x                 I: Input signal
  369.  *    x_12k2            I: Input signal 12.2k
  370.  *    a                 O: predictor coefficients
  371.  *    mode              I: AMR mode
  372.  * Function:
  373.  *    LP analysis
  374.  *
  375.  *    In 12.2 kbit/s mode linear prediction (LP) analysis is performed
  376.  *    twice per speech frame using the auto-correlation approach with
  377.  *    30 ms asymmetric windows. No lookahead is used in
  378.  *    the auto-correlation computation.
  379.  *
  380.  *    In other modes analysis is performed once per speech frame
  381.  *    using the auto-correlation approach with 30 ms asymmetric windows.
  382.  *    A lookahead of 40 samples (5 ms) is used in the auto-correlation computation.
  383.  *
  384.  *    The auto-correlations of windowed speech are converted to the LP
  385.  *    coefficients using the Levinson-Durbin algorithm.
  386.  *    Then the LP coefficients are transformed to the Line Spectral Pair
  387.  *    (LSP) domain  for quantization and interpolation purposes.
  388.  *    The interpolated quantified and unquantized filter coefficients
  389.  *    are converted back to the LP filter coefficients
  390.  *    (to construct the synthesis and weighting filters at each subframe).
  391.  *
  392.  * Returns:
  393.  *    void
  394.  *
  395.  */
  396. static void lpc( Float32 *old_A, Float32 x[], Float32 x_12k2[], Float32 a[], enum Mode
  397.       mode )
  398. {
  399.    Word32 i;
  400.    Float32 r[MP1];
  401.    Float32 rc[4];
  402.    if ( mode == MR122 ) {
  403.       Autocorr( x_12k2, r, window_160_80 );
  404.       /*
  405.        * Lag windowing
  406.        */
  407.       for ( i = 1; i <= M; i++ ) {
  408.          r[i] = r[i] * lag_wind[i - 1];
  409.       }
  410.       r[0] *= 1.0001F;
  411.       if ( r[0] < 1.0F )
  412.          r[0] = 1.0F;
  413.       /*
  414.        * Levinson Durbin
  415.        */
  416.       Levinson( old_A, r, &a[MP1], rc );
  417.       /*
  418.        * Autocorrelations
  419.        */
  420.       Autocorr( x_12k2, r, window_232_8 );
  421.       /*
  422.        * Lag windowing
  423.        */
  424.       for ( i = 1; i <= M; i++ ) {
  425.          r[i] = r[i] * lag_wind[i - 1];
  426.       }
  427.       r[0] *= 1.0001F;
  428.       if ( r[0] < 1.0F )
  429.          r[0] = 1.0F;
  430.       /*
  431.        * Levinson Durbin
  432.        */
  433.       Levinson( old_A, r, &a[MP1 * 3], rc );
  434.    }
  435.    else {
  436.       /*
  437.        * Autocorrelations
  438.        */
  439.       Autocorr( x, r, window_200_40 );
  440.       /*
  441.        * a 60 Hz bandwidth expansion is used by lag windowing
  442.        * the auto-correlations. Further, auto-correlation[0] is
  443.        * multiplied by the white noise correction factor 1.0001
  444.        * which is equivalent to adding a noise floor at -40 dB.
  445.        */
  446.       for ( i = 1; i <= M; i++ ) {
  447.          r[i] = r[i] * lag_wind[i - 1];
  448.       }
  449.       r[0] *= 1.0001F;
  450.       if ( r[0] < 1.0F )
  451.          r[0] = 1.0F;
  452.       /*
  453.        * Levinson Durbin
  454.        */
  455.       Levinson( old_A, r, &a[MP1 * 3], rc );
  456.    }
  457. }
  458. /*
  459.  * Chebps
  460.  *
  461.  *
  462.  * Parameters:
  463.  *    x                 I: Cosine value for the freqency given
  464.  *    f                 I: angular freqency
  465.  * Function:
  466.  *    Evaluates the Chebyshev polynomial series
  467.  *
  468.  * Returns:
  469.  *    result of polynomial evaluation
  470.  */
  471. static Float32 Chebps( Float32 x, Float32 f[] )
  472. {
  473.    Float32 b0, b1, b2, x2;
  474.    Word32 i;
  475.    x2 = 2.0F * x;
  476.    b2 = 1.0F;
  477.    b1 = x2 + f[1];
  478.    for ( i = 2; i < 5; i++ ) {
  479.       b0 = x2 * b1 - b2 + f[i];
  480.       b2 = b1;
  481.       b1 = b0;
  482.    }
  483.    return( x * b1 - b2 + f[i] );
  484. }
  485. /*
  486.  * Az_lsp
  487.  *
  488.  *
  489.  * Parameters:
  490.  *    a                 I: Predictor coefficients              [MP1]
  491.  *    lsp               O: Line spectral pairs                 [M]
  492.  *    old_lsp           I: Old lsp, in case not found 10 roots [M]
  493.  *
  494.  * Function:
  495.  *    LP to LSP conversion
  496.  *
  497.  *    The LP filter coefficients A[], are converted to the line spectral pair
  498.  *    (LSP) representation for quantization and interpolation purposes.
  499.  *
  500.  * Returns:
  501.  *    void
  502.  */
  503. static void Az_lsp( Float32 a[], Float32 lsp[], Float32 old_lsp[] )
  504. {
  505.    Word32 i, j, nf, ip;
  506.    Float32 xlow, ylow, xhigh, yhigh, xmid, ymid, xint;
  507.    Float32 y;
  508.    Float32 *coef;
  509.    Float32 f1[6], f2[6];
  510.    /*
  511.     *  find the sum and diff. pol. F1(z) and F2(z)
  512.     */
  513.    f1[0] = 1.0F;
  514.    f2[0] = 1.0F;
  515.    for ( i = 0; i < ( NC ); i++ ) {
  516.       f1[i + 1] = a[i + 1] +a[M - i] - f1[i];
  517.       f2[i + 1] = a[i + 1] -a[M - i] + f2[i];
  518.    }
  519.    f1[NC] *= 0.5F;
  520.    f2[NC] *= 0.5F;
  521.    /*
  522.     * find the LSPs using the Chebychev pol. evaluation
  523.     */
  524.    nf = 0;   /* number of found frequencies */
  525.    ip = 0;   /* indicator for f1 or f2 */
  526.    coef = f1;
  527.    xlow = grid[0];
  528.    ylow = Chebps( xlow, coef );
  529.    j = 0;
  530.    while ( ( nf < M ) && ( j < 60 ) ) {
  531.       j++;
  532.       xhigh = xlow;
  533.       yhigh = ylow;
  534.       xlow = grid[j];
  535.       ylow = Chebps( xlow, coef );
  536.       if ( ylow * yhigh <= 0 ) {
  537.          /* divide 4 times the interval */
  538.          for ( i = 0; i < 4; i++ ) {
  539.             xmid = ( xlow + xhigh ) * 0.5F;
  540.             ymid = Chebps( xmid, coef );
  541.             if ( ylow * ymid <= 0.0F ) {
  542.                yhigh = ymid;
  543.                xhigh = xmid;
  544.             }
  545.             else {
  546.                ylow = ymid;
  547.                xlow = xmid;
  548.             }
  549.          }
  550.          /*
  551.           * Linear interpolation
  552.           * xint = xlow - ylow*(xhigh-xlow)/(yhigh-ylow)
  553.           */
  554.          y = yhigh - ylow;
  555.          if ( y == 0 ) {
  556.             xint = xlow;
  557.          }
  558.          else {
  559.             y = ( xhigh - xlow ) / ( yhigh - ylow );
  560.             xint = xlow - ylow * y;
  561.          }
  562.          lsp[nf] = xint;
  563.          xlow = xint;
  564.          nf++;
  565.          if ( ip == 0 ) {
  566.             ip = 1;
  567.             coef = f2;
  568.          }
  569.          else {
  570.             ip = 0;
  571.             coef = f1;
  572.          }
  573.          ylow = Chebps( xlow, coef );
  574.       }
  575.    }
  576.    /* Check if M roots found */
  577.    if ( nf < M ) {
  578.       memcpy( lsp, old_lsp, M <<2 );
  579.    }
  580.    return;
  581. }
  582. /*
  583.  * Get_lsp_pol
  584.  *
  585.  *
  586.  * Parameters:
  587.  *    lsp                 I: line spectral frequencies
  588.  *    f                   O: polynomial F1(z) or F2(z)
  589.  *
  590.  * Function:
  591.  *    Find the polynomial F1(z) or F2(z) from the LSPs.
  592.  *
  593.  *    F1(z) = product ( 1 - 2 lsp[i] z^-1 + z^-2 )
  594.  *             i=0,2,4,6,8
  595.  *    F2(z) = product   ( 1 - 2 lsp[i] z^-1 + z^-2 )
  596.  *             i=1,3,5,7,9
  597.  *
  598.  *    where lsp[] is the LSP vector in the cosine domain.
  599.  *
  600.  *    The expansion is performed using the following recursion:
  601.  *
  602.  *    f[0] = 1
  603.  *    b = -2.0 * lsp[0]
  604.  *    f[1] = b
  605.  *    for i=2 to 5 do
  606.  *       b = -2.0 * lsp[2*i-2];
  607.  *       f[i] = b*f[i-1] + 2.0*f[i-2];
  608.  *       for j=i-1 down to 2 do
  609.  *          f[j] = f[j] + b*f[j-1] + f[j-2];
  610.  *       f[1] = f[1] + b;
  611.  *
  612.  * Returns:
  613.  *    void
  614.  */
  615. static void Get_lsp_pol( Float32 *lsp, Float32 *f )
  616. {
  617.    Word32 i, j;
  618.    Float32 T0;
  619.    f[0] = 1.0F;
  620.    f[1] = -2.0F * lsp[0];
  621.    for ( i = 2; i <= 5; i++ ) {
  622.       T0 = -2.0F * lsp[2 * i - 2];
  623.       f[i] = ( Float32 )( T0 * f[i - 1] +2.0F * f[i - 2] );
  624.       for ( j = i - 1; j >= 2; j-- ) {
  625.          f[j] = f[j] + T0 * f[j - 1] +f[j - 2];
  626.       }
  627.       f[1] = f[1] + T0;
  628.    }
  629.    return;
  630. }
  631. /*
  632.  * Lsp_Az
  633.  *
  634.  *
  635.  * Parameters:
  636.  *    lsp                 I: Line spectral frequencies
  637.  *    a                   O: Predictor coefficients
  638.  *
  639.  * Function:
  640.  *    Converts from the line spectral pairs (LSP) to LP coefficients,
  641.  *    for a 10th order filter.
  642.  *
  643.  * Returns:
  644.  *    void
  645.  */
  646. static void Lsp_Az( Float32 lsp[], Float32 a[] )
  647. {
  648.    Float32 f1[6], f2[6];
  649.    Word32 i, j;
  650.    Get_lsp_pol( &lsp[0], f1 );
  651.    Get_lsp_pol( &lsp[1], f2 );
  652.    for ( i = 5; i > 0; i-- ) {
  653.       f1[i] += f1[i - 1];
  654.       f2[i] -= f2[i - 1];
  655.    }
  656.    a[0] = 1;
  657.    for ( i = 1, j = 10; i <= 5; i++, j-- ) {
  658.       a[i] = ( Float32 )( ( f1[i] + f2[i] ) * 0.5F );
  659.       a[j] = ( Float32 )( ( f1[i] - f2[i] ) * 0.5F );
  660.    }
  661.    return;
  662. }
  663. /*
  664.  * Int_lpc_1and3_2
  665.  *
  666.  *
  667.  * Parameters:
  668.  *    lsp_old        I: LSP vector at the 4th subfr. of past frame      [M]
  669.  *    lsp_mid        I: LSP vector at the 2nd subframe of present frame [M]
  670.  *    lsp_new        I: LSP vector at the 4th subframe of present frame [M]
  671.  *    az             O: interpolated LP parameters in subframes 1 and 3
  672.  *                                                                [AZ_SIZE]
  673.  *
  674.  * Function:
  675.  *    Interpolation of the LPC parameters. Same as the Int_lpc
  676.  *    function but we do not recompute Az() for subframe 2 and
  677.  *    4 because it is already available.
  678.  *
  679.  * Returns:
  680.  *    void
  681.  */
  682. static void Int_lpc_1and3_2( Float32 lsp_old[], Float32 lsp_mid[], Float32
  683.       lsp_new[], Float32 az[] )
  684. {
  685.    Float32 lsp[M];
  686.    Word32 i;
  687.    for ( i = 0; i < M; i += 2 ) {
  688.       lsp[i] = ( lsp_mid[i] + lsp_old[i] ) * 0.5F;
  689.       lsp[i + 1] = ( lsp_mid[i + 1] +lsp_old[i+1] )*0.5F;
  690.    }
  691.    /* Subframe 1 */
  692.    Lsp_Az( lsp, az );
  693.    az += MP1 * 2;
  694.    for ( i = 0; i < M; i += 2 ) {
  695.       lsp[i] = ( lsp_mid[i] + lsp_new[i] ) * 0.5F;
  696.       lsp[i + 1] = ( lsp_mid[i + 1] +lsp_new[i+1] )*0.5F;
  697.    }
  698.    /* Subframe 3 */
  699.    Lsp_Az( lsp, az );
  700.    return;
  701. }
  702. /*
  703.  * Lsp_lsf
  704.  *
  705.  *
  706.  * Parameters:
  707.  *    lsp               I: LSP vector
  708.  *    lsf               O: LSF vector
  709.  *
  710.  * Function:
  711.  *    Transformation lsp to lsf, LPC order M
  712.  *
  713.  * Returns:
  714.  *    void
  715.  */
  716. static void Lsp_lsf( Float32 lsp[], Float32 lsf[] )
  717. {
  718.    Word32 i;
  719.    for ( i = 0; i < M; i++ ) {
  720.       lsf[i] = ( Float32 )( acos( lsp[i] )*SCALE_LSP_FREQ );
  721.    }
  722.    return;
  723. }
  724. /*
  725.  * Lsf_wt
  726.  *
  727.  *
  728.  * Parameters:
  729.  *    lsf               I: LSF vector
  730.  *    wf                O: square of weighting factors
  731.  *
  732.  * Function:
  733.  *    Compute LSF weighting factors
  734.  *
  735.  * Returns:
  736.  *    void
  737.  */
  738. static void Lsf_wt( Float32 *lsf, Float32 *wf )
  739. {
  740.    Float32 temp;
  741.    Word32 i;
  742.    wf[0] = lsf[1];
  743.    for ( i = 1; i < 9; i++ ) {
  744.       wf[i] = lsf[i + 1] -lsf[i - 1];
  745.    }
  746.    wf[9] = 4000.0F - lsf[8];
  747.    for ( i = 0; i < 10; i++ ) {
  748.       if ( wf[i] < 450.0F ) {
  749.          temp = 3.347F - SLOPE1_WGHT_LSF * wf[i];
  750.       }
  751.       else {
  752.          temp = 1.8F - SLOPE2_WGHT_LSF * ( wf[i] - 450.0F );
  753.       }
  754.       wf[i] = temp * temp;
  755.    }
  756.    return;
  757. }
  758. /*
  759.  * Vq_subvec
  760.  *
  761.  *
  762.  * Parameters:
  763.  *    lsf_r1            I: 1st LSF residual vector
  764.  *    lsf_r2            I: 2nd LSF residual vector
  765.  *    dico              I: quantization codebook
  766.  *    wf1               I: 1st LSF weighting factors
  767.  *    wf2               I: 2nd LSF weighting factors
  768.  *    dico_size         I: size of quantization codebook
  769.  * Function:
  770.  *    Quantization of a 4 dimensional subvector
  771.  *
  772.  * Returns:
  773.  *    index             quantization index
  774.  */
  775. static Word16 Vq_subvec( Float32 *lsf_r1, Float32 *lsf_r2, const Float32 *dico,
  776.       Float32 *wf1, Float32 *wf2, Word16 dico_size )
  777. {
  778.    Float64 temp, dist, dist_min;
  779.    const Float32 *p_dico;
  780.    Word32 i, index = 0;
  781.    dist_min = DBL_MAX;
  782.    p_dico = dico;
  783.    for ( i = 0; i < dico_size; i++ ) {
  784.       temp = lsf_r1[0] - *p_dico++;
  785.       dist = temp * temp * wf1[0];
  786.       temp = lsf_r1[1] - *p_dico++;
  787.       dist += temp * temp * wf1[1];
  788.       temp = lsf_r2[0] - *p_dico++;
  789.       dist += temp * temp * wf2[0];
  790.       temp = lsf_r2[1] - *p_dico++;
  791.       dist += temp * temp * wf2[1];
  792.       if ( dist < dist_min ) {
  793.          dist_min = dist;
  794.          index = i;
  795.       }
  796.    }
  797.    /* Reading the selected vector */
  798.    p_dico = &dico[index << 2];
  799.    lsf_r1[0] = *p_dico++;
  800.    lsf_r1[1] = *p_dico++;
  801.    lsf_r2[0] = *p_dico++;
  802.    lsf_r2[1] = *p_dico++;
  803.    return( Word16 )index;
  804. }
  805. /*
  806.  * Vq_subvec_s
  807.  *
  808.  *
  809.  * Parameters:
  810.  *    lsf_r1            I: 1st LSF residual vector
  811.  *    lsf_r2            I: 2nd LSF residual vector
  812.  *    dico              I: quantization codebook
  813.  *    wf1               I: 1st LSF weighting factors
  814.  *    wf2               I: 2nd LSF weighting factors
  815.  *    dico_size         I: size of quantization codebook
  816.  * Function:
  817.  *    Quantization of a 4 dimensional subvector with a signed codebook
  818.  *
  819.  * Returns:
  820.  *    index             quantization index
  821.  */
  822. static Word16 Vq_subvec_s( Float32 *lsf_r1, Float32 *lsf_r2, const Float32 *dico
  823.       , Float32 *wf1, Float32 *wf2, Word16 dico_size )
  824. {
  825.    Float64 dist_min, dist1, dist2, temp1, temp2;
  826.    const Float32 *p_dico;
  827.    Word32 i, index = 0;
  828.    Word16 sign = 0;
  829.    dist_min = DBL_MAX;
  830.    p_dico = dico;
  831.    for ( i = 0; i < dico_size; i++ ) {
  832.       temp1 = lsf_r1[0] - *p_dico;
  833.       temp2 = lsf_r1[0] + *p_dico++;
  834.       dist1 = temp1 * temp1 * wf1[0];
  835.       dist2 = temp2 * temp2 * wf1[0];
  836.       temp1 = lsf_r1[1] - *p_dico;
  837.       temp2 = lsf_r1[1] + *p_dico++;
  838.       dist1 += temp1 * temp1 * wf1[1];
  839.       dist2 += temp2 * temp2 * wf1[1];
  840.       temp1 = lsf_r2[0] - *p_dico;
  841.       temp2 = lsf_r2[0] + *p_dico++;
  842.       dist1 += temp1 * temp1 * wf2[0];
  843.       dist2 += temp2 * temp2 * wf2[0];
  844.       temp1 = lsf_r2[1] - *p_dico;
  845.       temp2 = lsf_r2[1] + *p_dico++;
  846.       dist1 += temp1 * temp1 * wf2[1];
  847.       dist2 += temp2 * temp2 * wf2[1];
  848.       if ( dist1 < dist_min ) {
  849.          dist_min = dist1;
  850.          index = i;
  851.          sign = 0;
  852.       }
  853.       if ( dist2 < dist_min ) {
  854.          dist_min = dist2;
  855.          index = i;
  856.          sign = 1;
  857.       }
  858.    }
  859.    /* Reading the selected vector */
  860.    p_dico = &dico[index << 2];
  861.    if ( sign == 0 ) {
  862.       lsf_r1[0] = *p_dico++;
  863.       lsf_r1[1] = *p_dico++;
  864.       lsf_r2[0] = *p_dico++;
  865.       lsf_r2[1] = *p_dico++;
  866.    }
  867.    else {
  868.       lsf_r1[0] = -( *p_dico++ );
  869.       lsf_r1[1] = -( *p_dico++ );
  870.       lsf_r2[0] = -( *p_dico++ );
  871.       lsf_r2[1] = -( *p_dico++ );
  872.    }
  873.    index = index << 1;
  874.    index = index + sign;
  875.    return( Word16 )index;
  876. }
  877. /*
  878.  * Reorder_lsf
  879.  *
  880.  *
  881.  * Parameters:
  882.  *    lsf               B: vector of LSFs
  883.  *    min_dist          I: minimum required distance
  884.  *
  885.  * Function:
  886.  *    Make sure that the LSFs are properly ordered and to keep a certain minimum
  887.  *    distance between adjacent LSFs. LPC order = M.
  888.  *
  889.  * Returns:
  890.  *    void
  891.  */
  892. static void Reorder_lsf( Float32 *lsf, Float32 min_dist )
  893. {
  894.    Float32 lsf_min;
  895.    Word32 i;
  896.    lsf_min = min_dist;
  897.    for ( i = 0; i < M; i++ ) {
  898.       if ( lsf[i] < lsf_min ) {
  899.          lsf[i] = lsf_min;
  900.       }
  901.       lsf_min = lsf[i] + min_dist;
  902.    }
  903. }
  904. /*
  905.  * Lsf_lsp
  906.  *
  907.  *
  908.  * Parameters:
  909.  *    lsf               I: vector of LSFs
  910.  *    lsp             O: vector of LSPs
  911.  *
  912.  * Function:
  913.  *    Transformation lsf to lsp, order M
  914.  *
  915.  * Returns:
  916.  *    void
  917.  */
  918. static void Lsf_lsp( Float32 lsf[], Float32 lsp[] )
  919. {
  920.    Word32 i;
  921.    for ( i = 0; i < M; i++ ) {
  922.       lsp[i] = ( Float32 )cos( SCALE_FREQ_LSP * lsf[i] );
  923.    }
  924.    return;
  925. }
  926. /*
  927.  * Vq_subvec3
  928.  *
  929.  *
  930.  * Parameters:
  931.  *    lsf_r1            I: 1st LSF residual vector
  932.  *    dico              I: quantization codebook
  933.  *    wf1               I: 1st LSF weighting factors
  934.  *    dico_size         I: size of quantization codebook
  935.  *    use_half          I: use every second entry in codebook
  936.  *
  937.  * Function:
  938.  *    Quantization of a 3 dimensional subvector
  939.  *
  940.  * Returns:
  941.  *    index             quantization index
  942.  */
  943. static Word16 Vq_subvec3( Float32 *lsf_r1, const Float32 *dico, Float32 *wf1,
  944.       Word16 dico_size, Word32 use_half )
  945. {
  946.    Float64 dist, dist_min;
  947.    Float32 temp;
  948.    const Float32 *p_dico;
  949.    Word32 i, index = 0;
  950.    dist_min = FLT_MAX;
  951.    p_dico = dico;
  952.    if ( use_half == 0 ) {
  953.       for ( i = 0; i < dico_size; i++ ) {
  954.          temp = lsf_r1[0] - *p_dico++;
  955.          temp *= wf1[0];
  956.          dist = temp * temp;
  957.          temp = lsf_r1[1] - *p_dico++;
  958.          temp *= wf1[1];
  959.          dist += temp * temp;
  960.          temp = lsf_r1[2] - *p_dico++;
  961.          temp *= wf1[2];
  962.          dist += temp * temp;
  963.          if ( dist < dist_min ) {
  964.             dist_min = dist;
  965.             index = i;
  966.          }
  967.       }
  968.       p_dico = &dico[( 3 * index )];
  969.    }
  970.    else {
  971.       for ( i = 0; i < dico_size; i++ ) {
  972.          temp = lsf_r1[0] - *p_dico++;
  973.          temp *= wf1[0];
  974.          dist = temp * temp;
  975.          temp = lsf_r1[1] - *p_dico++;
  976.          temp *= wf1[1];
  977.          dist += temp * temp;
  978.          temp = lsf_r1[2] - *p_dico++;
  979.          temp *= wf1[2];
  980.          dist += temp * temp;
  981.          if ( dist < dist_min ) {
  982.             dist_min = dist;
  983.             index = i;
  984.          }
  985.          p_dico = p_dico + 3;
  986.       }
  987.       p_dico = &dico[6 * index];
  988.    }
  989.    /* Reading the selected vector */
  990.    lsf_r1[0] = *p_dico++;
  991.    lsf_r1[1] = *p_dico++;
  992.    lsf_r1[2] = *p_dico++;
  993.    return( Word16 )index;
  994. }
  995. /*
  996.  * Vq_subvec4
  997.  *
  998.  *
  999.  * Parameters:
  1000.  *    lsf_r1            I: 1st LSF residual vector
  1001.  *    dico              I: quantization codebook
  1002.  *    wf1               I: 1st LSF weighting factors
  1003.  *    dico_size         I: size of quantization codebook
  1004.  *
  1005.  * Function:
  1006.  *    Quantization of a 4 dimensional subvector
  1007.  *
  1008.  * Returns:
  1009.  *    index             quantization index
  1010.  */
  1011. static Word16 Vq_subvec4( Float32 *lsf_r1, const Float32 *dico, Float32 *wf1,
  1012.       Word16 dico_size )
  1013. {
  1014.    Float64 dist, dist_min;
  1015.    Float32 temp;
  1016.    const Float32 *p_dico;
  1017.    Word32 i, index = 0;
  1018.    dist_min = FLT_MAX;
  1019.    p_dico = dico;
  1020.    for ( i = 0; i < dico_size; i++ ) {
  1021.       temp = lsf_r1[0] - *p_dico++;
  1022.       temp *= wf1[0];
  1023.       dist = temp * temp;
  1024.       temp = lsf_r1[1] - *p_dico++;
  1025.       temp *= wf1[1];
  1026.       dist += temp * temp;
  1027.       temp = lsf_r1[2] - *p_dico++;
  1028.       temp *= wf1[2];
  1029.       dist += temp * temp;
  1030.       temp = lsf_r1[3] - *p_dico++;
  1031.       temp *= wf1[3];
  1032.       dist += temp * temp;
  1033.       if ( dist < dist_min ) {
  1034.          dist_min = dist;
  1035.          index = i;
  1036.       }
  1037.    }
  1038.    /* Reading the selected vector */
  1039.    p_dico = &dico[index << 2];
  1040.    lsf_r1[0] = *p_dico++;
  1041.    lsf_r1[1] = *p_dico++;
  1042.    lsf_r1[2] = *p_dico++;
  1043.    lsf_r1[3] = *p_dico++;
  1044.    return( Word16 )index;
  1045. }
  1046. /*
  1047.  * Q_plsf_3
  1048.  *
  1049.  *
  1050.  * Parameters:
  1051.  *    mode              I: AMR mode
  1052.  *    past_rq           B: past quantized residual
  1053.  *    lsp1              I: 1st LSP vector
  1054.  *    lsp1_q            O: quantized 1st LSP vector
  1055.  *    indice            I: quantization indices of 5 matrices and
  1056.  *                         one sign for 3rd
  1057.  *    pred_init_i       O: init index for MA prediction in DTX mode
  1058.  *
  1059.  * Function:
  1060.  *    Quantization of LSF parameters with 1st order MA prediction and
  1061.  *    split by 3 vector quantization (split-VQ)
  1062.  *
  1063.  * Returns:
  1064.  *    void
  1065.  */
  1066. static void Q_plsf_3( enum Mode mode, Float32 *past_rq, Float32 *lsp1, Float32 *
  1067.       lsp1_q, Word16 *indice, Word32 *pred_init_i )
  1068. {
  1069.    Float32 lsf1[M], wf1[M], lsf_p[M], lsf_r1[M];
  1070.    Float32 lsf1_q[M];
  1071.    Float32 pred_init_err;
  1072.    Float32 min_pred_init_err;
  1073.    Float32 temp_r1[M];
  1074.    Float32 temp_p[M];
  1075.    Word32 j, i;
  1076.    /* convert LSFs to normalize frequency domain */
  1077.    Lsp_lsf( lsp1, lsf1 );
  1078.    /* compute LSF weighting factors */
  1079.    Lsf_wt( lsf1, wf1 );
  1080.    /* Compute predicted LSF and prediction error */
  1081.    if ( mode != MRDTX ) {
  1082.       for ( i = 0; i < M; i++ ) {
  1083.          lsf_p[i] = mean_lsf_3[i] + past_rq[i] * pred_fac[i];
  1084.          lsf_r1[i] = lsf1[i] - lsf_p[i];
  1085.       }
  1086.    }
  1087.    else {
  1088.       /*
  1089.        * DTX mode, search the init vector that yields
  1090.        * lowest prediction resuidual energy
  1091.        */
  1092.       *pred_init_i = 0;
  1093.       min_pred_init_err = FLT_MAX;
  1094.       for ( j = 0; j < PAST_RQ_INIT_SIZE; j++ ) {
  1095.          pred_init_err = 0;
  1096.          for ( i = 0; i < M; i++ ) {
  1097.             temp_p[i] = mean_lsf_3[i] + past_rq_init[j * M + i];
  1098.             temp_r1[i] = lsf1[i] - temp_p[i];
  1099.             pred_init_err += temp_r1[i] * temp_r1[i];
  1100.          }   /* next i */
  1101.          if ( pred_init_err < min_pred_init_err ) {
  1102.             min_pred_init_err = pred_init_err;
  1103.             memcpy( lsf_r1, temp_r1, M <<2 );
  1104.             memcpy( lsf_p, temp_p, M <<2 );
  1105.             memcpy( past_rq, &past_rq_init[j * M], M <<2 );
  1106.             *pred_init_i = j;
  1107.          }
  1108.       }
  1109.    }
  1110.    /* Split-VQ of prediction error */
  1111.    /* MR475, MR515 */
  1112.    if ( ( mode == MR475 ) || ( mode == MR515 ) ) {
  1113.       indice[0] = Vq_subvec3( &lsf_r1[0], dico1_lsf_3, &wf1[0], DICO1_SIZE_3, 0
  1114.             );
  1115.       indice[1] = Vq_subvec3( &lsf_r1[3], dico2_lsf_3, &wf1[3], DICO2_SIZE_3 /2,
  1116.             1 );
  1117.       indice[2] = Vq_subvec4( &lsf_r1[6], mr515_3_lsf, &wf1[6], MR515_3_SIZE );
  1118.    }
  1119.    /* MR795 */
  1120.    else if ( mode == MR795 ) {
  1121.       indice[0] = Vq_subvec3( &lsf_r1[0], mr795_1_lsf, &wf1[0], MR795_1_SIZE, 0
  1122.             );
  1123.       indice[1] = Vq_subvec3( &lsf_r1[3], dico2_lsf_3, &wf1[3], DICO2_SIZE_3, 0
  1124.             );
  1125.       indice[2] = Vq_subvec4( &lsf_r1[6], dico3_lsf_3, &wf1[6], DICO3_SIZE_3 );
  1126.    }
  1127.    /* MR59, MR67, MR74, MR102 , MRDTX */
  1128.    else {
  1129.       indice[0] = Vq_subvec3( &lsf_r1[0], dico1_lsf_3, &wf1[0], DICO1_SIZE_3, 0
  1130.             );
  1131.       indice[1] = Vq_subvec3( &lsf_r1[3], dico2_lsf_3, &wf1[3], DICO2_SIZE_3, 0
  1132.             );
  1133.       indice[2] = Vq_subvec4( &lsf_r1[6], dico3_lsf_3, &wf1[6], DICO3_SIZE_3 );
  1134.    }
  1135.    /* Compute quantized LSFs and update the past quantized residual */
  1136.    for ( i = 0; i < M; i++ ) {
  1137.       lsf1_q[i] = lsf_r1[i] + lsf_p[i];
  1138.       past_rq[i] = lsf_r1[i];
  1139.    }
  1140.    /* verification that LSFs has mimimum distance of LSF_GAP 50 Hz */
  1141.    Reorder_lsf( lsf1_q, 50.0F );
  1142.    /*  convert LSFs to the cosine domain */
  1143.    Lsf_lsp( lsf1_q, lsp1_q );
  1144. }
  1145. /*
  1146.  * Q_plsf_5
  1147.  *
  1148.  *
  1149.  * Parameters:
  1150.  *    past_rq           B: past quantized residual
  1151.  *    lsp1              I: 1st LSP vector
  1152.  *    lsp2              I: 2nd LSP vector
  1153.  *    lsp1_q            O: quantized 1st LSP vector
  1154.  *    lsp2_q            O: quantized 2nd LSP vector
  1155.  *    indice          I: quantization indices of 5 matrices and
  1156.  *                         one sign for 3rd
  1157.  *
  1158.  * Function:
  1159.  *    Quantization of 2 sets of LSF parameters using 1st order MA
  1160.  *    prediction and split by 5 matrix quantization (split-MQ).
  1161.  *
  1162.  * Returns:
  1163.  *    void
  1164.  */
  1165. static void Q_plsf_5( Float32 *past_rq, Float32 *lsp1, Float32 *lsp2, Float32 *
  1166.       lsp1_q, Float32 *lsp2_q, Word16 *indice )
  1167. {
  1168.    Float32 lsf1[M], lsf2[M], wf1[M], wf2[M], lsf_p[M], lsf_r1[M], lsf_r2[M];
  1169.    Float32 lsf1_q[M], lsf2_q[M];
  1170.    Word32 i;
  1171.    /* convert LSFs to normalize frequency domain */
  1172.    Lsp_lsf( lsp1, lsf1 );
  1173.    Lsp_lsf( lsp2, lsf2 );
  1174.    /* Compute LSF weighting factors */
  1175.    Lsf_wt( lsf1, wf1 );
  1176.    Lsf_wt( lsf2, wf2 );
  1177.    /* Compute predicted LSF and prediction error */
  1178.    for ( i = 0; i < M; i++ ) {
  1179.       /* MR122 LSP prediction factor = 0.65 */
  1180.       lsf_p[i] = mean_lsf_5[i] + past_rq[i] * 0.65F;
  1181.       lsf_r1[i] = lsf1[i] - lsf_p[i];
  1182.       lsf_r2[i] = lsf2[i] - lsf_p[i];
  1183.    }
  1184.    /* Split-MQ of prediction error */
  1185.    indice[0] = Vq_subvec( &lsf_r1[0], &lsf_r2[0], dico1_lsf_5, &wf1[0], &wf2[0],
  1186.          DICO1_SIZE_5 );
  1187.    indice[1] = Vq_subvec( &lsf_r1[2], &lsf_r2[2], dico2_lsf_5, &wf1[2], &wf2[2],
  1188.          DICO2_SIZE_5 );
  1189.    indice[2] = Vq_subvec_s( &lsf_r1[4], &lsf_r2[4], dico3_lsf_5, &wf1[4], &wf2[4
  1190.          ], DICO3_SIZE_5 );
  1191.    indice[3] = Vq_subvec( &lsf_r1[6], &lsf_r2[6], dico4_lsf_5, &wf1[6], &wf2[6],
  1192.          DICO4_SIZE_5 );
  1193.    indice[4] = Vq_subvec( &lsf_r1[8], &lsf_r2[8], dico5_lsf_5, &wf1[8], &wf2[8],
  1194.          DICO5_SIZE_5 );
  1195.    /* Compute quantized LSFs and update the past quantized residual */
  1196.    for ( i = 0; i < M; i++ ) {
  1197.       lsf1_q[i] = lsf_r1[i] + lsf_p[i];
  1198.       lsf2_q[i] = lsf_r2[i] + lsf_p[i];
  1199.       past_rq[i] = lsf_r2[i];
  1200.    }
  1201.    /* verification that LSFs has minimum distance of LSF_GAP 50hz */
  1202.    Reorder_lsf( lsf1_q, 50.0F );
  1203.    Reorder_lsf( lsf2_q, 50.0F );
  1204.    /*  convert LSFs to the cosine domain */
  1205.    Lsf_lsp( lsf1_q, lsp1_q );
  1206.    Lsf_lsp( lsf2_q, lsp2_q );
  1207. }
  1208. /*
  1209.  * Int_lpc_1and3
  1210.  *
  1211.  *
  1212.  * Parameters:
  1213.  *    lsp_old        I: LSP vector at the 4th subfr. of past frame      [M]
  1214.  *    lsp_mid        I: LSP vector at the 2nd subframe of present frame [M]
  1215.  *    lsp_new        I: LSP vector at the 4th subframe of present frame [M]
  1216.  *    az             O: interpolated LP parameters in subframes 1 and 3
  1217.  *                                                                [AZ_SIZE]
  1218.  *
  1219.  * Function:
  1220.  *    Interpolates the LSPs and converts to LPC parameters
  1221.  *    to get a different LP filter in each subframe.
  1222.  *
  1223.  *    The 20 ms speech frame is divided into 4 subframes.
  1224.  *    The LSPs are quantized and transmitted at the 2nd and
  1225.  *    4th subframes (twice per frame) and interpolated at the
  1226.  *    1st and 3rd subframe.
  1227.  *
  1228.  * Returns:
  1229.  *    void
  1230.  */
  1231. static void Int_lpc_1and3( Float32 lsp_old[], Float32 lsp_mid[], Float32 lsp_new
  1232.       [], Float32 az[] )
  1233. {
  1234.    Word32 i;
  1235.    Float32 lsp[M];
  1236.    for ( i = 0; i < M; i++ ) {
  1237.       lsp[i] = ( lsp_mid[i] + lsp_old[i] ) * 0.5F;
  1238.    }
  1239.    /* Subframe 1 */
  1240.    Lsp_Az( lsp, az );
  1241.    az += MP1;
  1242.    /* Subframe 2 */
  1243.    Lsp_Az( lsp_mid, az );
  1244.    az += MP1;
  1245.    for ( i = 0; i < M; i++ ) {
  1246.       lsp[i] = ( lsp_mid[i] + lsp_new[i] ) * 0.5F;
  1247.    }
  1248.    /* Subframe 3 */
  1249.    Lsp_Az( lsp, az );
  1250.    az += MP1;
  1251.    /* Subframe 4 */
  1252.    Lsp_Az( lsp_new, az );
  1253.    return;
  1254. }
  1255. /*
  1256.  * Int_lpc_1to3_2
  1257.  *
  1258.  *
  1259.  * Parameters:
  1260.  *    lsp_old           I: LSP vector at the 4th subfr. of past frame      [M]
  1261.  *    lsp_new           I: LSP vector at the 4th subframe of present frame [M]
  1262.  *    az                O: interpolated LP parameters in subframes 1, 2 and 3
  1263.  *                                                                   [AZ_SIZE]
  1264.  *
  1265.  * Function:
  1266.  *    Interpolation of the LPC parameters.
  1267.  *
  1268.  * Returns:
  1269.  *    void
  1270.  */
  1271. static void Int_lpc_1to3_2( Float32 lsp_old[], Float32 lsp_new[], Float32 az[] )
  1272. {
  1273.    Float32 lsp[M];
  1274.    Word32 i;
  1275.    for ( i = 0; i < M; i += 2 ) {
  1276.       lsp[i] = lsp_new[i] * 0.25F + lsp_old[i] * 0.75F;
  1277.       lsp[i + 1] = lsp_new[i + 1] *0.25F + lsp_old[i + 1] *0.75F;
  1278.    }
  1279.    /* Subframe 1 */
  1280.    Lsp_Az( lsp, az );
  1281.    az += MP1;
  1282.    for ( i = 0; i < M; i += 2 ) {
  1283.       lsp[i] = ( lsp_old[i] + lsp_new[i] ) * 0.5F;
  1284.       lsp[i + 1] = ( lsp_old[i + 1] +lsp_new[i+1] )*0.5F;
  1285.    }
  1286.    /* Subframe 2 */
  1287.    Lsp_Az( lsp, az );
  1288.    az += MP1;
  1289.    for ( i = 0; i < M; i += 2 ) {
  1290.       lsp[i] = lsp_old[i] * 0.25F + lsp_new[i] * 0.75F;
  1291.       lsp[i + 1] = lsp_old[i + 1] *0.25F + lsp_new[i + 1] *0.75F;
  1292.    }
  1293.    /* Subframe 3 */
  1294.    Lsp_Az( lsp, az );
  1295.    return;
  1296. }
  1297. /*
  1298.  * Int_lpc_1to3
  1299.  *
  1300.  *
  1301.  * Parameters:
  1302.  *    lsp_old           I: LSP vector at the 4th subfr. of past frame      [M]
  1303.  *    lsp_new           I: LSP vector at the 4th subframe of present frame [M]
  1304.  *    az                O: interpolated LP parameters in all subframes
  1305.  *                                                                   [AZ_SIZE]
  1306.  *
  1307.  * Function:
  1308.  *    Interpolates the LSPs and converts to LPC parameters to get a different
  1309.  *    LP filter in each subframe.
  1310.  *
  1311.  *    The 20 ms speech frame is divided into 4 subframes.
  1312.  *    The LSPs are quantized and transmitted at the 4th
  1313.  *    subframes (once per frame) and interpolated at the
  1314.  *    1st, 2nd and 3rd subframe.
  1315.  *
  1316.  * Returns:
  1317.  *    void
  1318.  */
  1319. static void Int_lpc_1to3( Float32 lsp_old[], Float32 lsp_new[], Float32 az[] )
  1320. {
  1321.    Float32 lsp[M];
  1322.    Word32 i;
  1323.    for ( i = 0; i < M; i++ ) {
  1324.       lsp[i] = lsp_new[i] * 0.25F + lsp_old[i] * 0.75F;
  1325.    }
  1326.    /* Subframe 1 */
  1327.    Lsp_Az( lsp, az );
  1328.    az += MP1;
  1329.    for ( i = 0; i < M; i++ ) {
  1330.       lsp[i] = ( lsp_old[i] + lsp_new[i] ) * 0.5F;
  1331.    }
  1332.    /* Subframe 2 */
  1333.    Lsp_Az( lsp, az );
  1334.    az += MP1;
  1335.    for ( i = 0; i < M; i++ ) {
  1336.       lsp[i] = lsp_old[i] * 0.25F + lsp_new[i] * 0.75F;
  1337.    }
  1338.    /* Subframe 3 */
  1339.    Lsp_Az( lsp, az );
  1340.    az += MP1;
  1341.    /* Subframe 4 */
  1342.    Lsp_Az( lsp_new, az );
  1343.    return;
  1344. }
  1345. /*
  1346.  * lsp
  1347.  *
  1348.  *
  1349.  * Parameters:
  1350.  *    req_mode          I: requested mode
  1351.  *    used_mode         I: used mode
  1352.  *    lsp_old           B: old LSP vector
  1353.  *    lsp_old_q         B: old quantized LSP vector
  1354.  *    past_rq           B: past quantized residual
  1355.  *    az                B: interpolated LP parameters
  1356.  *    azQ               O: quantization interpol. LP parameters
  1357.  *    lsp_new           O: new lsp vector
  1358.  *    anap              O: analysis parameters
  1359.  *
  1360.  * Function:
  1361.  *    From A(z) to lsp. LSP quantization and interpolation
  1362.  *
  1363.  * Returns:
  1364.  *    void
  1365.  */
  1366. static void lsp( enum Mode req_mode, enum Mode used_mode, Float32 *lsp_old,
  1367.       Float32 *lsp_old_q, Float32 *past_rq, Float32 az[], Float32 azQ[], Float32
  1368.       lsp_new[], Word16 **anap )
  1369. {
  1370.    Float32 lsp_new_q[M];   /* LSPs at 4th subframe */
  1371.    Float32 lsp_mid[M], lsp_mid_q[M];   /* LSPs at 2nd subframe */
  1372.    Word32 pred_init_i;   /* init index for MA prediction in DTX mode */
  1373.    if ( req_mode == MR122 ) {
  1374.       Az_lsp( &az[MP1], lsp_mid, lsp_old );
  1375.       Az_lsp( &az[MP1 * 3], lsp_new, lsp_mid );
  1376.       /*
  1377.        * Find interpolated LPC parameters in all subframes
  1378.        * (both quantized and unquantized).
  1379.        * The interpolated parameters are in array A_t[] of size (M+1)*4
  1380.        * and the quantized interpolated parameters are in array Aq_t[]
  1381.        */
  1382.       Int_lpc_1and3_2( lsp_old, lsp_mid, lsp_new, az );
  1383.       if ( used_mode != MRDTX ) {
  1384.          /* LSP quantization (lsp_mid[] and lsp_new[] jointly quantized) */
  1385.          Q_plsf_5( past_rq, lsp_mid, lsp_new, lsp_mid_q, lsp_new_q, *anap );
  1386.          Int_lpc_1and3( lsp_old_q, lsp_mid_q, lsp_new_q, azQ );
  1387.          /* Advance analysis parameters pointer */
  1388.          ( *anap ) += 5;
  1389.       }
  1390.    }
  1391.    else {
  1392.       /* From A(z) to lsp */
  1393.       Az_lsp( &az[MP1 * 3], lsp_new, lsp_old );
  1394.       /*
  1395.        * Find interpolated LPC parameters in all subframes
  1396.        * (both quantized and unquantized).
  1397.        * The interpolated parameters are in array A_t[] of size (M+1)*4
  1398.        * and the quantized interpolated parameters are in array Aq_t[]
  1399.        */
  1400.       Int_lpc_1to3_2( lsp_old, lsp_new, az );
  1401.       /* LSP quantization */
  1402.       if ( used_mode != MRDTX ) {
  1403.          Q_plsf_3( req_mode, past_rq, lsp_new, lsp_new_q, *anap, &pred_init_i );
  1404.          Int_lpc_1to3( lsp_old_q, lsp_new_q, azQ );
  1405.          /* Advance analysis parameters pointer */
  1406.          ( *anap ) += 3;
  1407.       }
  1408.    }
  1409.    /* update the LSPs for the next frame */
  1410.    memcpy( lsp_old, lsp_new, M <<2 );
  1411.    memcpy( lsp_old_q, lsp_new_q, M <<2 );
  1412. }
  1413. /*
  1414.  * check_lsp
  1415.  *
  1416.  *
  1417.  * Parameters:
  1418.  *    count          B: counter for resonance
  1419.  *    lsp            B: LSP vector
  1420.  *
  1421.  * Function:
  1422.  *    Check the LSP's to detect resonances
  1423.  *
  1424.  *    Resonances in the LPC filter are monitored to detect possible problem
  1425.  *    areas where divergence between the adaptive codebook memories in
  1426.  *    the encoder and the decoder could cause unstable filters in areas
  1427.  *    with highly correlated continuos signals. Typically, this divergence
  1428.  *    is due to channel errors.
  1429.  *    The monitoring of resonance signals is performed using unquantized LSPs
  1430.  *    q(i), i = 1,...,10. The algorithm utilises the fact that LSPs are
  1431.  *    closely located at a peak in the spectrum. First, two distances,
  1432.  *    dist 1 and dist 2 ,are calculated in two different regions,
  1433.  *    defined as
  1434.  *
  1435.  *    dist1 = min[q(i) - q(i + 1)],  i = 4,...,8
  1436.  *    dist2 = min[q(i) - q(i + 1)],  i = 2,3
  1437.  *
  1438.  *    Either of these two minimum distance conditions must be fulfilled
  1439.  *    to classify the frame as a resonance frame and increase the resonance
  1440.  *    counter.
  1441.  *
  1442.  *    if(dist1 < TH1) || if (dist2 < TH2)
  1443.  *       counter++
  1444.  *    else
  1445.  *       counter = 0
  1446.  *
  1447.  *    TH1 = 0.046
  1448.  *    TH2 = 0.018, q(2) > 0.98
  1449.  *    TH2 = 0.024, 0.93 < q(2) <= 0.98
  1450.  *    TH2 = 0.018, otherwise
  1451.  *
  1452.  *    12 consecutive resonance frames are needed to indicate possible
  1453.  *    problem conditions, otherwise the LSP_flag is cleared.
  1454.  *
  1455.  * Returns:
  1456.  *    resonance flag
  1457.  */
  1458. static Word16 check_lsp( Word16 *count, Float32 *lsp )
  1459. {
  1460.    Float32 dist, dist_min1, dist_min2, dist_th;
  1461.    Word32 i;
  1462.    /*
  1463.     * Check for a resonance:
  1464.     * Find minimum distance between lsp[i] and lsp[i+1]
  1465.     */
  1466.    dist_min1 = FLT_MAX;
  1467.    for ( i = 3; i < 8; i++ ) {
  1468.       dist = lsp[i] - lsp[i + 1];
  1469.       if ( dist < dist_min1 ) {
  1470.          dist_min1 = dist;
  1471.       }
  1472.    }
  1473.    dist_min2 = FLT_MAX;
  1474.    for ( i = 1; i < 3; i++ ) {
  1475.       dist = lsp[i] - lsp[i + 1];
  1476.       if ( dist < dist_min2 ) {
  1477.          dist_min2 = dist;
  1478.       }
  1479.    }
  1480.    if ( lsp[1] > 0.98F ) {
  1481.       dist_th = 0.018F;
  1482.    }
  1483.    else if ( lsp[1] > 0.93F ) {
  1484.       dist_th = 0.024F;
  1485.    }
  1486.    else {
  1487.       dist_th = 0.034F;
  1488.    }
  1489.    if ( ( dist_min1 < 0.046F ) || ( dist_min2 < dist_th ) ) {
  1490.       *count += 1;
  1491.    }
  1492.    else {
  1493.       *count = 0;
  1494.    }
  1495.    /* Need 12 consecutive frames to set the flag */
  1496.    if ( *count >= 12 ) {
  1497.       *count = 12;
  1498.       return 1;
  1499.    }
  1500.    else {
  1501.       return 0;
  1502.    }
  1503. }
  1504. /*
  1505.  * Weight_Ai
  1506.  *
  1507.  *
  1508.  * Parameters:
  1509.  *    a                 I: LPC coefficients                    [M+1]
  1510.  *    fac               I: Spectral expansion factors.         [M+1]
  1511.  *    a_exp             O: Spectral expanded LPC coefficients  [M+1]
  1512.  *
  1513.  * Function:
  1514.  *    Spectral expansion of LP coefficients
  1515.  *
  1516.  * Returns:
  1517.  *    void
  1518.  */
  1519. static void Weight_Ai( Float32 a[], const Float32 fac[], Float32 a_exp[] )
  1520. {
  1521.    Word32 i;
  1522.    a_exp[0] = a[0];
  1523.    for ( i = 1; i <= M; i++ ) {
  1524.       a_exp[i] = a[i] * fac[i - 1];
  1525.    }
  1526.    return;
  1527. }
  1528. /*
  1529.  * Residu
  1530.  *
  1531.  *
  1532.  * Parameters:
  1533.  *    a                 I: prediction coefficients
  1534.  *    x                 I: speech signal
  1535.  *    y                 O: residual signal
  1536.  *
  1537.  * Function:
  1538.  *    Computes the LTP residual signal.
  1539.  *
  1540.  * Returns:
  1541.  *    void
  1542.  */
  1543. static void Residu( Float32 a[], Float32 x[], Float32 y[] )
  1544. {
  1545.    Float32 s;
  1546.    Word32 i;
  1547.    for ( i = 0; i < L_SUBFR; i += 4 ) {
  1548.       s = x[i] * a[0];
  1549.       s += x[i - 1] *a[1];
  1550.       s += x[i - 2] * a[2];
  1551.       s += x[i - 3] * a[3];
  1552.       s += x[i - 4] * a[4];
  1553.       s += x[i - 5] * a[5];
  1554.       s += x[i - 6] * a[6];
  1555.       s += x[i - 7] * a[7];
  1556.       s += x[i - 8] * a[8];
  1557.       s += x[i - 9] * a[9];
  1558.       s += x[i - 10] * a[10];
  1559.       y[i] = s;
  1560.       s = x[i + 1] *a[0];
  1561.       s += x[i] * a[1];
  1562.       s += x[i - 1] *a[2];
  1563.       s += x[i - 2] * a[3];
  1564.       s += x[i - 3] * a[4];
  1565.       s += x[i - 4] * a[5];
  1566.       s += x[i - 5] * a[6];
  1567.       s += x[i - 6] * a[7];
  1568.       s += x[i - 7] * a[8];
  1569.       s += x[i - 8] * a[9];
  1570.       s += x[i - 9] * a[10];
  1571.       y[i + 1] = s;
  1572.       s = x[i + 2] * a[0];
  1573.       s += x[i + 1] *a[1];
  1574.       s += x[i] * a[2];
  1575.       s += x[i - 1] *a[3];
  1576.       s += x[i - 2] * a[4];
  1577.       s += x[i - 3] * a[5];
  1578.       s += x[i - 4] * a[6];
  1579.       s += x[i - 5] * a[7];
  1580.       s += x[i - 6] * a[8];
  1581.       s += x[i - 7] * a[9];
  1582.       s += x[i - 8] * a[10];
  1583.       y[i + 2] = s;
  1584.       s = x[i + 3] * a[0];
  1585.       s += x[i + 2] * a[1];
  1586.       s += x[i + 1] *a[2];
  1587.       s += x[i] * a[3];
  1588.       s += x[i - 1] *a[4];
  1589.       s += x[i - 2] * a[5];
  1590.       s += x[i - 3] * a[6];
  1591.       s += x[i - 4] * a[7];
  1592.       s += x[i - 5] * a[8];
  1593.       s += x[i - 6] * a[9];
  1594.       s += x[i - 7] * a[10];
  1595.       y[i + 3] = s;
  1596.    }
  1597.    return;
  1598. }
  1599. /*
  1600.  * Syn_filt
  1601.  *
  1602.  *
  1603.  * Parameters:
  1604.  *    a                 I: prediction coefficients [M+1]
  1605.  *    x                 I: input signal
  1606.  *    y                 O: output signal
  1607.  *    mem               B: memory associated with this filtering
  1608.  *    update            I: 0=no update, 1=update of memory.
  1609.  *
  1610.  * Function:
  1611.  *    Perform synthesis filtering through 1/A(z).
  1612.  *
  1613.  * Returns:
  1614.  *    void
  1615.  */
  1616. static void Syn_filt( Float32 a[], Float32 x[], Float32 y[], Float32 mem[],
  1617.       Word16 update )
  1618. {
  1619.    Float64 tmp[50];
  1620.    Float64 sum;
  1621.    Float64 *yy;
  1622.    Word32 i;
  1623.    /* Copy mem[] to yy[] */
  1624.    yy = tmp;
  1625.    for ( i = 0; i < M; i++ ) {
  1626.       *yy++ = mem[i];
  1627.    }
  1628.    /* Do the filtering. */
  1629.    for ( i = 0; i < L_SUBFR; i = i + 4 ) {
  1630.       sum = x[i] * a[0];
  1631.       sum -= a[1] * yy[ - 1];
  1632.       sum -= a[2] * yy[ - 2];
  1633.       sum -= a[3] * yy[ - 3];
  1634.       sum -= a[4] * yy[ - 4];
  1635.       sum -= a[5] * yy[ - 5];
  1636.       sum -= a[6] * yy[ - 6];
  1637.       sum -= a[7] * yy[ - 7];
  1638.       sum -= a[8] * yy[ - 8];
  1639.       sum -= a[9] * yy[ - 9];
  1640.       sum -= a[10] * yy[ - 10];
  1641.       *yy++ = sum;
  1642.       y[i] = ( Float32 )yy[ - 1];
  1643.       sum = x[i + 1] *a[0];
  1644.       sum -= a[1] * yy[ - 1];
  1645.       sum -= a[2] * yy[ - 2];
  1646.       sum -= a[3] * yy[ - 3];
  1647.       sum -= a[4] * yy[ - 4];
  1648.       sum -= a[5] * yy[ - 5];
  1649.       sum -= a[6] * yy[ - 6];
  1650.       sum -= a[7] * yy[ - 7];
  1651.       sum -= a[8] * yy[ - 8];
  1652.       sum -= a[9] * yy[ - 9];
  1653.       sum -= a[10] * yy[ - 10];
  1654.       *yy++ = sum;
  1655.       y[i + 1] = ( Float32 )yy[ - 1];
  1656.       sum = x[i + 2] * a[0];
  1657.       sum -= a[1] * yy[ - 1];
  1658.       sum -= a[2] * yy[ - 2];
  1659.       sum -= a[3] * yy[ - 3];
  1660.       sum -= a[4] * yy[ - 4];
  1661.       sum -= a[5] * yy[ - 5];
  1662.       sum -= a[6] * yy[ - 6];
  1663.       sum -= a[7] * yy[ - 7];
  1664.       sum -= a[8] * yy[ - 8];
  1665.       sum -= a[9] * yy[ - 9];
  1666.       sum -= a[10] * yy[ - 10];
  1667.       *yy++ = sum;
  1668.       y[i + 2] = ( Float32 )yy[ - 1];
  1669.       sum = x[i + 3] * a[0];
  1670.       sum -= a[1] * yy[ - 1];
  1671.       sum -= a[2] * yy[ - 2];
  1672.       sum -= a[3] * yy[ - 3];
  1673.       sum -= a[4] * yy[ - 4];
  1674.       sum -= a[5] * yy[ - 5];
  1675.       sum -= a[6] * yy[ - 6];
  1676.       sum -= a[7] * yy[ - 7];
  1677.       sum -= a[8] * yy[ - 8];
  1678.       sum -= a[9] * yy[ - 9];
  1679.       sum -= a[10] * yy[ - 10];
  1680.       *yy++ = sum;
  1681.       y[i + 3] = ( Float32 )yy[ - 1];
  1682.    }
  1683.    /* Update of memory if update==1 */
  1684.    if ( update != 0 ) {
  1685.       for ( i = 0; i < M; i++ ) {
  1686.          mem[i] = y[30 + i];
  1687.       }
  1688.    }
  1689.    return;
  1690. }
  1691. /*
  1692.  * pre_big
  1693.  *
  1694.  *
  1695.  * Parameters:
  1696.  *    mode              I: AMR mode
  1697.  *    gamma1            I: spectral exp. factor 1
  1698.  *    gamma1_12k2       I: spectral exp. factor 1 for modes above MR795
  1699.  *    gamma2            I: spectral exp. factor 2
  1700.  *    A_t               I: A(z) unquantized, for 4 subframes
  1701.  *    frame_offset      I: frameoffset, 1st or second big_sbf
  1702.  *    speech            I: speech
  1703.  *    mem_w             B: synthesis filter memory state
  1704.  *    wsp               O: weighted speech
  1705.  *
  1706.  * Function:
  1707.  *    Big subframe (2 subframes) preprocessing
  1708.  *
  1709.  *    Open-loop pitch analysis is performed in order to simplify the pitch
  1710.  *    analysis and confine the closed-loop pitch search to a small number of
  1711.  *    lags around the open-loop estimated lags.
  1712.  *    Open-loop pitch estimation is based on the weighted speech signal Sw(n)
  1713.  *    which is obtained by filtering the input speech signal through
  1714.  *    the weighting filter
  1715.  *
  1716.  *    W(z) = A(z/g1) / A(z/g2)
  1717.  *
  1718.  *    That is, in a subframe of size L, the weighted speech is given by:
  1719.  *
  1720.  *                    10                           10
  1721.  *    Sw(n) = S(n) + SUM[a(i) * g1(i) * S(n-i)] - SUM[a(i) * g2(i) * Sw(n-i)],
  1722.  *                   i=1                          i=1
  1723.  *    n = 0, ..., L-1
  1724.  *
  1725.  * Returns:
  1726.  *    void
  1727.  */
  1728. static Word32 pre_big( enum Mode mode, const Float32 gamma1[], const Float32
  1729.       gamma1_12k2[], const Float32 gamma2[], Float32 A_t[], Word16 frame_offset,
  1730.       Float32 speech[], Float32 mem_w[], Float32 wsp[] )
  1731. {
  1732.    Float32 Ap1[MP1], Ap2[MP1];
  1733.    Word32 offset, i;
  1734.    /* A(z) with spectral expansion */
  1735.    const Float32 *g1;
  1736.    g1 = gamma1_12k2;
  1737.    if ( mode <= MR795 ) {
  1738.       g1 = gamma1;
  1739.    }
  1740.    offset = 0;
  1741.    if ( frame_offset > 0 ) {
  1742.       offset = MP1 << 1;
  1743.    }
  1744.    /* process two subframes (which form the "big" subframe) */
  1745.    for ( i = 0; i < 2; i++ ) {
  1746.       /* a(i) * g1(i) */
  1747.       Weight_Ai( &A_t[offset], g1, Ap1 );
  1748.       /* a(i) * g2(i) */
  1749.       Weight_Ai( &A_t[offset], gamma2, Ap2 );
  1750.       /*
  1751.        *       10
  1752.        *  S(n) + SUM[a(i) * g1(i) * S(n-i)]
  1753.        *       i=1
  1754.        */
  1755.       Residu( Ap1, &speech[frame_offset], &wsp[frame_offset] );
  1756.       /*
  1757.        *          10                            10
  1758.        *  S(n) + SUM[a(i) * g1(i) * S(n-i)]    SUM[a(i) * g2(i) * Sn(n-i)]
  1759.        *         i=1                           i=1
  1760.        */
  1761.       Syn_filt( Ap2, &wsp[frame_offset], &wsp[frame_offset], mem_w, 1 );
  1762.       offset += MP1;
  1763.       frame_offset += L_SUBFR;
  1764.    }
  1765.    return 0;
  1766. }
  1767. /*
  1768.  * comp_corr
  1769.  *
  1770.  *
  1771.  * Parameters:
  1772.  *    sig               I: signal
  1773.  *    L_frame           I: length of frame to compute pitch
  1774.  *    lag_max           I: maximum lag
  1775.  *    lag_min           I: minimum lag
  1776.  *    corr              O: correlation of selected lag
  1777.  *
  1778.  * Function:
  1779.  *    Calculate all correlations in a given delay range.
  1780.  *
  1781.  * Returns:
  1782.  *    void
  1783.  */
  1784. static void comp_corr( Float32 sig[], Word32 L_frame, Word32 lag_max, Word32
  1785.       lag_min, Float32 corr[] )
  1786. {
  1787.    Word32 i, j;
  1788.    Float32 *p, *p1;
  1789.    Float32 T0;
  1790.    for ( i = lag_max; i >= lag_min; i-- ) {
  1791.       p = sig;
  1792.       p1 = &sig[ - i];
  1793.       T0 = 0.0F;
  1794.       for ( j = 0; j < L_frame; j = j + 40, p += 40, p1 += 40 ) {
  1795.          T0 += p[0] * p1[0] + p[1] * p1[1] + p[2] * p1[2] + p[3] * p1[3];
  1796.          T0 += p[4] * p1[4] + p[5] * p1[5] + p[6] * p1[6] + p[7] * p1[7];
  1797.          T0 += p[8] * p1[8] + p[9] * p1[9] + p[10] * p1[10] + p[11] * p1[11];
  1798.          T0 += p[12] * p1[12] + p[13] * p1[13] + p[14] * p1[14] + p[15] * p1[15]
  1799.          ;
  1800.          T0 += p[16] * p1[16] + p[17] * p1[17] + p[18] * p1[18] + p[19] * p1[19]
  1801.          ;
  1802.          T0 += p[20] * p1[20] + p[21] * p1[21] + p[22] * p1[22] + p[23] * p1[23]
  1803.          ;
  1804.          T0 += p[24] * p1[24] + p[25] * p1[25] + p[26] * p1[26] + p[27] * p1[27]
  1805.          ;
  1806.          T0 += p[28] * p1[28] + p[29] * p1[29] + p[30] * p1[30] + p[31] * p1[31]
  1807.          ;
  1808.          T0 += p[32] * p1[32] + p[33] * p1[33] + p[34] * p1[34] + p[35] * p1[35]
  1809.          ;
  1810.          T0 += p[36] * p1[36] + p[37] * p1[37] + p[38] * p1[38] + p[39] * p1[39]
  1811.          ;
  1812.       }
  1813.       corr[ - i] = T0;
  1814.    }
  1815.    return;
  1816. }
  1817. /*
  1818.  * vad_tone_detection
  1819.  *
  1820.  *
  1821.  * Parameters:
  1822.  *    st->tone          B: flags indicating presence of a tone
  1823.  *    T0                I: autocorrelation maxima
  1824.  *    t1                I: energy
  1825.  *
  1826.  * Function:
  1827.  *    Set tone flag if pitch gain is high.
  1828.  *    This is used to detect signaling tones and other signals
  1829.  *    with high pitch gain.
  1830.  *
  1831.  * Returns:
  1832.  *    void
  1833.  */
  1834. #ifndef VAD2
  1835. static void vad_tone_detection( vadState *st, Float32 T0, Float32 t1 )
  1836. {
  1837.    if ( ( t1 > 0 ) && ( T0 > t1 * TONE_THR ) ) {
  1838.       st->tone = st->tone | 0x00004000;
  1839.    }
  1840. }
  1841. #endif
  1842. /*
  1843.  * Lag_max
  1844.  *
  1845.  *
  1846.  * Parameters:
  1847.  *    vadSt          B: vad structure
  1848.  *    corr           I: correlation vector
  1849.  *    sig            I: signal
  1850.  *    L_frame        I: length of frame to compute pitch
  1851.  *    lag_max        I: maximum lag
  1852.  *    lag_min        I: minimum lag
  1853.  *    cor_max        O: maximum correlation
  1854.  *    dtx            I: dtx on/off
  1855.  *
  1856.  * Function:
  1857.  *    Compute the open loop pitch lag.
  1858.  *
  1859.  * Returns:
  1860.  *    p_max             lag found
  1861.  */
  1862. #ifdef VAD2
  1863. static Word16 Lag_max( Float32 corr[], Float32 sig[], Word16 L_frame,
  1864.        Word32 lag_max, Word32 lag_min, Float32 *cor_max,
  1865.        Word32 dtx, Float32 *rmax, Float32 *r0 )
  1866. #else
  1867. static Word16 Lag_max( vadState *vadSt, Float32 corr[], Float32 sig[], Word16
  1868.       L_frame, Word32 lag_max, Word32 lag_min, Float32 *cor_max, Word32 dtx )
  1869. #endif
  1870. {
  1871.    Float32 max, T0;
  1872.    Float32 *p;
  1873.    Word32 i, j, p_max;
  1874.    max = -FLT_MAX;
  1875.    p_max = lag_max;
  1876.    for ( i = lag_max, j = ( PIT_MAX - lag_max - 1 ); i >= lag_min; i--, j-- ) {
  1877.       if ( corr[ - i] >= max ) {
  1878.          max = corr[ - i];
  1879.          p_max = i;
  1880.       }
  1881.    }
  1882.    /* compute energy for normalization */
  1883.    T0 = 0.0F;
  1884.    p = &sig[ - p_max];
  1885.    for ( i = 0; i < L_frame; i++, p++ ) {
  1886.       T0 += *p * *p;
  1887.    }
  1888.    if ( dtx ) {
  1889. #ifdef VAD2
  1890.      *rmax = max;
  1891.      *r0 = T0;
  1892. #else
  1893.      /* check tone */
  1894.      vad_tone_detection( vadSt, max, T0 );
  1895. #endif
  1896.    }
  1897.    if ( T0 > 0.0F )
  1898.       T0 = 1.0F / ( Float32 )sqrt( T0 );
  1899.    else
  1900.       T0 = 0.0F;
  1901.    /* max = max/sqrt(energy) */
  1902.    max *= T0;
  1903.    *cor_max = max;
  1904.    return( ( Word16 )p_max );
  1905. }
  1906. /*
  1907.  * hp_max
  1908.  *
  1909.  *
  1910.  * Parameters:
  1911.  *    corr           I: correlation vector
  1912.  *    sig            I: signal
  1913.  *    L_frame        I: length of frame to compute pitch
  1914.  *    lag_max        I: maximum lag
  1915.  *    lag_min        I: minimum lag
  1916.  *    cor_hp_max     O: max high-pass filtered correlation
  1917.  *
  1918.  * Function:
  1919.  *    Find the maximum correlation of scal_sig[] in a given delay range.
  1920.  *
  1921.  *    The correlation is given by
  1922.  *       cor[t] = <scal_sig[n],scal_sig[n-t]>,  t=lag_min,...,lag_max
  1923.  *    The functions outputs the maximum correlation after normalization
  1924.  *    and the corresponding lag.
  1925.  *
  1926.  * Returns:
  1927.  *    void
  1928.  */
  1929. #ifndef VAD2
  1930. static void hp_max( Float32 corr[], Float32 sig[], Word32 L_frame, Word32
  1931.       lag_max, Word32 lag_min, Float32 *cor_hp_max )
  1932. {
  1933.    Float32 T0, t1, max;
  1934.    Float32 *p, *p1;
  1935.    Word32 i;
  1936.    max = -FLT_MAX;
  1937.    T0 = 0;
  1938.    for ( i = lag_max - 1; i > lag_min; i-- ) {
  1939.       /* high-pass filtering */
  1940.       T0 = ( ( corr[ - i] * 2 ) - corr[ - i-1] )-corr[ - i + 1];
  1941.       T0 = ( Float32 )fabs( T0 );
  1942.       if ( T0 >= max ) {
  1943.          max = T0;
  1944.       }
  1945.    }
  1946.    /* compute energy */
  1947.    p = sig;
  1948.    p1 = &sig[0];
  1949.    T0 = 0;
  1950.    for ( i = 0; i < L_frame; i++, p++, p1++ ) {
  1951.       T0 += *p * *p1;
  1952.    }
  1953.    p = sig;
  1954.    p1 = &sig[ - 1];
  1955.    t1 = 0;
  1956.    for ( i = 0; i < L_frame; i++, p++, p1++ ) {
  1957.       t1 += *p * *p1;
  1958.    }
  1959.    /* high-pass filtering */
  1960.    T0 = T0 - t1;
  1961.    T0 = ( Float32 )fabs( T0 );
  1962.    /* max/T0 */
  1963.    if ( T0 != 0 ) {
  1964.       *cor_hp_max = max / T0;
  1965.    }
  1966.    else {
  1967.       *cor_hp_max = 0;
  1968.    }
  1969. }
  1970. #endif
  1971. /*
  1972.  * vad_tone_detection_update
  1973.  *
  1974.  *
  1975.  * Parameters:
  1976.  *    st->tone          B: flags indicating presence of a tone
  1977.  *    one_lag_per_frame I: 1 open-loop lag is calculated per each frame
  1978.  *
  1979.  * Function:
  1980.  *    Update the tone flag register.
  1981.  *
  1982.  * Returns:
  1983.  *    void
  1984.  */
  1985. #ifndef VAD2
  1986. static void vad_tone_detection_update( vadState *st, Word16 one_lag_per_frame )
  1987. {
  1988.    /* Shift tone flags right by one bit */
  1989.    st->tone = st->tone >> 1;
  1990.    /*
  1991.     * If open-loop lag is calculated only once in each frame,
  1992.     * do extra update and assume that the other tone flag
  1993.     * of the frame is one.
  1994.     */
  1995.    if ( one_lag_per_frame != 0 ) {
  1996.       st->tone = st->tone >> 1;
  1997.       st->tone = st->tone | 0x00002000;
  1998.    }
  1999. }
  2000. #endif
  2001. /*
  2002.  * Pitch_ol
  2003.  *
  2004.  *
  2005.  * Parameters:
  2006.  *    mode           I: AMR mode
  2007.  *    vadSt          B: VAD state struct
  2008.  *    signal         I: signal used to compute the open loop pitch
  2009.  *                                                 [[-pit_max]:[-1]]
  2010.  *    pit_min        I: minimum pitch lag
  2011.  *    pit_max        I: maximum pitch lag
  2012.  *    L_frame        I: length of frame to compute pitch
  2013.  *    dtx            I: DTX flag
  2014.  *    idx            I: frame index
  2015.  *
  2016.  * Function:
  2017.  *    Compute the open loop pitch lag.
  2018.  *
  2019.  *    Open-loop pitch analysis is performed twice per frame (each 10 ms)
  2020.  *    to find two estimates of the pitch lag in each frame.
  2021.  *    Open-loop pitch analysis is performed as follows.
  2022.  *    In the first step, 3 maxima of the correlation:
  2023.  *
  2024.  *          79
  2025.  *    O(k) = SUM Sw(n)*Sw(n-k)
  2026.  *          n=0
  2027.  *
  2028.  *    are found in the three ranges:
  2029.  *       pit_min     ...      2*pit_min-1
  2030.  *       2*pit_min   ...      4*pit_min-1
  2031.  *       4*pit_min   ...      pit_max
  2032.  *
  2033.  *    The retained maxima O(t(i)), i = 1, 2, 3, are normalized by dividing by
  2034.  *
  2035.  *    SQRT[SUM[POW(Sw(n-t(i)), 2]], i = 1, 2, 3,
  2036.  *         n
  2037.  *
  2038.  *    respectively.
  2039.  *    The normalized maxima and corresponding delays are denoted by
  2040.  *    (M(i), t(i)), i = 1, 2, 3. The winner, Top, among the three normalized
  2041.  *    correlations is selected by favouring the delays with the values
  2042.  *    in the lower range. This is performed by weighting the normalized
  2043.  *    correlations corresponding to the longer delays. The best
  2044.  *    open-loop delay Top is determined as follows:
  2045.  *
  2046.  *    Top = t(1)
  2047.  *    M(Top) = M(1)
  2048.  *    if M(2) > 0.85 * M(Top)
  2049.  *       M(Top) = M(2)
  2050.  *       Top = t(2)
  2051.  *    end
  2052.  *    if M(3) > 0.85 * M(Top)
  2053.  *       M(Top) = M(3)
  2054.  *       Top = t(3)
  2055.  *    end
  2056.  *
  2057.  * Returns:
  2058.  *    void
  2059.  */
  2060. static Word32 Pitch_ol( enum Mode mode, vadState *vadSt, Float32 signal[],
  2061.       Word32 pit_min, Word32 pit_max, Word16 L_frame, Word32 dtx, Word16 idx )
  2062. {
  2063.    Float32 corr[PIT_MAX + 1];
  2064.    Float32 max1, max2, max3, p_max1, p_max2, p_max3;
  2065.    Float32 *corr_ptr;
  2066.    Word32 i, j;
  2067. #ifdef VAD2
  2068.    Float32 r01, r02, r03;
  2069.    Float32 rmax1, rmax2, rmax3;
  2070. #else
  2071.    Float32 corr_hp_max;
  2072. #endif
  2073. #ifndef VAD2
  2074.    if ( dtx ) {
  2075.       /* update tone detection */
  2076.       if ( ( mode == MR475 ) || ( mode == MR515 ) ) {
  2077.          vad_tone_detection_update( vadSt, 1 );
  2078.       }
  2079.       else {
  2080.          vad_tone_detection_update( vadSt, 0 );
  2081.       }
  2082.    }
  2083. #endif
  2084.    corr_ptr = &corr[pit_max];
  2085.    /*        79             */
  2086.    /* O(k) = SUM Sw(n)*Sw(n-k)   */
  2087.    /*        n=0               */
  2088.    comp_corr( signal, L_frame, pit_max, pit_min, corr_ptr );
  2089. #ifdef VAD2
  2090.    /* Find a maximum for each section. */
  2091.    /* Maxima 1 */
  2092.    j = pit_min << 2;
  2093.    p_max1 =
  2094.      Lag_max( corr_ptr, signal, L_frame, pit_max, j, &max1, dtx, &rmax1, &r01 );
  2095.    /* Maxima 2 */
  2096.    i = j - 1;
  2097.    j = pit_min << 1;
  2098.    p_max2 = Lag_max( corr_ptr, signal, L_frame, i, j, &max2, dtx, &rmax2, &r02 );
  2099.    /* Maxima 3 */
  2100.    i = j - 1;
  2101.    p_max3 =
  2102.      Lag_max( corr_ptr, signal, L_frame, i, pit_min, &max3, dtx, &rmax3, &r03 );
  2103. #else
  2104.    /* Find a maximum for each section. */
  2105.    /* Maxima 1 */
  2106.    j = pit_min << 2;
  2107.    p_max1 = Lag_max( vadSt, corr_ptr, signal, L_frame, pit_max, j, &max1, dtx );
  2108.    /* Maxima 2 */
  2109.    i = j - 1;
  2110.    j = pit_min << 1;
  2111.    p_max2 = Lag_max( vadSt, corr_ptr, signal, L_frame, i, j, &max2, dtx );
  2112.    /* Maxima 3 */
  2113.    i = j - 1;
  2114.    p_max3 = Lag_max( vadSt, corr_ptr, signal, L_frame, i, pit_min, &max3, dtx );
  2115.    if ( dtx ) {
  2116.       if ( idx == 1 ) {
  2117.          /* calculate max high-passed filtered correlation of all lags */
  2118.          hp_max( corr_ptr, signal, L_frame, pit_max, pit_min, &corr_hp_max );
  2119.          /* update complex background detector */
  2120.          vadSt->best_corr_hp = corr_hp_max * 0.5F;
  2121.       }
  2122.    }
  2123. #endif
  2124.    /* The best open-loop delay */
  2125.    if ( ( max1 * 0.85F ) < max2 ) {
  2126.       max1 = max2;
  2127.       p_max1 = p_max2;
  2128. #ifdef VAD2
  2129.       if (dtx) {
  2130. rmax1 = rmax2;
  2131. r01 = r02;
  2132.       }
  2133. #endif
  2134.    }
  2135.    if ( ( max1 * 0.85F ) < max3 ) {
  2136.       p_max1 = p_max3;
  2137. #ifdef VAD2
  2138.       if (dtx) {
  2139. rmax1 = rmax3;
  2140. r01 = r03;
  2141.       }
  2142. #endif
  2143.    }
  2144. #ifdef VAD2
  2145.    if (dtx) {
  2146.      vadSt->Rmax += rmax1;   /* Save max correlation */
  2147.      vadSt->R0   += r01;     /* Save max energy */
  2148.    }
  2149. #endif
  2150.    return( Word32 )p_max1;
  2151. }
  2152. /*
  2153.  * Lag_max_wght
  2154.  *
  2155.  *
  2156.  * Parameters:
  2157.  *    vadSt          B: vad structure
  2158.  *    corr           I: correlation vector
  2159.  *    signal         I: signal
  2160.  *    L_frame        I: length of frame to compute pitch
  2161.  *    old_lag        I: old open-loop lag
  2162.  *    cor_max        O: maximum correlation
  2163.  *    wght_flg       I: weighting function flag
  2164.  *    gain_flg       O: open-loop flag
  2165.  *    dtx            I: dtx on/off
  2166.  *
  2167.  * Function:
  2168.  *    Find the lag that has maximum correlation of signal in a given delay range.
  2169.  *    maximum lag = 143
  2170.  *    minimum lag = 20
  2171.  *
  2172.  * Returns:
  2173.  *    p_max             lag found
  2174.  */
  2175. static Word32 Lag_max_wght( vadState *vadSt, Float32 corr[], Float32 signal[],
  2176.       Word32 old_lag, Word32 *cor_max, Word32 wght_flg, Float32 *gain_flg,
  2177.       Word32 dtx )
  2178. {
  2179.    Float32 t0, t1, max;
  2180.    Float32 *psignal, *p1signal;
  2181.    const Float32 *ww, *we;
  2182.    Word32 i, j, p_max;
  2183.    ww = &corrweight[250];
  2184.    we = &corrweight[266 - old_lag];
  2185.    max = -FLT_MAX;
  2186.    p_max = PIT_MAX;
  2187.    /* see if the neigbouring emphasis is used */
  2188.    if ( wght_flg > 0 ) {
  2189.       /* find maximum correlation with weighting */
  2190.       for ( i = PIT_MAX; i >= PIT_MIN; i-- ) {
  2191.          /* Weighting of the correlation function. */
  2192.          t0 = corr[ - i] * *ww--;
  2193.           /* Weight the neighbourhood of the old lag. */
  2194.          t0 *= *we--;
  2195.          if ( t0 >= max ) {
  2196.             max = t0;
  2197.             p_max = i;
  2198.          }
  2199.       }
  2200.    }
  2201.    else {
  2202.       /* find maximum correlation with weighting */
  2203.       for ( i = PIT_MAX; i >= PIT_MIN; i-- ) {
  2204.          /* Weighting of the correlation function. */
  2205.          t0 = corr[ - i] * *ww--;
  2206.          if ( t0 >= max ) {
  2207.             max = t0;
  2208.             p_max = i;
  2209.          }
  2210.       }
  2211.    }
  2212.    psignal = &signal[0];
  2213.    p1signal = &signal[ - p_max];
  2214.    t0 = 0;
  2215.    t1 = 0;
  2216.    /* Compute energy */
  2217.    for ( j = 0; j < L_FRAME_BY2; j++, psignal++, p1signal++ ) {
  2218.       t0 += *psignal * *p1signal;
  2219.       t1 += *p1signal * *p1signal;
  2220.    }
  2221.    if ( dtx ) {
  2222. #ifdef VAD2
  2223.        vadSt->Rmax += t0;   /* Save max correlation */
  2224.        vadSt->R0   += t1;   /* Save max energy */
  2225. #else
  2226.       /* update and detect tone */
  2227.       vad_tone_detection_update( vadSt, 0 );
  2228.       vad_tone_detection( vadSt, t0, t1 );
  2229. #endif
  2230.    }
  2231.    /*
  2232.     * gain flag is set according to the open_loop gain
  2233.     * is t2/t1 > 0.4 ?
  2234.     */
  2235.    *gain_flg = t0 - ( t1 * 0.4F );
  2236.    *cor_max = 0;
  2237.    return( p_max );
  2238. }
  2239. /*
  2240.  * gmed_n
  2241.  *
  2242.  *
  2243.  * Parameters:
  2244.  *    ind               I: values
  2245.  *    n                 I: The number of gains
  2246.  *
  2247.  * Function:
  2248.  *    Calculates N-point median.
  2249.  *
  2250.  * Returns:
  2251.  *    index of the median value
  2252.  */
  2253. static Word32 gmed_n( Word32 ind[], Word32 n )
  2254. {
  2255.    Word32 i, j, ix = 0;
  2256.    Word32 max;
  2257.    Word32 medianIndex;
  2258.    Word32 tmp[9];
  2259.    Word32 tmp2[9];
  2260.    for ( i = 0; i < n; i++ ) {
  2261.       tmp2[i] = ind[i];
  2262.    }
  2263.    for ( i = 0; i < n; i++ ) {
  2264.       max = -32767;
  2265.       for ( j = 0; j < n; j++ ) {
  2266.          if ( tmp2[j] >= max ) {
  2267.             max = tmp2[j];
  2268.             ix = j;
  2269.          }
  2270.       }
  2271.       tmp2[ix] = -32768;
  2272.       tmp[i] = ix;
  2273.    }
  2274.    medianIndex = tmp[( n >>1 )];
  2275.    return( ind[medianIndex] );
  2276. }
  2277. /*
  2278.  * Pitch_ol_wgh
  2279.  *
  2280.  *
  2281.  * Parameters:
  2282.  *    old_T0_med     O: old Cl lags median
  2283.  *    wght_flg       I: weighting function flag
  2284.  *    ada_w          B:
  2285.  *    vadSt          B: VAD state struct
  2286.  *    signal         I: signal used to compute the open loop pitch
  2287.  *                                                  [[-pit_max]:[-1]]
  2288.  *    old_lags       I: history with old stored Cl lags
  2289.  *    ol_gain_flg    I: OL gain flag
  2290.  *    idx            I: frame index
  2291.  *    dtx            I: DTX flag
  2292.  *
  2293.  * Function:
  2294.  *    Open-loop pitch search with weight
  2295.  *
  2296.  *    Open-loop pitch analysis is performed twice per frame (every 10 ms)
  2297.  *    for the 10.2 kbit/s mode to find two estimates of the pitch lag
  2298.  *    in each frame. The open-loop pitch analysis is done in order to simplify
  2299.  *    the pitch analysis and confine the closed loop pitch search to
  2300.  *    a small number of lags around the open-loop estimated lags.
  2301.  *    Open-loop pitch estimation is based on the weighted speech signal
  2302.  *    which is obtained by filtering the input speech signal through
  2303.  *    the weighting filter.
  2304.  *    The correlation of weighted speech is determined.
  2305.  *    The estimated pitch-lag is the delay that maximises
  2306.  *    the weighted autocorrelation function. To enhance  pitch-lag analysis
  2307.  *    the autocorrelation function estimate is modified by a weighting window.
  2308.  *    The weighting emphasises relevant pitch-lags, thus increasing
  2309.  *    the likelihood of selecting the correct delay.
  2310.  *    minimum pitch lag = 20
  2311.  *    maximum pitch lag = 143
  2312.  *
  2313.  * Returns:
  2314.  *    p_max1            open loop pitch lag
  2315.  */
  2316. static Word32 Pitch_ol_wgh( Word32 *old_T0_med, Word16 *wght_flg, Float32 *ada_w,
  2317.       vadState *vadSt, Float32 signal[], Word32 old_lags[], Float32 ol_gain_flg[],
  2318.       Word16 idx, Word32 dtx )
  2319. {
  2320.    Float32 corr[PIT_MAX + 1];
  2321. #ifndef VAD2
  2322.    Float32 corr_hp_max;
  2323. #endif
  2324.    Float32 *corrPtr;
  2325.    Word32 i, max1, p_max1;
  2326.    /* calculate all coreelations of signal, from pit_min to pit_max */
  2327.    corrPtr = &corr[PIT_MAX];
  2328.    comp_corr( signal, L_FRAME_BY2, PIT_MAX, PIT_MIN, corrPtr );
  2329.    p_max1 = Lag_max_wght( vadSt, corrPtr, signal, *old_T0_med,
  2330.          &max1, *wght_flg, &ol_gain_flg[idx], dtx );
  2331.    if ( ol_gain_flg[idx] > 0 ) {
  2332.       /* Calculate 5-point median of previous lags */
  2333.       /* Shift buffer */
  2334.       for ( i = 4; i > 0; i-- ) {
  2335.          old_lags[i] = old_lags[i - 1];
  2336.       }
  2337.       old_lags[0] = p_max1;
  2338.       *old_T0_med = gmed_n( old_lags, 5 );
  2339.       *ada_w = 1;
  2340.    }
  2341.    else {
  2342.       *old_T0_med = p_max1;
  2343.       *ada_w = *ada_w * 0.9F;
  2344.    }
  2345.    if ( *ada_w < 0.3 ) {
  2346.       *wght_flg = 0;
  2347.    }
  2348.    else {
  2349.       *wght_flg = 1;
  2350.    }
  2351. #ifndef VAD2
  2352.    if ( dtx ) {
  2353.       if ( idx == 1 ) {
  2354.          /* calculate max high-passed filtered correlation of all lags */
  2355.          hp_max( corrPtr, signal, L_FRAME_BY2, PIT_MAX, PIT_MIN, &corr_hp_max );
  2356.          /* update complex background detector */
  2357.          vadSt->best_corr_hp = corr_hp_max * 0.5F;
  2358.       }
  2359.    }
  2360. #endif
  2361.    return( p_max1 );
  2362. }
  2363. /*
  2364.  * ol_ltp
  2365.  *
  2366.  *
  2367.  * Parameters:
  2368.  *    mode              I: AMR mode
  2369.  *    vadSt             B: VAD state struct
  2370.  *    wsp               I: signal used to compute the OL pitch
  2371.  *    T_op              O: open loop pitch lag
  2372.  *    ol_gain_flg       I: OL gain flag
  2373.  *    old_T0_med        O: old Cl lags median
  2374.  *    wght_flg          I: weighting function flag
  2375.  *    ada_w             B:
  2376.  *    old_lags          I: history with old stored Cl lags
  2377.  *    ol_gain_flg       I: OL gain flag
  2378.  *    dtx               I: DTX flag
  2379.  *    idx               I: frame index
  2380.  *
  2381.  * Function:
  2382.  *    Compute the open loop pitch lag.
  2383.  *
  2384.  *    Open-loop pitch analysis is performed in order to simplify
  2385.  *    the pitch analysis and confine the closed-loop pitch search to
  2386.  *    a small number of lags around the open-loop estimated lags.
  2387.  *    Open-loop pitch estimation is based on the weighted speech signal Sw(n)
  2388.  *    which is obtained by filtering the input speech signal through
  2389.  *    the weighting filter W(z) = A(z/g1) / A(z/g2). That is,
  2390.  *    in a subframe of size L, the weighted speech is given by:
  2391.  *
  2392.  *                10
  2393.  *    Sw(n) = S(n) + SUM[ a(i) * g1(i) * S(n-i) ]
  2394.  *                i=1
  2395.  *                   10
  2396.  *                - SUM[ a(i) * g2(i) * Sw(n-i) ], n = 0, ..., L-1
  2397.  *                  i=1
  2398.  *
  2399.  * Returns:
  2400.  *    void
  2401.  */
  2402. static void ol_ltp( enum Mode mode, vadState *vadSt, Float32 wsp[], Word32 *T_op
  2403.       , Float32 ol_gain_flg[], Word32 *old_T0_med, Word16 *wght_flg, Float32 *ada_w
  2404.       , Word32 *old_lags, Word32 dtx, Word16 idx )
  2405. {
  2406.    if ( mode != MR102 ) {
  2407.       ol_gain_flg[0] = 0;
  2408.       ol_gain_flg[1] = 0;
  2409.    }
  2410.    if ( ( mode == MR475 ) || ( mode == MR515 ) ) {
  2411.       *T_op = Pitch_ol( mode, vadSt, wsp, PIT_MIN, PIT_MAX, L_FRAME, dtx, idx );
  2412.    }
  2413.    else {
  2414.       if ( mode <= MR795 ) {
  2415.          *T_op = Pitch_ol( mode, vadSt, wsp, PIT_MIN, PIT_MAX, L_FRAME_BY2, dtx,
  2416.                idx );
  2417.       }
  2418.       else if ( mode == MR102 ) {
  2419.          *T_op = Pitch_ol_wgh( old_T0_med, wght_flg, ada_w, vadSt, wsp, old_lags,
  2420.             ol_gain_flg, idx, dtx );
  2421.       }
  2422.       else {
  2423.          *T_op = Pitch_ol( mode, vadSt, wsp, PIT_MIN_MR122, PIT_MAX, L_FRAME_BY2
  2424.                , dtx, idx );
  2425.       }
  2426.    }
  2427. }
  2428. /*
  2429.  * subframePreProc
  2430.  *
  2431.  *
  2432.  * Parameters:
  2433.  *    mode           I: AMR mode
  2434.  *    gamma1         I: spectral exp. factor 1
  2435.  *    gamma1_12k2    I: spectral exp. factor 1 for EFR
  2436.  *    gamma2         I: spectral exp. factor 2
  2437.  *    A              I: A(z) unquantized for the 4 subframes
  2438.  *    Aq             I: A(z)   quantized for the 4 subframes
  2439.  *    speech         I: speech segment
  2440.  *    mem_err        I: pointer to error signal
  2441.  *    mem_w0         I: memory of weighting filter
  2442.  *    zero           I: pointer to zero vector
  2443.  *    ai_zero        O: history of weighted synth. filter
  2444.  *    exc            O: long term prediction residual
  2445.  *    h1             O: impulse response
  2446.  *    xn             O: target vector for pitch search
  2447.  *    res2           O: long term prediction residual
  2448.  *    error          O: error of LPC synthesis filter
  2449.  *
  2450.  * Function:
  2451.  *    Subframe preprocessing
  2452.  *
  2453.  *    Impulse response computation:
  2454.  *       The impulse response, h(n), of the weighted synthesis filter
  2455.  *
  2456.  *       H(z) * W(z) = A(z/g1) / ( A'(z) * A(z/g2) )
  2457.  *
  2458.  *       is computed each subframe. This impulse response is needed for
  2459.  *       the search of adaptive and fixed codebooks. The impulse response h(n)
  2460.  *       is computed by filtering the vector of coefficients of
  2461.  *       the filter A(z/g1) extended by zeros through the two filters
  2462.  *       1/A'(z) and 1/A(z/g2).
  2463.  *
  2464.  *    Target signal computation:
  2465.  *       The target signal for adaptive codebook search is usually computed
  2466.  *       by subtracting the zero input response of
  2467.  *       the weighted synthesis filter H(z) * W(z) from the weighted
  2468.  *       speech signal Sw(n). This is performed on a subframe basis.
  2469.  *       An equivalent procedure for computing the target signal is
  2470.  *       the filtering of the LP residual signal res(n) through
  2471.  *       the combination of synthesis filter 1/A'(z) and
  2472.  *       the weighting filter A(z/g1)/A(z/g2). After determining
  2473.  *       the excitation for the subframe, the initial states of
  2474.  *       these filters are updated by filtering the difference between
  2475.  *       the LP residual and excitation.
  2476.  *
  2477.  *       The residual signal res(n) which is needed for finding
  2478.  *       the target vector is also used in the adaptive codebook search
  2479.  *       to extend the past excitation buffer. This simplifies
  2480.  *       the adaptive codebook search procedure for delays less than
  2481.  *       the subframe size of 40. The LP residual is given by:
  2482.  *
  2483.  *                        10
  2484.  *       res(n) = S(n) + SUM[A'(i)* S(n-i)
  2485.  *                       i=1
  2486.  *
  2487.  * Returns:
  2488.  *    void
  2489.  */
  2490. static void subframePreProc( enum Mode mode, const Float32 gamma1[], const
  2491.       Float32 gamma1_12k2[], const Float32 gamma2[], Float32 *A, Float32 *Aq,
  2492.       Float32 *speech, Float32 *mem_err, Float32 *mem_w0, Float32 *zero, Float32
  2493.       ai_zero[], Float32 *exc, Float32 h1[], Float32 xn[], Float32 res2[],
  2494.       Float32 error[] )
  2495. {
  2496.    Float32 Ap1[MP1];   /* weighted LPC coefficients */
  2497.    Float32 Ap2[MP1];   /* weighted LPC coefficients */
  2498.    const Float32 *g1;
  2499.    /* mode specific pointer to gamma1 values */
  2500.    g1 = gamma1;
  2501.    if ( ( mode == MR122 ) || ( mode == MR102 ) ) {
  2502.       g1 = gamma1_12k2;
  2503.    }
  2504.    /* Find the weighted LPC coefficients for the weighting filter. */
  2505.    Weight_Ai( A, g1, Ap1 );
  2506.    Weight_Ai( A, gamma2, Ap2 );
  2507.    /*
  2508.     * Compute impulse response, h1[],
  2509.     * of weighted synthesis filter A(z/g1)/A(z/g2)
  2510.     */
  2511.    memcpy( ai_zero, Ap1, MP1 <<2 );
  2512.    Syn_filt( Aq, ai_zero, h1, zero, 0 );
  2513.    Syn_filt( Ap2, h1, h1, zero, 0 );
  2514.    /*
  2515.     * Find the target vector for pitch search:
  2516.     */
  2517.    /* LP residual */
  2518.    Residu( Aq, speech, res2 );
  2519.    memcpy( exc, res2, L_SUBFR <<2 );
  2520.    /* Synthesis filter */
  2521.    Syn_filt( Aq, exc, error, mem_err, 0 );
  2522.    Residu( Ap1, error, xn );
  2523.    /* target signal xn[] */
  2524.    Syn_filt( Ap2, xn, xn, mem_w0, 0 );
  2525. }
  2526. /*
  2527.  * getRange
  2528.  *
  2529.  *
  2530.  * Parameters:
  2531.  *    T0                I: integer pitch
  2532.  *    delta_low         I: search start offset
  2533.  *    delta_range       I: search range
  2534.  *    pitmin            I: minimum pitch
  2535.  *    pitmax            I: maximum pitch
  2536.  *    T0_min            I: search range minimum
  2537.  *    T0_max            I: search range maximum
  2538.  *
  2539.  * Function:
  2540.  *    Sets range around open-loop pitch or integer pitch of last subframe
  2541.  *
  2542.  *    Takes integer pitch T0 and calculates a range around it with
  2543.  *    T0_min = T0-delta_low and T0_max = (T0-delta_low) + delta_range
  2544.  *    T0_min and T0_max are bounded by pitmin and pitmax
  2545.  *
  2546.  * Returns:
  2547.  *    void
  2548.  */
  2549. static void getRange( Word32 T0, Word16 delta_low, Word16 delta_range,
  2550.       Word16 pitmin, Word16 pitmax, Word32 *T0_min, Word32 *T0_max )
  2551. {
  2552.    *T0_min = T0 - delta_low;
  2553.    if ( *T0_min < pitmin ) {
  2554.       *T0_min = pitmin;
  2555.    }
  2556.    *T0_max = *T0_min + delta_range;
  2557.    if ( *T0_max > pitmax ) {
  2558.       *T0_max = pitmax;
  2559.       *T0_min = *T0_max - delta_range;
  2560.    }
  2561. }
  2562. /*
  2563.  * Norm_Corr
  2564.  *
  2565.  *
  2566.  * Parameters:
  2567.  *    exc         I: excitation buffer                      [L_SUBFR]
  2568.  *    xn          I: target vector                          [L_SUBFR]
  2569.  *    h           I: impulse response of synthesis and weighting filters
  2570.  *                                                          [L_SUBFR]
  2571.  *    t_min       I: interval to compute normalized correlation
  2572.  *    t_max       I: interval to compute normalized correlation
  2573.  *    corr_norm   O: Normalized correlation                 [wT_min-wT_max]
  2574.  *
  2575.  * Function:
  2576.  *    Normalized correlation
  2577.  *
  2578.  *    The closed-loop pitch search is performed by minimizing
  2579.  *    the mean-square weighted error between the original and
  2580.  *    synthesized speech. This is achieved by maximizing the term:
  2581.  *
  2582.  *            39                           39
  2583.  *    R(k) = SUM[ X(n) * Yk(n)) ] / SQRT[ SUM[ Yk(n) * Yk(n)] ]
  2584.  *           n=0                          n=0
  2585.  *
  2586.  *    where X(n) is the target signal and Yk(n) is the past filtered
  2587.  *    excitation at delay k (past excitation convolved with h(n) ).
  2588.  *    The search range is limited around the open-loop pitch.
  2589.  *
  2590.  *    The convolution Yk(n) is computed for the first delay t_min in
  2591.  *    the searched range, and for the other delays in the search range
  2592.  *    k = t_min + 1, ..., t_max, it is updated using the recursive relation:
  2593.  *
  2594.  *    Yk(n) = Yk-1(n-1) + u(-k) * h(n),
  2595.  *
  2596.  *    where u(n), n = -( 143 + 11 ), ..., 39, is the excitation buffer.
  2597.  *    Note that in search stage, the samples u(n), n = 0, ..., 39,
  2598.  *    are not known, and they are needed for pitch delays less than 40.
  2599.  *    To simplify the search, the LP residual is copied to u(n) in order
  2600.  *    to make the relation in above equation valid for all delays.
  2601.  *
  2602.  * Returns:
  2603.  *    void
  2604.  */
  2605. static void Norm_Corr( Float32 exc[], Float32 xn[], Float32 h[], Word32 t_min,
  2606.       Word32 t_max, Float32 corr_norm[] )
  2607. {
  2608.    Float32 exc_temp[L_SUBFR];
  2609.    Float32 *p_exc;
  2610.    Float32 corr, norm;
  2611.    Float32 sum;
  2612.    Word32 i, j, k;
  2613.    k = -t_min;
  2614.    p_exc = &exc[ - t_min];
  2615.    /* compute the filtered excitation for the first delay t_min */
  2616.    /* convolution Yk(n) */
  2617.    for ( j = 0; j < L_SUBFR; j++ ) {
  2618.       sum = 0;
  2619.       for ( i = 0; i <= j; i++ ) {
  2620.          sum += p_exc[i] * h[j - i];
  2621.       }
  2622.       exc_temp[j] = sum;
  2623.    }
  2624.    /* loop for every possible period */
  2625.    for ( i = t_min; i <= t_max; i++ ) {
  2626.       /*        39                     */
  2627.       /* SQRT[ SUM[ Yk(n) * Yk(n)] ]   */
  2628.       /*       n=0                     */
  2629.       norm = (Float32)Dotproduct40( exc_temp, exc_temp );
  2630.       if ( norm == 0 )
  2631.          norm = 1.0;
  2632.       else
  2633.          norm = ( Float32 )( 1.0 / ( sqrt( norm ) ) );
  2634.       /*        39                  */
  2635.       /* SQRT[ SUM[ X(n) * Yk(n)] ] */
  2636.       /*       n=0                  */
  2637.       corr = (Float32)Dotproduct40( xn, exc_temp );
  2638.       /* R(k) */
  2639.       corr_norm[i] = corr * norm;
  2640.       /* modify the filtered excitation exc_tmp[] for the next iteration */
  2641.       if ( i != t_max ) {
  2642.          k--;
  2643.          for ( j = L_SUBFR - 1; j > 0; j-- ) {
  2644.             /* Yk(n) = Yk-1(n-1) + u(-k) * h(n) */
  2645.             exc_temp[j] = exc_temp[j - 1] + exc[k] * h[j];
  2646.          }
  2647.          exc_temp[0] = exc[k];
  2648.       }
  2649.    }
  2650. }
  2651. /*
  2652.  * Interpol_3or6
  2653.  *
  2654.  *
  2655.  * Parameters:
  2656.  *    x                 I: input vector
  2657.  *    frac              I: fraction  (-2..2 for 3*, -3..3 for 6*)
  2658.  *    flag3             I: if set, upsampling rate = 3 (6 otherwise)
  2659.  *
  2660.  * Function:
  2661.  *    Interpolating the normalized correlation with 1/3 or 1/6 resolution.
  2662.  *
  2663.  *    The interpolation is performed using an FIR filter b24
  2664.  *    based on a Hamming windowed sin(x)/x function truncated at