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

流媒体/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/lpc.c,v 1.2 2001/02/27 19:23:11 deepalir Exp $ */
  7. #include <stdio.h>
  8. #include <assert.h>
  9. #include "private.h"
  10. #include "gsm.h"
  11. #include "proto.h"
  12. #undef P
  13. /*
  14.  *  4.2.4 .. 4.2.7 LPC ANALYSIS SECTION
  15.  */
  16. /* 4.2.4 */
  17. static void Autocorrelation P2((s, L_ACF),
  18. word     * s, /* [0..159] IN/OUT  */
  19.   longword * L_ACF) /* [0..8] OUT     */
  20. /*
  21.  *  The goal is to compute the array L_ACF[k].  The signal s[i] must
  22.  *  be scaled in order to avoid an overflow situation.
  23.  */
  24. {
  25. register int k, i;
  26. word temp, smax, scalauto;
  27. #ifdef USE_FLOAT_MUL
  28. float float_s[160];
  29. #endif
  30. /*  Dynamic scaling of the array  s[0..159]
  31.  */
  32. /*  Search for the maximum.
  33.  */
  34. smax = 0;
  35. for (k = 0; k <= 159; k++) {
  36. temp = GSM_ABS( s[k] );
  37. if (temp > smax) smax = temp;
  38. }
  39. /*  Computation of the scaling factor.
  40.  */
  41. if (smax == 0) scalauto = 0;
  42. else {
  43. assert(smax > 0);
  44. scalauto = 4 - gsm_norm( (longword)smax << 16 );/* sub(4,..) */
  45. }
  46. /*  Scaling of the array s[0...159]
  47.  */
  48. if (scalauto > 0) {
  49. # ifdef USE_FLOAT_MUL
  50. #   define SCALE(n)
  51. case n: for (k = 0; k <= 159; k++) 
  52. float_s[k] = (float)
  53. (s[k] = GSM_MULT_R(s[k], 16384 >> (n-1)));
  54. break;
  55. # else 
  56. #   define SCALE(n)
  57. case n: for (k = 0; k <= 159; k++) 
  58. s[k] = GSM_MULT_R( s[k], 16384 >> (n-1) );
  59. break;
  60. # endif /* USE_FLOAT_MUL */
  61. switch (scalauto) {
  62. SCALE(1)
  63. SCALE(2)
  64. SCALE(3)
  65. SCALE(4)
  66. }
  67. # undef SCALE
  68. }
  69. # ifdef USE_FLOAT_MUL
  70. else for (k = 0; k <= 159; k++) float_s[k] = (float) s[k];
  71. # endif
  72. /*  Compute the L_ACF[..].
  73.  */
  74. {
  75. # ifdef USE_FLOAT_MUL
  76. register float * sp = float_s;
  77. register float   sl = *sp;
  78. # define STEP(k)  L_ACF[k] += (longword)(sl * sp[ -(k) ]);
  79. # else
  80. word  * sp = s;
  81. word    sl = *sp;
  82. # define STEP(k)  L_ACF[k] += ((longword)sl * sp[ -(k) ]);
  83. # endif
  84. # define NEXTI  sl = *++sp
  85. for (k = 9; k--; L_ACF[k] = 0) ;
  86. STEP (0);
  87. NEXTI;
  88. STEP(0); STEP(1);
  89. NEXTI;
  90. STEP(0); STEP(1); STEP(2);
  91. NEXTI;
  92. STEP(0); STEP(1); STEP(2); STEP(3);
  93. NEXTI;
  94. STEP(0); STEP(1); STEP(2); STEP(3); STEP(4);
  95. NEXTI;
  96. STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5);
  97. NEXTI;
  98. STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6);
  99. NEXTI;
  100. STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); STEP(7);
  101. for (i = 8; i <= 159; i++) {
  102. NEXTI;
  103. STEP(0);
  104. STEP(1); STEP(2); STEP(3); STEP(4);
  105. STEP(5); STEP(6); STEP(7); STEP(8);
  106. }
  107. for (k = 9; k--; L_ACF[k] <<= 1) ; 
  108. }
  109. /*   Rescaling of the array s[0..159]
  110.  */
  111. if (scalauto > 0) {
  112. assert(scalauto <= 4); 
  113. for (k = 160; k--; *s++ <<= scalauto) ;
  114. }
  115. }
  116. #if defined(USE_FLOAT_MUL) && defined(FAST)
  117. static void Fast_Autocorrelation P2((s, L_ACF),
  118. word * s, /* [0..159] IN/OUT  */
  119.   longword * L_ACF) /* [0..8] OUT     */
  120. {
  121. register int k, i;
  122. float f_L_ACF[9];
  123. float scale;
  124. float          s_f[160];
  125. register float *sf = s_f;
  126. for (i = 0; i < 160; ++i) sf[i] = s[i];
  127. for (k = 0; k <= 8; k++) {
  128. register float L_temp2 = 0;
  129. register float *sfl = sf - k;
  130. for (i = k; i < 160; ++i) L_temp2 += sf[i] * sfl[i];
  131. f_L_ACF[k] = L_temp2;
  132. }
  133. scale = MAX_LONGWORD / f_L_ACF[0];
  134. for (k = 0; k <= 8; k++) {
  135. L_ACF[k] = f_L_ACF[k] * scale;
  136. }
  137. }
  138. #endif /* defined (USE_FLOAT_MUL) && defined (FAST) */
  139. /* 4.2.5 */
  140. static void Reflection_coefficients P2( (L_ACF, r),
  141. longword * L_ACF, /* 0...8 IN */
  142. register word * r /* 0...7 OUT  */
  143. )
  144. {
  145. register int i, m, n;
  146. register word temp;
  147. register longword ltmp;
  148. word ACF[9]; /* 0..8 */
  149. word P[  9]; /* 0..8 */
  150. word K[  9]; /* 2..8 */
  151. /*  Schur recursion with 16 bits arithmetic.
  152.  */
  153. if (L_ACF[0] == 0) {
  154. for (i = 8; i--; *r++ = 0) ;
  155. return;
  156. }
  157. assert( L_ACF[0] != 0 );
  158. temp = gsm_norm( L_ACF[0] );
  159. assert(temp >= 0 && temp < 32);
  160. /* ? overflow ? */
  161. for (i = 0; i <= 8; i++) ACF[i] = SASR( L_ACF[i] << temp, 16 );
  162. /*   Initialize array P[..] and K[..] for the recursion.
  163.  */
  164. for (i = 1; i <= 7; i++) K[ i ] = ACF[ i ];
  165. for (i = 0; i <= 8; i++) P[ i ] = ACF[ i ];
  166. /*   Compute reflection coefficients
  167.  */
  168. for (n = 1; n <= 8; n++, r++) {
  169. temp = P[1];
  170. temp = GSM_ABS(temp);
  171. if (P[0] < temp) {
  172. for (i = n; i <= 8; i++) *r++ = 0;
  173. return;
  174. }
  175. *r = gsm_div( temp, P[0] );
  176. assert(*r >= 0);
  177. if (P[1] > 0) *r = -*r; /* r[n] = sub(0, r[n]) */
  178. assert (*r != MIN_WORD);
  179. if (n == 8) return; 
  180. /*  Schur recursion
  181.  */
  182. temp = GSM_MULT_R( P[1], *r );
  183. P[0] = GSM_ADD( P[0], temp );
  184. for (m = 1; m <= 8 - n; m++) {
  185. temp     = GSM_MULT_R( K[ m   ],    *r );
  186. P[m]     = GSM_ADD(    P[ m+1 ],  temp );
  187. temp     = GSM_MULT_R( P[ m+1 ],    *r );
  188. K[m]     = GSM_ADD(    K[ m   ],  temp );
  189. }
  190. }
  191. }
  192. /* 4.2.6 */
  193. static void Transformation_to_Log_Area_Ratios P1((r),
  194. register word * r  /* 0..7    IN/OUT */
  195. )
  196. /*
  197.  *  The following scaling for r[..] and LAR[..] has been used:
  198.  *
  199.  *  r[..]   = integer( real_r[..]*32768. ); -1 <= real_r < 1.
  200.  *  LAR[..] = integer( real_LAR[..] * 16384 );
  201.  *  with -1.625 <= real_LAR <= 1.625
  202.  */
  203. {
  204. register word temp;
  205. register int i;
  206. /* Computation of the LAR[0..7] from the r[0..7]
  207.  */
  208. for (i = 1; i <= 8; i++, r++) {
  209. temp = *r;
  210. temp = GSM_ABS(temp);
  211. assert(temp >= 0);
  212. if (temp < 22118) {
  213. temp >>= 1;
  214. } else if (temp < 31130) {
  215. assert( temp >= 11059 );
  216. temp -= 11059;
  217. } else {
  218. assert( temp >= 26112 );
  219. temp -= 26112;
  220. temp <<= 2;
  221. }
  222. *r = *r < 0 ? -temp : temp;
  223. assert( *r != MIN_WORD );
  224. }
  225. }
  226. /* 4.2.7 */
  227. static void Quantization_and_coding P1((LAR),
  228. register word * LAR     /* [0..7] IN/OUT */
  229. )
  230. {
  231. register word temp;
  232. longword ltmp;
  233. /*  This procedure needs four tables; the following equations
  234.  *  give the optimum scaling for the constants:
  235.  *  
  236.  *  A[0..7] = integer( real_A[0..7] * 1024 )
  237.  *  B[0..7] = integer( real_B[0..7] *  512 )
  238.  *  MAC[0..7] = maximum of the LARc[0..7]
  239.  *  MIC[0..7] = minimum of the LARc[0..7]
  240.  */
  241. # undef STEP
  242. # define STEP( A, B, MAC, MIC )
  243. temp = GSM_MULT( A,   *LAR );
  244. temp = GSM_ADD(  temp,   B );
  245. temp = GSM_ADD(  temp, 256 );
  246. temp = SASR(     temp,   9 );
  247. *LAR  =  temp>MAC ? MAC - MIC : (temp<MIC ? 0 : temp - MIC); 
  248. LAR++;
  249. STEP(  20480,     0,  31, -32 );
  250. STEP(  20480,     0,  31, -32 );
  251. STEP(  20480,  2048,  15, -16 );
  252. STEP(  20480, -2560,  15, -16 );
  253. STEP(  13964,    94,   7,  -8 );
  254. STEP(  15360, -1792,   7,  -8 );
  255. STEP(   8534,  -341,   3,  -4 );
  256. STEP(   9036, -1144,   3,  -4 );
  257. # undef STEP
  258. }
  259. void Gsm_LPC_Analysis P3((S, s,LARc),
  260. struct gsm_state *S,
  261. word   * s, /* 0..159 signals IN/OUT */
  262.         word   * LARc) /* 0..7   LARc's OUT */
  263. {
  264. longword L_ACF[9];
  265. #if defined(USE_FLOAT_MUL) && defined(FAST)
  266. if (S->fast) Fast_Autocorrelation (s,   L_ACF );
  267. else
  268. #endif
  269. Autocorrelation   (s,   L_ACF );
  270. Reflection_coefficients   (L_ACF, LARc );
  271. Transformation_to_Log_Area_Ratios (LARc);
  272. Quantization_and_coding   (LARc);
  273. }