sp_enc.cpp
上传用户:mony888
上传日期:2022-07-26
资源大小:1247k
文件大小:277k
源码类别:

Windows CE

开发平台:

Visual C++

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