long_term.c
上传用户:shw771010
上传日期:2022-01-05
资源大小:991k
文件大小:23k
源码类别:

Audio

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
  3.  * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
  4.  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  5.  */
  6. #include <stdio.h>
  7. #include <assert.h>
  8. #include "gsm610_priv.h"
  9. /*
  10.  *  4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION
  11.  */
  12. /*
  13.  * This module computes the LTP gain (bc) and the LTP lag (Nc)
  14.  * for the long term analysis filter.   This is done by calculating a
  15.  * maximum of the cross-correlation function between the current
  16.  * sub-segment short term residual signal d[0..39] (output of
  17.  * the short term analysis filter; for simplification the index
  18.  * of this array begins at 0 and ends at 39 for each sub-segment of the
  19.  * RPE-LTP analysis) and the previous reconstructed short term
  20.  * residual signal dp[ -120 .. -1 ].  A dynamic scaling must be
  21.  * performed to avoid overflow.
  22.  */
  23.  /* The next procedure exists in six versions.  First two integer
  24.   * version (if USE_FLOAT_MUL is not defined); then four floating
  25.   * point versions, twice with proper scaling (USE_FLOAT_MUL defined),
  26.   * once without (USE_FLOAT_MUL and FAST defined, and fast run-time
  27.   * option used).  Every pair has first a Cut version (see the -C
  28.   * option to toast or the LTP_CUT option to gsm_option()), then the
  29.   * uncut one.  (For a detailed explanation of why this is altogether
  30.   * a bad idea, see Henry Spencer and Geoff Collyer, ``#ifdef Considered
  31.   * Harmful''.)
  32.   */
  33. #ifndef  USE_FLOAT_MUL
  34. #ifdef LTP_CUT
  35. static void Cut_Calculation_of_the_LTP_parameters (
  36. struct gsm_state * st,
  37. register word * d, /* [0..39] IN */
  38. register word * dp, /* [-120..-1] IN */
  39. word * bc_out, /*  OUT */
  40. word * Nc_out /*  OUT */
  41. )
  42. {
  43. register int   k, lambda;
  44. word Nc, bc;
  45. word wt[40];
  46. longword L_result;
  47. longword L_max, L_power;
  48. word R, S, dmax, scal, best_k;
  49. word ltp_cut;
  50. register word temp, wt_k;
  51. /*  Search of the optimum scaling of d[0..39].
  52.  */
  53. dmax = 0;
  54. for (k = 0; k <= 39; k++) {
  55. temp = d[k];
  56. temp = GSM_ABS( temp );
  57. if (temp > dmax) {
  58. dmax = temp;
  59. best_k = k;
  60. }
  61. }
  62. temp = 0;
  63. if (dmax == 0) scal = 0;
  64. else {
  65. assert(dmax > 0);
  66. temp = gsm_norm( (longword)dmax << 16 );
  67. }
  68. if (temp > 6) scal = 0;
  69. else scal = 6 - temp;
  70. assert(scal >= 0);
  71. /* Search for the maximum cross-correlation and coding of the LTP lag
  72.  */
  73. L_max = 0;
  74. Nc    = 40; /* index for the maximum cross-correlation */
  75. wt_k  = SASR_W(d[best_k], scal);
  76. for (lambda = 40; lambda <= 120; lambda++) {
  77. L_result = (longword)wt_k * dp[best_k - lambda];
  78. if (L_result > L_max) {
  79. Nc    = lambda;
  80. L_max = L_result;
  81. }
  82. }
  83. *Nc_out = Nc;
  84. L_max <<= 1;
  85. /*  Rescaling of L_max
  86.  */
  87. assert(scal <= 100 && scal >= -100);
  88. L_max = L_max >> (6 - scal); /* sub(6, scal) */
  89. assert( Nc <= 120 && Nc >= 40);
  90. /*   Compute the power of the reconstructed short term residual
  91.  *   signal dp[..]
  92.  */
  93. L_power = 0;
  94. for (k = 0; k <= 39; k++) {
  95. register longword L_temp;
  96. L_temp   = SASR_W( dp[k - Nc], 3 );
  97. L_power += L_temp * L_temp;
  98. }
  99. L_power <<= 1; /* from L_MULT */
  100. /*  Normalization of L_max and L_power
  101.  */
  102. if (L_max <= 0)  {
  103. *bc_out = 0;
  104. return;
  105. }
  106. if (L_max >= L_power) {
  107. *bc_out = 3;
  108. return;
  109. }
  110. temp = gsm_norm( L_power );
  111. R = SASR( L_max   << temp, 16 );
  112. S = SASR( L_power << temp, 16 );
  113. /*  Coding of the LTP gain
  114.  */
  115. /*  Table 4.3a must be used to obtain the level DLB[i] for the
  116.  *  quantization of the LTP gain b to get the coded version bc.
  117.  */
  118. for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
  119. *bc_out = bc;
  120. }
  121. #endif  /* LTP_CUT */
  122. static void Calculation_of_the_LTP_parameters (
  123. register word * d, /* [0..39] IN */
  124. register word * dp, /* [-120..-1] IN */
  125. word * bc_out, /*  OUT */
  126. word * Nc_out /*  OUT */
  127. )
  128. {
  129. register int   k, lambda;
  130. word Nc, bc;
  131. word wt[40];
  132. longword L_max, L_power;
  133. word R, S, dmax, scal;
  134. register word temp;
  135. /*  Search of the optimum scaling of d[0..39].
  136.  */
  137. dmax = 0;
  138. for (k = 0; k <= 39; k++) {
  139. temp = d[k];
  140. temp = GSM_ABS( temp );
  141. if (temp > dmax) dmax = temp;
  142. }
  143. temp = 0;
  144. if (dmax == 0) scal = 0;
  145. else {
  146. assert(dmax > 0);
  147. temp = gsm_norm( (longword)dmax << 16 );
  148. }
  149. if (temp > 6) scal = 0;
  150. else scal = 6 - temp;
  151. assert(scal >= 0);
  152. /*  Initialization of a working array wt
  153.  */
  154. for (k = 0; k <= 39; k++) wt[k] = SASR_W( d[k], scal );
  155. /* Search for the maximum cross-correlation and coding of the LTP lag
  156.  */
  157. L_max = 0;
  158. Nc    = 40; /* index for the maximum cross-correlation */
  159. for (lambda = 40; lambda <= 120; lambda++) {
  160. # undef STEP
  161. # define STEP(k)  (longword)wt[k] * dp[k - lambda]
  162. register longword L_result;
  163. L_result  = STEP(0)  ; L_result += STEP(1) ;
  164. L_result += STEP(2)  ; L_result += STEP(3) ;
  165. L_result += STEP(4)  ; L_result += STEP(5)  ;
  166. L_result += STEP(6)  ; L_result += STEP(7)  ;
  167. L_result += STEP(8)  ; L_result += STEP(9)  ;
  168. L_result += STEP(10) ; L_result += STEP(11) ;
  169. L_result += STEP(12) ; L_result += STEP(13) ;
  170. L_result += STEP(14) ; L_result += STEP(15) ;
  171. L_result += STEP(16) ; L_result += STEP(17) ;
  172. L_result += STEP(18) ; L_result += STEP(19) ;
  173. L_result += STEP(20) ; L_result += STEP(21) ;
  174. L_result += STEP(22) ; L_result += STEP(23) ;
  175. L_result += STEP(24) ; L_result += STEP(25) ;
  176. L_result += STEP(26) ; L_result += STEP(27) ;
  177. L_result += STEP(28) ; L_result += STEP(29) ;
  178. L_result += STEP(30) ; L_result += STEP(31) ;
  179. L_result += STEP(32) ; L_result += STEP(33) ;
  180. L_result += STEP(34) ; L_result += STEP(35) ;
  181. L_result += STEP(36) ; L_result += STEP(37) ;
  182. L_result += STEP(38) ; L_result += STEP(39) ;
  183. if (L_result > L_max) {
  184. Nc    = lambda;
  185. L_max = L_result;
  186. }
  187. }
  188. *Nc_out = Nc;
  189. L_max <<= 1;
  190. /*  Rescaling of L_max
  191.  */
  192. assert(scal <= 100 && scal >=  -100);
  193. L_max = L_max >> (6 - scal); /* sub(6, scal) */
  194. assert( Nc <= 120 && Nc >= 40);
  195. /*   Compute the power of the reconstructed short term residual
  196.  *   signal dp[..]
  197.  */
  198. L_power = 0;
  199. for (k = 0; k <= 39; k++) {
  200. register longword L_temp;
  201. L_temp   = SASR_W( dp[k - Nc], 3 );
  202. L_power += L_temp * L_temp;
  203. }
  204. L_power <<= 1; /* from L_MULT */
  205. /*  Normalization of L_max and L_power
  206.  */
  207. if (L_max <= 0)  {
  208. *bc_out = 0;
  209. return;
  210. }
  211. if (L_max >= L_power) {
  212. *bc_out = 3;
  213. return;
  214. }
  215. temp = gsm_norm( L_power );
  216. R = SASR_L( L_max   << temp, 16 );
  217. S = SASR_L( L_power << temp, 16 );
  218. /*  Coding of the LTP gain
  219.  */
  220. /*  Table 4.3a must be used to obtain the level DLB[i] for the
  221.  *  quantization of the LTP gain b to get the coded version bc.
  222.  */
  223. for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
  224. *bc_out = bc;
  225. }
  226. #else /* USE_FLOAT_MUL */
  227. #ifdef LTP_CUT
  228. static void Cut_Calculation_of_the_LTP_parameters (
  229. struct gsm_state * st, /*              IN  */
  230. register word * d, /* [0..39] IN */
  231. register word * dp, /* [-120..-1] IN */
  232. word * bc_out, /*  OUT */
  233. word * Nc_out /*  OUT */
  234. )
  235. {
  236. register int   k, lambda;
  237. word Nc, bc;
  238. word ltp_cut;
  239. float wt_float[40];
  240. float dp_float_base[120], * dp_float = dp_float_base + 120;
  241. longword L_max, L_power;
  242. word R, S, dmax, scal;
  243. register word temp;
  244. /*  Search of the optimum scaling of d[0..39].
  245.  */
  246. dmax = 0;
  247. for (k = 0; k <= 39; k++) {
  248. temp = d[k];
  249. temp = GSM_ABS( temp );
  250. if (temp > dmax) dmax = temp;
  251. }
  252. temp = 0;
  253. if (dmax == 0) scal = 0;
  254. else {
  255. assert(dmax > 0);
  256. temp = gsm_norm( (longword)dmax << 16 );
  257. }
  258. if (temp > 6) scal = 0;
  259. else scal = 6 - temp;
  260. assert(scal >= 0);
  261. ltp_cut = (longword)SASR_W(dmax, scal) * st->ltp_cut / 100; 
  262. /*  Initialization of a working array wt
  263.  */
  264. for (k = 0; k < 40; k++) {
  265. register word w = SASR_W( d[k], scal );
  266. if (w < 0 ? w > -ltp_cut : w < ltp_cut) {
  267. wt_float[k] = 0.0;
  268. }
  269. else {
  270. wt_float[k] =  w;
  271. }
  272. }
  273. for (k = -120; k <  0; k++) dp_float[k] =  dp[k];
  274. /* Search for the maximum cross-correlation and coding of the LTP lag
  275.  */
  276. L_max = 0;
  277. Nc    = 40; /* index for the maximum cross-correlation */
  278. for (lambda = 40; lambda <= 120; lambda += 9) {
  279. /*  Calculate L_result for l = lambda .. lambda + 9.
  280.  */
  281. register float *lp = dp_float - lambda;
  282. register float W;
  283. register float a = lp[-8], b = lp[-7], c = lp[-6],
  284. d = lp[-5], e = lp[-4], f = lp[-3],
  285. g = lp[-2], h = lp[-1];
  286. register float  E; 
  287. register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
  288. S5 = 0, S6 = 0, S7 = 0, S8 = 0;
  289. # undef STEP
  290. # define STEP(K, a, b, c, d, e, f, g, h) 
  291. if ((W = wt_float[K]) != 0.0) {
  292. E = W * a; S8 += E;
  293. E = W * b; S7 += E;
  294. E = W * c; S6 += E;
  295. E = W * d; S5 += E;
  296. E = W * e; S4 += E;
  297. E = W * f; S3 += E;
  298. E = W * g; S2 += E;
  299. E = W * h; S1 += E;
  300. a  = lp[K];
  301. E = W * a; S0 += E; } else (a = lp[K])
  302. # define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h)
  303. # define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a)
  304. # define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b)
  305. # define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c)
  306. # define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d)
  307. # define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e)
  308. # define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f)
  309. # define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g)
  310. STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
  311. STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
  312. STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
  313. STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
  314. STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
  315. STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
  316. STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
  317. STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
  318. STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
  319. STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
  320. # undef STEP_A
  321. # undef STEP_B
  322. # undef STEP_C
  323. # undef STEP_D
  324. # undef STEP_E
  325. # undef STEP_F
  326. # undef STEP_G
  327. # undef STEP_H
  328. if (S0 > L_max) { L_max = S0; Nc = lambda;     }
  329. if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
  330. if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
  331. if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
  332. if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
  333. if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
  334. if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
  335. if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
  336. if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
  337. }
  338. *Nc_out = Nc;
  339. L_max <<= 1;
  340. /*  Rescaling of L_max
  341.  */
  342. assert(scal <= 100 && scal >=  -100);
  343. L_max = L_max >> (6 - scal); /* sub(6, scal) */
  344. assert( Nc <= 120 && Nc >= 40);
  345. /*   Compute the power of the reconstructed short term residual
  346.  *   signal dp[..]
  347.  */
  348. L_power = 0;
  349. for (k = 0; k <= 39; k++) {
  350. register longword L_temp;
  351. L_temp   = SASR_W( dp[k - Nc], 3 );
  352. L_power += L_temp * L_temp;
  353. }
  354. L_power <<= 1; /* from L_MULT */
  355. /*  Normalization of L_max and L_power
  356.  */
  357. if (L_max <= 0)  {
  358. *bc_out = 0;
  359. return;
  360. }
  361. if (L_max >= L_power) {
  362. *bc_out = 3;
  363. return;
  364. }
  365. temp = gsm_norm( L_power );
  366. R = SASR( L_max   << temp, 16 );
  367. S = SASR( L_power << temp, 16 );
  368. /*  Coding of the LTP gain
  369.  */
  370. /*  Table 4.3a must be used to obtain the level DLB[i] for the
  371.  *  quantization of the LTP gain b to get the coded version bc.
  372.  */
  373. for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
  374. *bc_out = bc;
  375. }
  376. #endif /* LTP_CUT */
  377. static void Calculation_of_the_LTP_parameters (
  378. register word * din, /* [0..39] IN */
  379. register word * dp, /* [-120..-1] IN */
  380. word * bc_out, /*  OUT */
  381. word * Nc_out /*  OUT */
  382. )
  383. {
  384. register int   k, lambda;
  385. word Nc, bc;
  386. float wt_float[40];
  387. float dp_float_base[120], * dp_float = dp_float_base + 120;
  388. longword L_max, L_power;
  389. word R, S, dmax, scal;
  390. register word temp;
  391. /*  Search of the optimum scaling of d[0..39].
  392.  */
  393. dmax = 0;
  394. for (k = 0; k <= 39; k++) {
  395. temp = din [k] ;
  396. temp = GSM_ABS (temp) ;
  397. if (temp > dmax) dmax = temp;
  398. }
  399. temp = 0;
  400. if (dmax == 0) scal = 0;
  401. else {
  402. assert(dmax > 0);
  403. temp = gsm_norm( (longword)dmax << 16 );
  404. }
  405. if (temp > 6) scal = 0;
  406. else scal = 6 - temp;
  407. assert(scal >= 0);
  408. /*  Initialization of a working array wt
  409.  */
  410. for (k =    0; k < 40; k++) wt_float[k] =  SASR_W (din [k], scal) ;
  411. for (k = -120; k <  0; k++) dp_float[k] =  dp[k];
  412. /* Search for the maximum cross-correlation and coding of the LTP lag
  413.  */
  414. L_max = 0;
  415. Nc    = 40; /* index for the maximum cross-correlation */
  416. for (lambda = 40; lambda <= 120; lambda += 9) {
  417. /*  Calculate L_result for l = lambda .. lambda + 9.
  418.  */
  419. register float *lp = dp_float - lambda;
  420. register float W;
  421. register float a = lp[-8], b = lp[-7], c = lp[-6],
  422. d = lp[-5], e = lp[-4], f = lp[-3],
  423. g = lp[-2], h = lp[-1];
  424. register float  E; 
  425. register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
  426. S5 = 0, S6 = 0, S7 = 0, S8 = 0;
  427. # undef STEP
  428. # define STEP(K, a, b, c, d, e, f, g, h) 
  429. W = wt_float[K];
  430. E = W * a; S8 += E;
  431. E = W * b; S7 += E;
  432. E = W * c; S6 += E;
  433. E = W * d; S5 += E;
  434. E = W * e; S4 += E;
  435. E = W * f; S3 += E;
  436. E = W * g; S2 += E;
  437. E = W * h; S1 += E;
  438. a  = lp[K];
  439. E = W * a; S0 += E
  440. # define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h)
  441. # define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a)
  442. # define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b)
  443. # define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c)
  444. # define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d)
  445. # define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e)
  446. # define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f)
  447. # define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g)
  448. STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
  449. STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
  450. STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
  451. STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
  452. STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
  453. STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
  454. STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
  455. STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
  456. STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
  457. STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
  458. # undef STEP_A
  459. # undef STEP_B
  460. # undef STEP_C
  461. # undef STEP_D
  462. # undef STEP_E
  463. # undef STEP_F
  464. # undef STEP_G
  465. # undef STEP_H
  466. if (S0 > L_max) { L_max = S0; Nc = lambda;     }
  467. if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
  468. if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
  469. if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
  470. if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
  471. if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
  472. if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
  473. if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
  474. if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
  475. }
  476. *Nc_out = Nc;
  477. L_max <<= 1;
  478. /*  Rescaling of L_max
  479.  */
  480. assert(scal <= 100 && scal >=  -100);
  481. L_max = L_max >> (6 - scal); /* sub(6, scal) */
  482. assert( Nc <= 120 && Nc >= 40);
  483. /*   Compute the power of the reconstructed short term residual
  484.  *   signal dp[..]
  485.  */
  486. L_power = 0;
  487. for (k = 0; k <= 39; k++) {
  488. register longword L_temp;
  489. L_temp   = SASR_W( dp[k - Nc], 3 );
  490. L_power += L_temp * L_temp;
  491. }
  492. L_power <<= 1; /* from L_MULT */
  493. /*  Normalization of L_max and L_power
  494.  */
  495. if (L_max <= 0)  {
  496. *bc_out = 0;
  497. return;
  498. }
  499. if (L_max >= L_power) {
  500. *bc_out = 3;
  501. return;
  502. }
  503. temp = gsm_norm( L_power );
  504. R = SASR_L ( L_max   << temp, 16 );
  505. S = SASR_L ( L_power << temp, 16 );
  506. /*  Coding of the LTP gain
  507.  */
  508. /*  Table 4.3a must be used to obtain the level DLB[i] for the
  509.  *  quantization of the LTP gain b to get the coded version bc.
  510.  */
  511. for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
  512. *bc_out = bc;
  513. }
  514. #ifdef FAST
  515. #ifdef LTP_CUT
  516. static void Cut_Fast_Calculation_of_the_LTP_parameters (
  517. struct gsm_state * st, /*              IN */
  518. register word * d, /* [0..39] IN */
  519. register word * dp, /* [-120..-1] IN */
  520. word * bc_out, /*  OUT */
  521. word * Nc_out /*  OUT */
  522. )
  523. {
  524. register int   k, lambda;
  525. register float wt_float;
  526. word Nc, bc;
  527. word wt_max, best_k, ltp_cut;
  528. float dp_float_base[120], * dp_float = dp_float_base + 120;
  529. register float L_result, L_max, L_power;
  530. wt_max = 0;
  531. for (k = 0; k < 40; ++k) {
  532. if      ( d[k] > wt_max) wt_max =  d[best_k = k];
  533. else if (-d[k] > wt_max) wt_max = -d[best_k = k];
  534. }
  535. assert(wt_max >= 0);
  536. wt_float = (float)wt_max;
  537. for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k];
  538. /* Search for the maximum cross-correlation and coding of the LTP lag
  539.  */
  540. L_max = 0;
  541. Nc    = 40; /* index for the maximum cross-correlation */
  542. for (lambda = 40; lambda <= 120; lambda++) {
  543. L_result = wt_float * dp_float[best_k - lambda];
  544. if (L_result > L_max) {
  545. Nc    = lambda;
  546. L_max = L_result;
  547. }
  548. }
  549. *Nc_out = Nc;
  550. if (L_max <= 0.)  {
  551. *bc_out = 0;
  552. return;
  553. }
  554. /*  Compute the power of the reconstructed short term residual
  555.  *  signal dp[..]
  556.  */
  557. dp_float -= Nc;
  558. L_power = 0;
  559. for (k = 0; k < 40; ++k) {
  560. register float f = dp_float[k];
  561. L_power += f * f;
  562. }
  563. if (L_max >= L_power) {
  564. *bc_out = 3;
  565. return;
  566. }
  567. /*  Coding of the LTP gain
  568.  *  Table 4.3a must be used to obtain the level DLB[i] for the
  569.  *  quantization of the LTP gain b to get the coded version bc.
  570.  */
  571. lambda = L_max / L_power * 32768.;
  572. for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break;
  573. *bc_out = bc;
  574. }
  575. #endif /* LTP_CUT */
  576. static void Fast_Calculation_of_the_LTP_parameters (
  577. register word * din, /* [0..39] IN */
  578. register word * dp, /* [-120..-1] IN */
  579. word * bc_out, /*  OUT */
  580. word * Nc_out /*  OUT */
  581. )
  582. {
  583. register int   k, lambda;
  584. word Nc, bc;
  585. float wt_float[40];
  586. float dp_float_base[120], * dp_float = dp_float_base + 120;
  587. register float L_max, L_power;
  588. for (k = 0; k < 40; ++k) wt_float[k] = (float) din [k] ;
  589. for (k = -120; k < 0; ++k) dp_float[k] = (float) dp [k] ;
  590. /* Search for the maximum cross-correlation and coding of the LTP lag
  591.  */
  592. L_max = 0;
  593. Nc    = 40; /* index for the maximum cross-correlation */
  594. for (lambda = 40; lambda <= 120; lambda += 9) {
  595. /*  Calculate L_result for l = lambda .. lambda + 9.
  596.  */
  597. register float *lp = dp_float - lambda;
  598. register float W;
  599. register float a = lp[-8], b = lp[-7], c = lp[-6],
  600. d = lp[-5], e = lp[-4], f = lp[-3],
  601. g = lp[-2], h = lp[-1];
  602. register float  E; 
  603. register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
  604. S5 = 0, S6 = 0, S7 = 0, S8 = 0;
  605. # undef STEP
  606. # define STEP(K, a, b, c, d, e, f, g, h) 
  607. W = wt_float[K];
  608. E = W * a; S8 += E;
  609. E = W * b; S7 += E;
  610. E = W * c; S6 += E;
  611. E = W * d; S5 += E;
  612. E = W * e; S4 += E;
  613. E = W * f; S3 += E;
  614. E = W * g; S2 += E;
  615. E = W * h; S1 += E;
  616. a  = lp[K];
  617. E = W * a; S0 += E
  618. # define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h)
  619. # define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a)
  620. # define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b)
  621. # define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c)
  622. # define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d)
  623. # define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e)
  624. # define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f)
  625. # define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g)
  626. STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
  627. STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
  628. STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
  629. STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
  630. STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
  631. STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
  632. STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
  633. STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
  634. STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
  635. STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
  636. if (S0 > L_max) { L_max = S0; Nc = lambda;     }
  637. if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
  638. if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
  639. if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
  640. if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
  641. if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
  642. if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
  643. if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
  644. if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
  645. }
  646. *Nc_out = Nc;
  647. if (L_max <= 0.)  {
  648. *bc_out = 0;
  649. return;
  650. }
  651. /*  Compute the power of the reconstructed short term residual
  652.  *  signal dp[..]
  653.  */
  654. dp_float -= Nc;
  655. L_power = 0;
  656. for (k = 0; k < 40; ++k) {
  657. register float f = dp_float[k];
  658. L_power += f * f;
  659. }
  660. if (L_max >= L_power) {
  661. *bc_out = 3;
  662. return;
  663. }
  664. /*  Coding of the LTP gain
  665.  *  Table 4.3a must be used to obtain the level DLB[i] for the
  666.  *  quantization of the LTP gain b to get the coded version bc.
  667.  */
  668. lambda = L_max / L_power * 32768.;
  669. for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break;
  670. *bc_out = bc;
  671. }
  672. #endif /* FAST   */
  673. #endif /* USE_FLOAT_MUL */
  674. /* 4.2.12 */
  675. static void Long_term_analysis_filtering (
  676. word bc, /*  IN  */
  677. word Nc, /*  IN  */
  678. register word * dp, /* previous d [-120..-1] IN  */
  679. register word * d, /* d [0..39] IN  */
  680. register word * dpp, /* estimate [0..39] OUT */
  681. register word * e /* long term res. signal [0..39] OUT */
  682. )
  683. /*
  684.  *  In this part, we have to decode the bc parameter to compute
  685.  *  the samples of the estimate dpp[0..39].  The decoding of bc needs the
  686.  *  use of table 4.3b.  The long term residual signal e[0..39]
  687.  *  is then calculated to be fed to the RPE encoding section.
  688.  */
  689. {
  690. register int      k;
  691. # undef STEP
  692. # define STEP(BP)
  693. for (k = 0; k <= 39; k++) {
  694. dpp[k]  = GSM_MULT_R( BP, dp[k - Nc]);
  695. e[k] = GSM_SUB( d[k], dpp[k] );
  696. }
  697. switch (bc) {
  698. case 0: STEP(  3277 ); break;
  699. case 1: STEP( 11469 ); break;
  700. case 2: STEP( 21299 ); break;
  701. case 3: STEP( 32767 ); break; 
  702. }
  703. }
  704. void Gsm_Long_Term_Predictor ( /* 4x for 160 samples */
  705. struct gsm_state * S,
  706. word * d, /* [0..39]   residual signal IN */
  707. word * dp, /* [-120..-1] d' IN */
  708. word * e, /* [0..39]  OUT */
  709. word * dpp, /* [0..39]  OUT */
  710. word * Nc, /* correlation lag OUT */
  711. word * bc /* gain factor OUT */
  712. )
  713. {
  714. assert( d  ); assert( dp ); assert( e  );
  715. assert( dpp); assert( Nc ); assert( bc );
  716. #if defined(FAST) && defined(USE_FLOAT_MUL)
  717. if (S->fast) 
  718. #if   defined (LTP_CUT)
  719. if (S->ltp_cut)
  720. Cut_Fast_Calculation_of_the_LTP_parameters(S,
  721. d, dp, bc, Nc);
  722. else
  723. #endif /* LTP_CUT */
  724. Fast_Calculation_of_the_LTP_parameters(d, dp, bc, Nc );
  725. else 
  726. #endif /* FAST & USE_FLOAT_MUL */
  727. #ifdef LTP_CUT
  728. if (S->ltp_cut)
  729. Cut_Calculation_of_the_LTP_parameters(S, d, dp, bc, Nc);
  730. else
  731. #endif
  732. Calculation_of_the_LTP_parameters(d, dp, bc, Nc);
  733. Long_term_analysis_filtering( *bc, *Nc, dp, d, dpp, e );
  734. }
  735. /* 4.3.2 */
  736. void Gsm_Long_Term_Synthesis_Filtering (
  737. struct gsm_state * S,
  738. word Ncr,
  739. word bcr,
  740. register word * erp,    /* [0..39]     IN */
  741. register word * drp    /* [-120..-1] IN, [-120..40] OUT */
  742. )
  743. /*
  744.  *  This procedure uses the bcr and Ncr parameter to realize the
  745.  *  long term synthesis filtering.  The decoding of bcr needs
  746.  *  table 4.3b.
  747.  */
  748. {
  749. register int  k;
  750. word brp, drpp, Nr;
  751. /*  Check the limits of Nr.
  752.  */
  753. Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr;
  754. S->nrp = Nr;
  755. assert(Nr >= 40 && Nr <= 120);
  756. /*  Decoding of the LTP gain bcr
  757.  */
  758. brp = gsm_QLB[ bcr ];
  759. /*  Computation of the reconstructed short term residual 
  760.  *  signal drp[0..39]
  761.  */
  762. assert(brp != MIN_WORD);
  763. for (k = 0; k <= 39; k++) {
  764. drpp   = GSM_MULT_R( brp, drp[ k - Nr ] );
  765. drp[k] = GSM_ADD( erp[k], drpp );
  766. }
  767. /*
  768.  *  Update of the reconstructed short term residual signal
  769.  *  drp[ -1..-120 ]
  770.  */
  771. for (k = 0; k <= 119; k++) drp[ -120 + k ] = drp[ -80 + k ];
  772. }