hermite.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:15k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  *  
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck  
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. /*
  36.  * Sampling rate conversion, by polynomial interpolation.
  37.  * Ken Cooke (kenc@real.com)
  38.  */
  39. #include "hlxclib/stdlib.h"
  40. #include "hxtypes.h"
  41. #include "allresamplers.h"
  42. #include "math64.h"
  43. #define MAXRATE ((1<<23) - 1) /* sampling rates cannot exceed MAXRATE */
  44. #define MAXSAMPS ((1<<23) - 1) /* max outsamps for GetMinInput() */
  45. #define MAXCHANS 2
  46. /* interpolator state */
  47. typedef struct { 
  48. int inrate;
  49. int outrate;
  50. int nchans;
  51. int time_i;
  52. UINT time_f;
  53. UINT step_i;
  54. UINT step_f;
  55. short hist[3*MAXCHANS]; /* input history */
  56. } STATE;
  57. /* Initialize Hermite resampler
  58.  * 
  59.  * Parameters
  60.  * ----------
  61.  * int inrate              sample rate of input (Hz)
  62.  * int outrate             desired sample rate of output (Hz)
  63.  * int nchans              number of channels
  64.  * 
  65.  * return value            instance pointer which will be passed in all future RAXXXHermite() function calls, 0 if error
  66.  *
  67.  * Notes
  68.  * -----
  69.  * - inrate, outrate, nchans must be within valid ranges (see below)
  70.  * - inrate < outrate (i.e. upsampling only!)
  71.  */
  72. void *
  73. RAInitResamplerHermite(int inrate, int outrate, int nchans)
  74. {
  75. STATE *s;
  76. UINT step_i, step_f, ratio, rem;
  77. int i;
  78. /* validate params */
  79. if ((inrate <= 0) || (inrate > MAXRATE) ||
  80.             (outrate <= 0) || (outrate > MAXRATE))
  81. return 0;
  82.         /* only allow downsampling on certain platforms
  83.          * until we have a fixed point resampler that can
  84.          * downsample properly. */
  85. #ifndef _SYMBIAN
  86.         /* XXXgfw remove this when the new resampler is available. */
  87.         if( inrate > outrate )
  88.         {
  89.             return 0;
  90.         }
  91. #endif        
  92.         
  93. if ((nchans < 1) || (nchans > MAXCHANS))
  94. return 0;
  95. /* create interpolator state */
  96. s = (STATE *) malloc(sizeof(STATE));
  97. if (!s)
  98. return 0;
  99. /* Compute 64-bit timestep, as a signed integer and 32-bit fraction */
  100. step_i = inrate / outrate; /* integer part */
  101. rem = inrate;
  102. step_f = 0 ;
  103. for (i = 0; i < 4; i++) {
  104. rem <<= 8;
  105. ratio = rem / outrate;
  106. rem -= ratio * outrate;
  107. step_f = (step_f << 8) | (ratio & 0xff); /* 8 more fraction bits */
  108. }
  109. ASSERT(step_i == (UINT)((double)inrate/outrate));
  110. ASSERT(step_f == (UINT)(65536.*65536.*((double)inrate/outrate - step_i)));
  111. s->inrate = inrate;
  112. s->outrate = outrate;
  113. s->nchans = nchans;
  114. s->time_i = 0;
  115. s->time_f = 0;
  116. s->step_i = step_i;
  117. s->step_f = step_f;
  118. for (i = 0; i < (3*MAXCHANS); i++)
  119. s->hist[i] = 0;
  120. return (void *)s;
  121. }
  122. /* Initialize Hermite resampler from a copy, using its parameters.
  123.  * 
  124.  * Parameters
  125.  * ----------
  126.  * inst                    instance pointer to a resampler to be used as template
  127.  * 
  128.  * return value            instance pointer which will be passed in all future RAXXXHermite() function calls, 0 if error
  129.  */
  130. void *
  131. RAInitResamplerCopyHermite(int nchans, const void *inst)
  132. {
  133. STATE *s_in = (STATE *)inst;
  134. STATE *s_out = (STATE *)malloc(sizeof(STATE));
  135. if (s_in == 0 || s_out == 0)
  136. return 0;
  137. *s_out = *s_in ;
  138. s_out->nchans = nchans;
  139. return s_out;
  140. }
  141. /* Free memory associated with Hermite resampler
  142.  * 
  143.  * Parameters
  144.  * ----------
  145.  * void *inst              instance pointer 
  146.  * 
  147.  * return value            none
  148.  *
  149.  * Notes
  150.  * -----
  151.  */
  152. void
  153. RAFreeResamplerHermite(void *inst)
  154. {
  155. STATE *s = (STATE *)inst;
  156. free(s);
  157. }
  158. /* Get max possible outsamps given insamps input
  159.  * 
  160.  * Parameters
  161.  * ----------
  162.  * int insamps             number of input samples
  163.  * void *inst              instance pointer 
  164.  * 
  165.  * return value            maximum number of output samples generated by resampling insamps samples, -1 if error
  166.  *
  167.  * Notes
  168.  * -----
  169.  * - some alternate implementations are included as comments
  170.  *     these might be useful, depending on the target platform
  171.  * - insamps must be even for stereo, function will exit with error if not
  172.  */
  173. int RAGetMaxOutputHermite(int insamps, void *inst)
  174. {
  175. /* do an empty (null) resample of insamps samples */
  176. int inframes, outframes;
  177. UINT i, f;
  178. STATE *s = (STATE *)inst;
  179. if (s->nchans == 2 && insamps & 0x01)
  180. return -1;
  181. inframes = (s->nchans == 2 ? insamps >> 1 : insamps);
  182. for (i = f = outframes = 0; i < (UINT)inframes; outframes++) {
  183. f += s->step_f;
  184. i += s->step_i + (f < s->step_f); /* add with carry */
  185. }
  186. return (int)(outframes * s->nchans);
  187.     /* equivalent method using __int64 
  188.  * 
  189.  * inframes = (s->nchans == 2 ? insamps >> 1 : insamps);
  190.  * step64 = ((__int64)s->step_i << 32) + (__int64)s->step_f;
  191.  * outframes = ( ((__int64)inframes << 32) + step64 - 1) / step64; COMMENT: ceiling
  192.  * return (int)(outframes * s->nchans);
  193.  */
  194.     /* equivalent method using double-precision floats
  195.  * 
  196.  * double step;
  197.  * inframes = (s->nchans == 2 ? insamps >> 1 : insamps);
  198.  * step = s->step_i + (s->step_f / 4294967296.0);
  199.  * outframes = (int) ceil((double)inframes / step);
  200.  * return (outframes * s->nchans);
  201.  */
  202. }
  203. /* Get minimum number of input samples required to generate outsamps output samples
  204.  * 
  205.  * Parameters
  206.  * ----------
  207.  * int outsamps            number of desired output samples
  208.  * void *inst              instance pointer 
  209.  * 
  210.  * return value            minimum number of input samples required to generate outsamps output samples, -1 if error
  211.  *
  212.  * Notes
  213.  * -----
  214.  * - some alternate implementations are included as comments
  215.  *     these might be useful, depending on the target platform
  216.  * - outsamps must be even for stereo, function will exit with error if not
  217.  */
  218. int
  219. RAGetMinInputHermite(int outsamps, void *inst)
  220. {
  221. UINT outframes;
  222. STATE *s = (STATE *)inst;
  223. UINT inframes, f, i;
  224. /* to ensure no overflow in multiply */
  225. if (outsamps > MAXSAMPS)
  226. return -1;
  227. if (s->nchans == 2 && outsamps & 0x01)
  228. return -1;
  229. outframes = (UINT)(s->nchans == 2 ? outsamps >> 1 : outsamps);
  230. inframes = 0;
  231. /* fractional part */
  232. f = s->step_f;
  233. for (i = 0; i < 4; i++) {
  234. inframes += outframes * (f & 0xff); /* add 24x8 partial product */
  235. inframes = (inframes + 0xff) >> 8; /* shift, rounding up */
  236. f >>= 8;
  237. }
  238. /* integer part */
  239. inframes += outframes * s->step_i;
  240. return (int)(inframes * s->nchans);
  241.     /* equivalent method using __int64 
  242.  * 
  243.  * step64 = ((__int64)s->step_i << 32) + (__int64)s->step_f;
  244.  * inframes = ( (__int64)outframes * step64);
  245.  * inframes += (__int64)(0x00000000ffffffff); COMMENT: (add 1.0 - 2^-32 to 32.32 number)
  246.  * return (int)((inframes >> 32) * s->nchans);
  247.  */
  248.     /* equivalent method using double-precision floats
  249.  * 
  250.  * double step;
  251.  * outframes = (s->nchans == 2 ? outsamps >> 1 : outsamps);
  252.  * step = s->step_i + (s->step_f / 4294967296.0);
  253.  * inframes = (int) ceil((double)outframes * step);
  254.  * return (inframes * s->nchans);
  255.  */
  256.     /* equivalent method using an empty (null) resample 
  257.  * 
  258.  * outframes = (s->nchans == 2 ? outsamps >> 1 : outsamps);
  259.  * for (i = f = currOut = 0; currOut < outframes; currOut++) {
  260.  *  f += s->step_f;
  261.  *  i += s->step_i + (f < s->step_f); COMMENT: add with carry 
  262.  * }
  263.  * if (f) COMMENT: ceiling (if any fractional part, round up) 
  264.  *  i++;
  265.  * return (int)(i * s->nchans);
  266.  */
  267. }
  268. /* Get number of frames of delay in the Hermite resampler
  269.  * 
  270.  * Parameters
  271.  * ----------
  272.  * void *inst              instance pointer 
  273.  * 
  274.  * return value            frames of delay
  275.  *
  276.  * Notes
  277.  * -----
  278.  * - always two frames of delay (2 samples per channel)
  279.  */
  280. int
  281. RAGetDelayHermite(void *inst)
  282. {
  283. return 2;
  284. }
  285. /* Cubic Hermite interpolation - one channel
  286.  * 
  287.  * Parameters
  288.  * ----------
  289.  * void *inbuf             pointer to buffer of input data (16-bit PCM)
  290.  * int insamps             number of samples in inbuf
  291.  * cvtFunctionType cvt     conversion function pointer, ignored
  292.  * short *outbuf           output buffer, must be large enough to hold RAGetMaxOutputHermite(insamps) samples
  293.  * void *inst              instance pointer 
  294.  * 
  295.  * return value            number of output samples generated and placed in outbuf, -1 if error
  296.  *
  297.  * Notes
  298.  * -----
  299.  * - no restrictions on number of insamps
  300.  * - inbuf MUST contain 16-bit PCM data, the cvt function is ignored
  301.  */
  302. int
  303. RAResampleMonoHermite(void *inbuf, int insamps, tConverter *pCvt, short *outbuf, int outstride, void *inst)
  304. {
  305. STATE *s = (STATE *)inst;
  306. UINT f, step_i, step_f;
  307. int outsamps, i, acc0;
  308. int x0, x1, x2, x3, frac;
  309. short *inptr;
  310. /* restore state */
  311. i = s->time_i;
  312. f = s->time_f;
  313. step_i = s->step_i;
  314. step_f = s->step_f;
  315. outsamps = 0;
  316. inptr = (short *)inbuf;
  317. if (s->nchans != 1 || outstride != 1)
  318. return -1;
  319. /* mono */
  320. while (i < insamps) {
  321. if (i < 3) {
  322. x3 = (i < 3 ? s->hist[i+0] : inptr[i-3]) << 12;
  323. x2 = (i < 2 ? s->hist[i+1] : inptr[i-2]) << 12;
  324. x1 = (i < 1 ? s->hist[i+2] : inptr[i-1]) << 12;
  325. } else {
  326. x3 = inptr[i-3] << 12;
  327. x2 = inptr[i-2] << 12;
  328. x1 = inptr[i-1] << 12;
  329. }
  330. x0 = inptr[i] << 12;
  331. frac = f >> 1;
  332. /* 4-tap Hermite, using Farrow structure */
  333. acc0 = (3 * (x2 - x1) + x0 - x3) >> 1;
  334. acc0 = MulShift31(acc0, frac);
  335. acc0 += 2 * x1 + x3 - ((5 * x2 + x0) >> 1);
  336. acc0 = MulShift31(acc0, frac);
  337. acc0 += (x1 - x3) >> 1;
  338. acc0 = MulShift31(acc0, frac);
  339. acc0 += x2;
  340. f += step_f;
  341. i += step_i + (f < step_f); /* add with carry */
  342. acc0 = (acc0 + (1<<11)) >> 12;
  343. if (acc0 > +32767) acc0 = +32767;
  344. if (acc0 < -32768) acc0 = -32768;
  345. outbuf[outsamps++] = (short)acc0;
  346. }
  347. /* save delay samples for next time (hist[0] = oldest, hist[2] = newest) */
  348. s->hist[0] = (insamps < 3 ? s->hist[insamps+0] : inptr[insamps-3]);
  349. s->hist[1] = (insamps < 2 ? s->hist[insamps+1] : inptr[insamps-2]);
  350. s->hist[2] = (insamps < 1 ? s->hist[insamps+2] : inptr[insamps-1]);
  351. /* save state */
  352. s->time_f = f;
  353. s->time_i = i - insamps;
  354. return outsamps;
  355. }
  356. /* Cubic Hermite interpolation - two channels
  357.  * 
  358.  * Parameters
  359.  * ----------
  360.  * void *inbuf             pointer to buffer of input data (16-bit PCM, interleaved LRLRLR...)
  361.  * int insamps             number of samples in inbuf
  362.  * cvtFunctionType cvt     conversion function pointer, ignored
  363.  * short *outbuf           output buffer, must be large enough to hold RAGetMaxOutputHermite(insamps) samples
  364.  * void *inst              instance pointer 
  365.  * 
  366.  * return value            number of output samples generated and placed in outbuf, -1 if error
  367.  *
  368.  * Notes
  369.  * -----
  370.  * - no restrictions on number of insamps
  371.  * - inbuf MUST contain 16-bit PCM data, the cvt function is ignored
  372.  * - insamps must be even, function will exit with error if not
  373.  */
  374. int
  375. RAResampleStereoHermite(void *inbuf, int insamps, tConverter *pCvt, short *outbuf, int outstride, void *inst)
  376. {
  377. STATE *s = (STATE *)inst;
  378. UINT f, step_i, step_f;
  379. int outsamps, i, acc0, acc1, j;
  380. int x0, x1, x2, x3, frac;
  381. short *inptr;
  382. /* restore state */
  383. i = s->time_i;
  384. f = s->time_f;
  385. step_i = s->step_i;
  386. step_f = s->step_f;
  387. outsamps = 0;
  388. inptr = (short *)inbuf;
  389. /* fail if odd number of input samples */
  390. if (s->nchans != 2 || insamps & 0x01 || outstride != 2)
  391. return -1;
  392. /* stereo - assume insamps is even */
  393. insamps /= 2; /* number of stereo frames - consume samples two at a time */
  394. while (i < insamps) {
  395. frac = f >> 1;
  396. j = 2*i;
  397. /* left */
  398. if (i < 3) {
  399. x3 = (i < 3 ? s->hist[j+0] : inptr[j-6]) << 12;
  400. x2 = (i < 2 ? s->hist[j+2] : inptr[j-4]) << 12;
  401. x1 = (i < 1 ? s->hist[j+4] : inptr[j-2]) << 12;
  402. } else {
  403. x3 = inptr[j-6] << 12;
  404. x2 = inptr[j-4] << 12;
  405. x1 = inptr[j-2] << 12;
  406. }
  407. x0 = inptr[j] << 12;
  408. /* 4-tap Hermite, using Farrow structure */
  409. acc0 = (3 * (x2 - x1) + x0 - x3) >> 1;
  410. acc0 = MulShift31(acc0, frac);
  411. acc0 += 2 * x1 + x3 - ((5 * x2 + x0) >> 1);
  412. acc0 = MulShift31(acc0, frac);
  413. acc0 += (x1 - x3) >> 1;
  414. acc0 = MulShift31(acc0, frac);
  415. acc0 += x2;
  416. /* right */
  417. if (i < 3) {
  418. x3 = (i < 3 ? s->hist[j+1] : inptr[j-5]) << 12;
  419. x2 = (i < 2 ? s->hist[j+3] : inptr[j-3]) << 12;
  420. x1 = (i < 1 ? s->hist[j+5] : inptr[j-1]) << 12;
  421. } else {
  422. x3 = inptr[j-5] << 12;
  423. x2 = inptr[j-3] << 12;
  424. x1 = inptr[j-1] << 12;
  425. }
  426. x0 = inptr[j+1] << 12;
  427. /* 4-tap Hermite, using Farrow structure */
  428. acc1 = (3 * (x2 - x1) + x0 - x3) >> 1;
  429. acc1 = MulShift31(acc1, frac);
  430. acc1 += 2 * x1 + x3 - ((5 * x2 + x0) >> 1);
  431. acc1 = MulShift31(acc1, frac);
  432. acc1 += (x1 - x3) >> 1;
  433. acc1 = MulShift31(acc1, frac);
  434. acc1 += x2;
  435. f += step_f;
  436. i += step_i + (f < step_f); /* add with carry */
  437. acc0 = (acc0 + (1<<11)) >> 12;
  438. if (acc0 > +32767) acc0 = +32767;
  439. if (acc0 < -32768) acc0 = -32768;
  440. outbuf[outsamps++] = (short)acc0;
  441. acc1 = (acc1 + (1<<11)) >> 12;
  442. if (acc1 > +32767) acc1 = +32767;
  443. if (acc1 < -32768) acc1 = -32768;
  444. outbuf[outsamps++] = (short)acc1;
  445. }
  446. /* save delay samples for next time (hist[0] = oldest left, hist[1] = oldest right, ...) */
  447. s->hist[0] = (insamps < 3 ? s->hist[2*(insamps+0) + 0] : inptr[2*(insamps-3) + 0]);
  448. s->hist[2] = (insamps < 2 ? s->hist[2*(insamps+1) + 0] : inptr[2*(insamps-2) + 0]);
  449. s->hist[4] = (insamps < 1 ? s->hist[2*(insamps+2) + 0] : inptr[2*(insamps-1) + 0]);
  450. s->hist[1] = (insamps < 3 ? s->hist[2*(insamps+0) + 1] : inptr[2*(insamps-3) + 1]);
  451. s->hist[3] = (insamps < 2 ? s->hist[2*(insamps+1) + 1] : inptr[2*(insamps-2) + 1]);
  452. s->hist[5] = (insamps < 1 ? s->hist[2*(insamps+2) + 1] : inptr[2*(insamps-1) + 1]);
  453. /* save state */
  454. s->time_f = f;
  455. s->time_i = i - insamps;
  456. return outsamps;
  457. }