g72x.c
上传用户:haomin008
上传日期:2007-01-06
资源大小:12k
文件大小:14k
源码类别:

语音压缩

开发平台:

Unix_Linux

  1. /*
  2.  * This source code is a product of Sun Microsystems, Inc. and is provided
  3.  * for unrestricted use.  Users may copy or modify this source code without
  4.  * charge.
  5.  *
  6.  * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
  7.  * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  8.  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
  9.  *
  10.  * Sun source code is provided with no support and without any obligation on
  11.  * the part of Sun Microsystems, Inc. to assist in its use, correction,
  12.  * modification or enhancement.
  13.  *
  14.  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  15.  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
  16.  * OR ANY PART THEREOF.
  17.  *
  18.  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  19.  * or profits or other special, indirect and consequential damages, even if
  20.  * Sun has been advised of the possibility of such damages.
  21.  *
  22.  * Sun Microsystems, Inc.
  23.  * 2550 Garcia Avenue
  24.  * Mountain View, California  94043
  25.  */
  26. /*
  27.  * g72x.c
  28.  *
  29.  * Common routines for G.721 and G.723 conversions.
  30.  */
  31. #include "g72x.h"
  32. static short power2[15] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80,
  33. 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000};
  34. /*
  35.  * quan()
  36.  *
  37.  * quantizes the input val against the table of size short integers.
  38.  * It returns i if table[i - 1] <= val < table[i].
  39.  *
  40.  * Using linear search for simple coding.
  41.  */
  42. static int
  43. quan(
  44. int val,
  45. short *table,
  46. int size)
  47. {
  48. int i;
  49. for (i = 0; i < size; i++)
  50. if (val < *table++)
  51. break;
  52. return (i);
  53. }
  54. /*
  55.  * fmult()
  56.  *
  57.  * returns the integer product of the 14-bit integer "an" and
  58.  * "floating point" representation (4-bit exponent, 6-bit mantessa) "srn".
  59.  */
  60. static int
  61. fmult(
  62. int an,
  63. int srn)
  64. {
  65. short anmag, anexp, anmant;
  66. short wanexp, wanmag, wanmant;
  67. short retval;
  68. anmag = (an > 0) ? an : ((-an) & 0x1FFF);
  69. anexp = quan(anmag, power2, 15) - 6;
  70. anmant = (anmag == 0) ? 32 :
  71.     (anexp >= 0) ? anmag >> anexp : anmag << -anexp;
  72. wanexp = anexp + ((srn >> 6) & 0xF) - 13;
  73. wanmant = (anmant * (srn & 077) + 0x30) >> 4;
  74. retval = (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) :
  75.     (wanmant >> -wanexp);
  76. return (((an ^ srn) < 0) ? -retval : retval);
  77. }
  78. /*
  79.  * g72x_init_state()
  80.  *
  81.  * This routine initializes and/or resets the g72x_state structure
  82.  * pointed to by 'state_ptr'.
  83.  * All the initial state values are specified in the CCITT G.721 document.
  84.  */
  85. void
  86. g72x_init_state(
  87. struct g72x_state *state_ptr)
  88. {
  89. int cnta;
  90. state_ptr->yl = 34816;
  91. state_ptr->yu = 544;
  92. state_ptr->dms = 0;
  93. state_ptr->dml = 0;
  94. state_ptr->ap = 0;
  95. for (cnta = 0; cnta < 2; cnta++) {
  96. state_ptr->a[cnta] = 0;
  97. state_ptr->pk[cnta] = 0;
  98. state_ptr->sr[cnta] = 32;
  99. }
  100. for (cnta = 0; cnta < 6; cnta++) {
  101. state_ptr->b[cnta] = 0;
  102. state_ptr->dq[cnta] = 32;
  103. }
  104. state_ptr->td = 0;
  105. }
  106. /*
  107.  * predictor_zero()
  108.  *
  109.  * computes the estimated signal from 6-zero predictor.
  110.  *
  111.  */
  112. int
  113. predictor_zero(
  114. struct g72x_state *state_ptr)
  115. {
  116. int i;
  117. int sezi;
  118. sezi = fmult(state_ptr->b[0] >> 2, state_ptr->dq[0]);
  119. for (i = 1; i < 6; i++) /* ACCUM */
  120. sezi += fmult(state_ptr->b[i] >> 2, state_ptr->dq[i]);
  121. return (sezi);
  122. }
  123. /*
  124.  * predictor_pole()
  125.  *
  126.  * computes the estimated signal from 2-pole predictor.
  127.  *
  128.  */
  129. int
  130. predictor_pole(
  131. struct g72x_state *state_ptr)
  132. {
  133. return (fmult(state_ptr->a[1] >> 2, state_ptr->sr[1]) +
  134.     fmult(state_ptr->a[0] >> 2, state_ptr->sr[0]));
  135. }
  136. /*
  137.  * step_size()
  138.  *
  139.  * computes the quantization step size of the adaptive quantizer.
  140.  *
  141.  */
  142. int
  143. step_size(
  144. struct g72x_state *state_ptr)
  145. {
  146. int y;
  147. int dif;
  148. int al;
  149. if (state_ptr->ap >= 256)
  150. return (state_ptr->yu);
  151. else {
  152. y = state_ptr->yl >> 6;
  153. dif = state_ptr->yu - y;
  154. al = state_ptr->ap >> 2;
  155. if (dif > 0)
  156. y += (dif * al) >> 6;
  157. else if (dif < 0)
  158. y += (dif * al + 0x3F) >> 6;
  159. return (y);
  160. }
  161. }
  162. /*
  163.  * quantize()
  164.  *
  165.  * Given a raw sample, 'd', of the difference signal and a
  166.  * quantization step size scale factor, 'y', this routine returns the
  167.  * ADPCM codeword to which that sample gets quantized.  The step
  168.  * size scale factor division operation is done in the log base 2 domain
  169.  * as a subtraction.
  170.  */
  171. int
  172. quantize(
  173. int d, /* Raw difference signal sample */
  174. int y, /* Step size multiplier */
  175. short *table, /* quantization table */
  176. int size) /* table size of short integers */
  177. {
  178. short dqm; /* Magnitude of 'd' */
  179. short exp; /* Integer part of base 2 log of 'd' */
  180. short mant; /* Fractional part of base 2 log */
  181. short dl; /* Log of magnitude of 'd' */
  182. short dln; /* Step size scale factor normalized log */
  183. int i;
  184. /*
  185.  * LOG
  186.  *
  187.  * Compute base 2 log of 'd', and store in 'dl'.
  188.  */
  189. dqm = abs(d);
  190. exp = quan(dqm >> 1, power2, 15);
  191. mant = ((dqm << 7) >> exp) & 0x7F; /* Fractional portion. */
  192. dl = (exp << 7) + mant;
  193. /*
  194.  * SUBTB
  195.  *
  196.  * "Divide" by step size multiplier.
  197.  */
  198. dln = dl - (y >> 2);
  199. /*
  200.  * QUAN
  201.  *
  202.  * Obtain codword i for 'd'.
  203.  */
  204. i = quan(dln, table, size);
  205. if (d < 0) /* take 1's complement of i */
  206. return ((size << 1) + 1 - i);
  207. else if (i == 0) /* take 1's complement of 0 */
  208. return ((size << 1) + 1); /* new in 1988 */
  209. else
  210. return (i);
  211. }
  212. /*
  213.  * reconstruct()
  214.  *
  215.  * Returns reconstructed difference signal 'dq' obtained from
  216.  * codeword 'i' and quantization step size scale factor 'y'.
  217.  * Multiplication is performed in log base 2 domain as addition.
  218.  */
  219. int
  220. reconstruct(
  221. int sign, /* 0 for non-negative value */
  222. int dqln, /* G.72x codeword */
  223. int y) /* Step size multiplier */
  224. {
  225. short dql; /* Log of 'dq' magnitude */
  226. short dex; /* Integer part of log */
  227. short dqt;
  228. short dq; /* Reconstructed difference signal sample */
  229. dql = dqln + (y >> 2); /* ADDA */
  230. if (dql < 0) {
  231. return ((sign) ? -0x8000 : 0);
  232. } else { /* ANTILOG */
  233. dex = (dql >> 7) & 15;
  234. dqt = 128 + (dql & 127);
  235. dq = (dqt << 7) >> (14 - dex);
  236. return ((sign) ? (dq - 0x8000) : dq);
  237. }
  238. }
  239. /*
  240.  * update()
  241.  *
  242.  * updates the state variables for each output code
  243.  */
  244. void
  245. update(
  246. int code_size, /* distinguish 723_40 with others */
  247. int y, /* quantizer step size */
  248. int wi, /* scale factor multiplier */
  249. int fi, /* for long/short term energies */
  250. int dq, /* quantized prediction difference */
  251. int sr, /* reconstructed signal */
  252. int dqsez, /* difference from 2-pole predictor */
  253. struct g72x_state *state_ptr) /* coder state pointer */
  254. {
  255. int cnt;
  256. short mag, exp, mant; /* Adaptive predictor, FLOAT A */
  257. short a2p; /* LIMC */
  258. short a1ul; /* UPA1 */
  259. short ua2, pks1; /* UPA2 */
  260. short uga2a, fa1;
  261. short uga2b;
  262. char tr; /* tone/transition detector */
  263. short ylint, thr2, dqthr;
  264. short   ylfrac, thr1;
  265. short pk0;
  266. pk0 = (dqsez < 0) ? 1 : 0; /* needed in updating predictor poles */
  267. mag = dq & 0x7FFF; /* prediction difference magnitude */
  268. /* TRANS */
  269. ylint = state_ptr->yl >> 15; /* exponent part of yl */
  270. ylfrac = (state_ptr->yl >> 10) & 0x1F; /* fractional part of yl */
  271. thr1 = (32 + ylfrac) << ylint; /* threshold */
  272. thr2 = (ylint > 9) ? 31 << 10 : thr1; /* limit thr2 to 31 << 10 */
  273. dqthr = (thr2 + (thr2 >> 1)) >> 1; /* dqthr = 0.75 * thr2 */
  274. if (state_ptr->td == 0) /* signal supposed voice */
  275. tr = 0;
  276. else if (mag <= dqthr) /* supposed data, but small mag */
  277. tr = 0; /* treated as voice */
  278. else /* signal is data (modem) */
  279. tr = 1;
  280. /*
  281.  * Quantizer scale factor adaptation.
  282.  */
  283. /* FUNCTW & FILTD & DELAY */
  284. /* update non-steady state step size multiplier */
  285. state_ptr->yu = y + ((wi - y) >> 5);
  286. /* LIMB */
  287. if (state_ptr->yu < 544) /* 544 <= yu <= 5120 */
  288. state_ptr->yu = 544;
  289. else if (state_ptr->yu > 5120)
  290. state_ptr->yu = 5120;
  291. /* FILTE & DELAY */
  292. /* update steady state step size multiplier */
  293. state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6);
  294. /*
  295.  * Adaptive predictor coefficients.
  296.  */
  297. if (tr == 1) { /* reset a's and b's for modem signal */
  298. state_ptr->a[0] = 0;
  299. state_ptr->a[1] = 0;
  300. state_ptr->b[0] = 0;
  301. state_ptr->b[1] = 0;
  302. state_ptr->b[2] = 0;
  303. state_ptr->b[3] = 0;
  304. state_ptr->b[4] = 0;
  305. state_ptr->b[5] = 0;
  306. } else { /* update a's and b's */
  307. pks1 = pk0 ^ state_ptr->pk[0]; /* UPA2 */
  308. /* update predictor pole a[1] */
  309. a2p = state_ptr->a[1] - (state_ptr->a[1] >> 7);
  310. if (dqsez != 0) {
  311. fa1 = (pks1) ? state_ptr->a[0] : -state_ptr->a[0];
  312. if (fa1 < -8191) /* a2p = function of fa1 */
  313. a2p -= 0x100;
  314. else if (fa1 > 8191)
  315. a2p += 0xFF;
  316. else
  317. a2p += fa1 >> 5;
  318. if (pk0 ^ state_ptr->pk[1])
  319. /* LIMC */
  320. if (a2p <= -12160)
  321. a2p = -12288;
  322. else if (a2p >= 12416)
  323. a2p = 12288;
  324. else
  325. a2p -= 0x80;
  326. else if (a2p <= -12416)
  327. a2p = -12288;
  328. else if (a2p >= 12160)
  329. a2p = 12288;
  330. else
  331. a2p += 0x80;
  332. }
  333. /* TRIGB & DELAY */
  334. state_ptr->a[1] = a2p;
  335. /* UPA1 */
  336. /* update predictor pole a[0] */
  337. state_ptr->a[0] -= state_ptr->a[0] >> 8;
  338. if (dqsez != 0)
  339. if (pks1 == 0)
  340. state_ptr->a[0] += 192;
  341. else
  342. state_ptr->a[0] -= 192;
  343. /* LIMD */
  344. a1ul = 15360 - a2p;
  345. if (state_ptr->a[0] < -a1ul)
  346. state_ptr->a[0] = -a1ul;
  347. else if (state_ptr->a[0] > a1ul)
  348. state_ptr->a[0] = a1ul;
  349. /* UPB : update predictor zeros b[6] */
  350. for (cnt = 0; cnt < 6; cnt++) {
  351. if (code_size == 5) /* for 40Kbps G.723 */
  352. state_ptr->b[cnt] -= state_ptr->b[cnt] >> 9;
  353. else /* for G.721 and 24Kbps G.723 */
  354. state_ptr->b[cnt] -= state_ptr->b[cnt] >> 8;
  355. if (dq & 0x7FFF) { /* XOR */
  356. if ((dq ^ state_ptr->dq[cnt]) >= 0)
  357. state_ptr->b[cnt] += 128;
  358. else
  359. state_ptr->b[cnt] -= 128;
  360. }
  361. }
  362. }
  363. for (cnt = 5; cnt > 0; cnt--)
  364. state_ptr->dq[cnt] = state_ptr->dq[cnt-1];
  365. /* FLOAT A : convert dq[0] to 4-bit exp, 6-bit mantissa f.p. */
  366. if (mag == 0) {
  367. state_ptr->dq[0] = (dq >= 0) ? 0x20 : 0xFC20;
  368. } else {
  369. exp = quan(mag, power2, 15);
  370. state_ptr->dq[0] = (dq >= 0) ?
  371.     (exp << 6) + ((mag << 6) >> exp) :
  372.     (exp << 6) + ((mag << 6) >> exp) - 0x400;
  373. }
  374. state_ptr->sr[1] = state_ptr->sr[0];
  375. /* FLOAT B : convert sr to 4-bit exp., 6-bit mantissa f.p. */
  376. if (sr == 0) {
  377. state_ptr->sr[0] = 0x20;
  378. } else if (sr > 0) {
  379. exp = quan(sr, power2, 15);
  380. state_ptr->sr[0] = (exp << 6) + ((sr << 6) >> exp);
  381. } else if (sr > -32768) {
  382. mag = -sr;
  383. exp = quan(mag, power2, 15);
  384. state_ptr->sr[0] =  (exp << 6) + ((mag << 6) >> exp) - 0x400;
  385. } else
  386. state_ptr->sr[0] = 0xFC20;
  387. /* DELAY A */
  388. state_ptr->pk[1] = state_ptr->pk[0];
  389. state_ptr->pk[0] = pk0;
  390. /* TONE */
  391. if (tr == 1) /* this sample has been treated as data */
  392. state_ptr->td = 0; /* next one will be treated as voice */
  393. else if (a2p < -11776) /* small sample-to-sample correlation */
  394. state_ptr->td = 1; /* signal may be data */
  395. else /* signal is voice */
  396. state_ptr->td = 0;
  397. /*
  398.  * Adaptation speed control.
  399.  */
  400. state_ptr->dms += (fi - state_ptr->dms) >> 5; /* FILTA */
  401. state_ptr->dml += (((fi << 2) - state_ptr->dml) >> 7); /* FILTB */
  402. if (tr == 1)
  403. state_ptr->ap = 256;
  404. else if (y < 1536) /* SUBTC */
  405. state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
  406. else if (state_ptr->td == 1)
  407. state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
  408. else if (abs((state_ptr->dms << 2) - state_ptr->dml) >=
  409.     (state_ptr->dml >> 3))
  410. state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
  411. else
  412. state_ptr->ap += (-state_ptr->ap) >> 4;
  413. }
  414. /*
  415.  * tandem_adjust(sr, se, y, i, sign)
  416.  *
  417.  * At the end of ADPCM decoding, it simulates an encoder which may be receiving
  418.  * the output of this decoder as a tandem process. If the output of the
  419.  * simulated encoder differs from the input to this decoder, the decoder output
  420.  * is adjusted by one level of A-law or u-law codes.
  421.  *
  422.  * Input:
  423.  * sr decoder output linear PCM sample,
  424.  * se predictor estimate sample,
  425.  * y quantizer step size,
  426.  * i decoder input code,
  427.  * sign sign bit of code i
  428.  *
  429.  * Return:
  430.  * adjusted A-law or u-law compressed sample.
  431.  */
  432. int
  433. tandem_adjust_alaw(
  434. int sr, /* decoder output linear PCM sample */
  435. int se, /* predictor estimate sample */
  436. int y, /* quantizer step size */
  437. int i, /* decoder input code */
  438. int sign,
  439. short *qtab)
  440. {
  441. unsigned char sp; /* A-law compressed 8-bit code */
  442. short dx; /* prediction error */
  443. char id; /* quantized prediction error */
  444. int sd; /* adjusted A-law decoded sample value */
  445. int im; /* biased magnitude of i */
  446. int imx; /* biased magnitude of id */
  447. if (sr <= -32768)
  448. sr = -1;
  449. sp = linear2alaw((sr >> 1) << 3); /* short to A-law compression */
  450. dx = (alaw2linear(sp) >> 2) - se; /* 16-bit prediction error */
  451. id = quantize(dx, y, qtab, sign - 1);
  452. if (id == i) { /* no adjustment on sp */
  453. return (sp);
  454. } else { /* sp adjustment needed */
  455. /* ADPCM codes : 8, 9, ... F, 0, 1, ... , 6, 7 */
  456. im = i ^ sign; /* 2's complement to biased unsigned */
  457. imx = id ^ sign;
  458. if (imx > im) { /* sp adjusted to next lower value */
  459. if (sp & 0x80) {
  460. sd = (sp == 0xD5) ? 0x55 :
  461.     ((sp ^ 0x55) - 1) ^ 0x55;
  462. } else {
  463. sd = (sp == 0x2A) ? 0x2A :
  464.     ((sp ^ 0x55) + 1) ^ 0x55;
  465. }
  466. } else { /* sp adjusted to next higher value */
  467. if (sp & 0x80)
  468. sd = (sp == 0xAA) ? 0xAA :
  469.     ((sp ^ 0x55) + 1) ^ 0x55;
  470. else
  471. sd = (sp == 0x55) ? 0xD5 :
  472.     ((sp ^ 0x55) - 1) ^ 0x55;
  473. }
  474. return (sd);
  475. }
  476. }
  477. int
  478. tandem_adjust_ulaw(
  479. int sr, /* decoder output linear PCM sample */
  480. int se, /* predictor estimate sample */
  481. int y, /* quantizer step size */
  482. int i, /* decoder input code */
  483. int sign,
  484. short *qtab)
  485. {
  486. unsigned char sp; /* u-law compressed 8-bit code */
  487. short dx; /* prediction error */
  488. char id; /* quantized prediction error */
  489. int sd; /* adjusted u-law decoded sample value */
  490. int im; /* biased magnitude of i */
  491. int imx; /* biased magnitude of id */
  492. if (sr <= -32768)
  493. sr = 0;
  494. sp = linear2ulaw(sr << 2); /* short to u-law compression */
  495. dx = (ulaw2linear(sp) >> 2) - se; /* 16-bit prediction error */
  496. id = quantize(dx, y, qtab, sign - 1);
  497. if (id == i) {
  498. return (sp);
  499. } else {
  500. /* ADPCM codes : 8, 9, ... F, 0, 1, ... , 6, 7 */
  501. im = i ^ sign; /* 2's complement to biased unsigned */
  502. imx = id ^ sign;
  503. if (imx > im) { /* sp adjusted to next lower value */
  504. if (sp & 0x80)
  505. sd = (sp == 0xFF) ? 0x7E : sp + 1;
  506. else
  507. sd = (sp == 0) ? 0 : sp - 1;
  508. } else { /* sp adjusted to next higher value */
  509. if (sp & 0x80)
  510. sd = (sp == 0x80) ? 0x80 : sp - 1;
  511. else
  512. sd = (sp == 0x7F) ? 0xFE : sp + 1;
  513. }
  514. return (sd);
  515. }
  516. }