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

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