long_term.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:23k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

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