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

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. #include "statname.h"
  36. /****  mdct.c  ***************************************************
  37. Layer III 
  38.   cos transform for n=18, n=6
  39. computes  c[k] =  Sum( cos((pi/4*n)*(2*k+1)*(2*p+1))*f[p] )
  40.                 k = 0, ...n-1,  p = 0...n-1
  41. inplace ok.
  42. ******************************************************************/
  43. /*------ 18 point xform -------
  44. n = 18;
  45. pi = 4.0*atan(1.0);
  46. t = pi/(4*n);
  47. for(p=0;p<n;p++) w[p] =  (float)(2.0*cos(t*(2*p+1)));
  48. for(p=0;p<9;p++) w2[p] = (float)2.0*cos(2*t*(2*p+1));
  49. t = pi/(2*n);
  50. for(k=0;k<9;k++) {
  51.     for(p=0;p<4;p++) 
  52. coef[k][p] = (float)cos(t*(2*k)*(2*p+1));
  53. }
  54. */
  55. /* JR - made into ROM table */
  56. static const float w[18] = {
  57.  1.9980964661e+000f,  1.9828897715e+000f,  1.9525920153e+000f,  1.9074338675e+000f, 
  58.  1.8477590084e+000f,  1.7740216255e+000f,  1.6867828369e+000f,  1.5867066383e+000f, 
  59.  1.4745546579e+000f,  1.3511804342e+000f,  1.2175228596e+000f,  1.0745992661e+000f, 
  60.  9.2349720001e-001f,  7.6536685228e-001f,  6.0141158104e-001f,  4.3287923932e-001f, 
  61.  2.6105237007e-001f,  8.7238773704e-002f, 
  62. };
  63. /* JR - made into ROM table */
  64. static const float w2[9] = {
  65.  1.9923894405e+000f,  1.9318516254e+000f,  1.8126156330e+000f,  1.6383041143e+000f, 
  66.  1.4142135382e+000f,  1.1471529007e+000f,  8.4523653984e-001f,  5.1763808727e-001f, 
  67.  1.7431148887e-001f, 
  68. };
  69. /* JR - made into ROM table */
  70. static const float coef[9][4] = {
  71.  {1.0000000000e+000f,  1.0000000000e+000f,  1.0000000000e+000f,  1.0000000000e+000f}, 
  72.  {9.8480772972e-001f,  8.6602538824e-001f,  6.4278763533e-001f,  3.4202015400e-001f}, 
  73.  {9.3969261646e-001f,  5.0000000000e-001f, -1.7364817858e-001f, -7.6604443789e-001f}, 
  74.  {8.6602538824e-001f,  6.1230317691e-017f, -8.6602538824e-001f, -8.6602538824e-001f}, 
  75.  {7.6604443789e-001f, -5.0000000000e-001f, -9.3969261646e-001f,  1.7364817858e-001f}, 
  76.  {6.4278763533e-001f, -8.6602538824e-001f, -3.4202015400e-001f,  9.8480772972e-001f}, 
  77.  {5.0000000000e-001f, -1.0000000000e+000f,  5.0000000000e-001f,  5.0000000000e-001f}, 
  78.  {3.4202015400e-001f, -8.6602538824e-001f,  9.8480772972e-001f, -6.4278763533e-001f}, 
  79.  {1.7364817858e-001f, -5.0000000000e-001f,  7.6604443789e-001f, -9.3969261646e-001f}, 
  80. };
  81. /*--- 6 point transform
  82. v  = addr->w;
  83. v2 = addr->w2;
  84. coef87 = (float*) addr->coef;
  85. n = 6;
  86. pi = 4.0*atan(1.0);
  87. t = pi/(4*n);
  88. for(p=0;p<n;p++) 
  89. v[p] =  (float)2.0*cos(t*(2*p+1));
  90. for(p=0;p<3;p++) 
  91. v2[p] = (float)2.0*cos(2*t*(2*p+1));
  92. t = pi/(2*n);
  93. k = 1;
  94. p = 0;
  95. *coef87 = (float)cos(t*(2*k)*(2*p+1));
  96. for(p=0;p<6;p++) 
  97. v[p] = v[p]/2.0f;
  98. *coef87 = (float)2.0*(*coef87);
  99. */
  100. /* JR - made into ROM table */
  101. static const float v[6] = {
  102.  9.9144488573e-001f,  9.2387950420e-001f,  7.9335331917e-001f,  6.0876142979e-001f, 
  103.  3.8268342614e-001f,  1.3052618504e-001f, 
  104. };
  105. /* JR - made into ROM table */
  106. static const float v2[3] = {
  107.  1.9318516254e+000f,  1.4142135382e+000f,  5.1763808727e-001f, 
  108. };
  109. /* JR - made into ROM table */
  110. static const float coef87 = 1.7320507765e+000f;
  111. /*--------------------------------------------------------------------*/
  112. void imdct18(float f[18])  /* 18 point */
  113. {
  114. int p;
  115. float a[9], b[9];
  116. float ap, bp, a8p, b8p;
  117. float g1, g2;
  118. for(p=0;p<4;p++) {
  119.     g1 = w[p]*f[p];
  120.     g2 = w[17-p]*f[17-p];
  121.     ap  =          g1 + g2;     // a[p]
  122.     bp  =   w2[p]*(g1 - g2);    // b[p]
  123.     g1 = w[8-p]*f[8-p];
  124.     g2 = w[9+p]*f[9+p];
  125.     a8p =          g1 + g2;    // a[8-p]
  126.     b8p = w2[8-p]*(g1 - g2);   // b[8-p]
  127.     a[p]   = ap + a8p;
  128.     a[5+p] = ap - a8p;
  129.     b[p]   = bp + b8p;
  130.     b[5+p] = bp - b8p;
  131. }
  132. g1 = w[p]*f[p];
  133. g2 = w[17-p]*f[17-p];
  134. a[p] = g1 + g2;
  135. b[p] = w2[p]*(g1 - g2);
  136. f[0] = 0.5f*(a[0] + a[1] + a[2] + a[3] + a[4]);
  137. f[1] = 0.5f*(b[0] + b[1] + b[2] + b[3] + b[4]);
  138. f[2] = coef[1][0]*a[5] + coef[1][1]*a[6] + coef[1][2]*a[7]
  139.         + coef[1][3]*a[8];
  140. f[3] = coef[1][0]*b[5] + coef[1][1]*b[6] + coef[1][2]*b[7]
  141.         + coef[1][3]*b[8]                   - f[1];
  142. f[1] = f[1] - f[0];
  143. f[2] = f[2] - f[1];
  144. f[4] = coef[2][0]*a[0] + coef[2][1]*a[1] + coef[2][2]*a[2]
  145.         + coef[2][3]*a[3] - a[4];
  146. f[5] = coef[2][0]*b[0] + coef[2][1]*b[1] + coef[2][2]*b[2]
  147.         + coef[2][3]*b[3] - b[4]            - f[3];
  148. f[3] = f[3] - f[2];
  149. f[4] = f[4] - f[3];
  150. f[6] = coef[3][0]*( a[5] - a[7] - a[8]);
  151. f[7] = coef[3][0]*( b[5] - b[7] - b[8])     - f[5];
  152. f[5] = f[5] - f[4];
  153. f[6] = f[6] - f[5];
  154. f[8] = coef[4][0]*a[0] + coef[4][1]*a[1] + coef[4][2]*a[2]
  155.         + coef[4][3]*a[3] + a[4];
  156. f[9] = coef[4][0]*b[0] + coef[4][1]*b[1] + coef[4][2]*b[2]
  157.         + coef[4][3]*b[3] + b[4]            - f[7];
  158. f[7] = f[7] - f[6];
  159. f[8] = f[8] - f[7];
  160. f[10]= coef[5][0]*a[5] + coef[5][1]*a[6] + coef[5][2]*a[7]
  161.         + coef[5][3]*a[8];
  162. f[11]= coef[5][0]*b[5] + coef[5][1]*b[6] + coef[5][2]*b[7]
  163.         + coef[5][3]*b[8]                    - f[9];
  164. f[9]  = f[9]  - f[8];
  165. f[10] = f[10] - f[9];
  166. f[12]= 0.5f*(a[0] + a[2] + a[3]) - a[1] - a[4];
  167. f[13]= 0.5f*(b[0] + b[2] + b[3]) - b[1] - b[4] - f[11];
  168. f[11] = f[11] - f[10];
  169. f[12] = f[12] - f[11];
  170. f[14]= coef[7][0]*a[5] + coef[7][1]*a[6] + coef[7][2]*a[7]
  171.         + coef[7][3]*a[8];
  172. f[15]= coef[7][0]*b[5] + coef[7][1]*b[6] + coef[7][2]*b[7]
  173.         + coef[7][3]*b[8]                    - f[13];
  174. f[13] = f[13] - f[12];
  175. f[14] = f[14] - f[13];
  176. f[16]= coef[8][0]*a[0] + coef[8][1]*a[1] + coef[8][2]*a[2]
  177.         + coef[8][3]*a[3] + a[4];
  178. f[17]= coef[8][0]*b[0] + coef[8][1]*b[1] + coef[8][2]*b[2]
  179.         + coef[8][3]*b[3] + b[4]             - f[15];
  180. f[15] = f[15] - f[14];
  181. f[16] = f[16] - f[15];
  182. f[17] = f[17] - f[16];
  183. return;
  184. }
  185. /*--------------------------------------------------------------------*/
  186. /* does 3, 6 pt dct.  changes order from f[i][window] c[window][i] */
  187. void imdct6_3(float f[])  /* 6 point */
  188. {
  189. int w;
  190. float buf[18];
  191. float *a, *c;       // b[i] = a[3+i]
  192. float g1, g2;
  193. float a02, b02;
  194. c = f;
  195. a = buf;
  196. for(w=0;w<3;w++) {
  197.     g1 = v[0]*f[3*0];
  198.     g2 = v[5]*f[3*5];
  199.     a[0] = g1 + g2;
  200.     a[3+0] = v2[0]*(g1 - g2);
  201.     g1 = v[1]*f[3*1];
  202.     g2 = v[4]*f[3*4];
  203.     a[1] = g1 + g2;
  204.     a[3+1] = v2[1]*(g1 - g2);
  205.     g1 = v[2]*f[3*2];
  206.     g2 = v[3]*f[3*3];
  207.     a[2] = g1 + g2;
  208.     a[3+2] = v2[2]*(g1 - g2);
  209.     a+=6;
  210.     f++;
  211. }
  212. a = buf;
  213. for(w=0;w<3;w++) {
  214.     a02 = (a[0] + a[2]);
  215.     b02 = (a[3+0] + a[3+2]);
  216.     c[0] = a02 + a[1];
  217.     c[1] = b02 + a[3+1];
  218.     c[2] = coef87*(a[0] - a[2]);
  219.     c[3] = coef87*(a[3+0] - a[3+2]) - c[1];
  220.     c[1] = c[1] - c[0];
  221.     c[2] = c[2] - c[1];
  222.     c[4] = a02 - a[1] - a[1];
  223.     c[5] = b02 - a[3+1] - a[3+1]    - c[3];
  224.     c[3] = c[3] - c[2];
  225.     c[4] = c[4] - c[3];
  226.     c[5] = c[5] - c[4];
  227.     a+=6;
  228.     c+=6;
  229. }
  230. return;
  231. }
  232. /*--------------------------------------------------------------------*/