trigtabs.c
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:15k
源码类别:

Symbian

开发平台:

Visual 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.  * Fixed-point MP3 decoder
  37.  * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com)
  38.  * June 2003
  39.  *
  40.  * trigtabs.c - global ROM tables for pre-calculated trig coefficients
  41.  **************************************************************************************/
  42. #include "coder.h"
  43. /* post-IMDCT window, win[blockType][i]
  44.  * format = Q31
  45.  * Fused sin window with final stage of IMDCT
  46.  * includes 1/sqrt(2) scaling, since we scale by sqrt(2) in dequant in order
  47.  *   for fast IMDCT36 to be usable
  48.  * 
  49.  *  for(i=0;i<9;i++)   win[0][i] = sin(pi/36 *(i+0.5));
  50.  *  for(i=9;i<36;i++)  win[0][i] = -sin(pi/36 *(i+0.5));
  51.  * 
  52.  *  for(i=0;i<9;i++)   win[1][i] = sin(pi/36 *(i+0.5));
  53.  *  for(i=9;i<18;i++)  win[1][i] = -sin(pi/36 *(i+0.5));
  54.  *  for(i=18;i<24;i++) win[1][i] = -1;
  55.  *  for(i=24;i<30;i++) win[1][i] = -sin(pi/12 *(i+0.5-18));
  56.  *  for(i=30;i<36;i++) win[1][i] = 0;
  57.  * 
  58.  *  for(i=0;i<6;i++)   win[3][i] = 0;
  59.  *  for(i=6;i<9;i++)   win[3][i] = sin(pi/12 *(i+0.5-6));
  60.  *  for(i=9;i<12;i++)  win[3][i] = -sin(pi/12 *(i+0.5-6));
  61.  *  for(i=12;i<18;i++) win[3][i] = -1;
  62.  *  for(i=18;i<36;i++) win[3][i] = -sin(pi/36*(i+0.5));
  63.  * 
  64.  *  for(i=0;i<3;i++)   win[2][i] = sin(pi/12*(i+0.5));
  65.  *  for(i=3;i<12;i++)  win[2][i] = -sin(pi/12*(i+0.5));
  66.  *  for(i=12;i<36;i++) win[2][i] = 0;
  67.  * 
  68.  *  for (i = 0; i < 4; i++) {
  69.  *  if (i == 2) {
  70.  *  win[i][8]  *= cos(pi/12 * (0+0.5));
  71.  *  win[i][9]  *= cos(pi/12 * (0+0.5));
  72.  *  win[i][7]  *= cos(pi/12 * (1+0.5));
  73.  *  win[i][10] *= cos(pi/12 * (1+0.5));
  74.  *  win[i][6]  *= cos(pi/12 * (2+0.5));
  75.  *  win[i][11] *= cos(pi/12 * (2+0.5));
  76.  *  win[i][0]  *= cos(pi/12 * (3+0.5));
  77.  *  win[i][5]  *= cos(pi/12 * (3+0.5));
  78.  *  win[i][1]  *= cos(pi/12 * (4+0.5));
  79.  *  win[i][4]  *= cos(pi/12 * (4+0.5));
  80.  *  win[i][2]  *= cos(pi/12 * (5+0.5));
  81.  *  win[i][3]  *= cos(pi/12 * (5+0.5));
  82.  *  } else {
  83.  *  for (j = 0; j < 9; j++) {
  84.  *  win[i][8-j] *= cos(pi/36 * (17-j+0.5));
  85.  *  win[i][9+j] *= cos(pi/36 * (17-j+0.5));
  86.  *  }
  87.  *  for (j = 0; j < 9; j++) {
  88.  *  win[i][18+8-j] *= cos(pi/36 * (j+0.5));
  89.  *  win[i][18+9+j] *= cos(pi/36 * (j+0.5));
  90.  *  }
  91.  *  }
  92.  *  }
  93.  * for (i = 0; i < 4; i++)
  94.  * for (j = 0; j < 36; j++)
  95.  *  win[i][j] *= 1.0 / sqrt(2);
  96.  */
  97. const int imdctWin[4][36] = {
  98. {
  99. 0x02aace8b, 0x07311c28, 0x0a868fec, 0x0c913b52, 0x0d413ccd, 0x0c913b52, 0x0a868fec, 0x07311c28, 
  100. 0x02aace8b, 0xfd16d8dd, 0xf6a09e66, 0xef7a6275, 0xe7dbc161, 0xe0000000, 0xd8243e9f, 0xd0859d8b, 
  101. 0xc95f619a, 0xc2e92723, 0xbd553175, 0xb8cee3d8, 0xb5797014, 0xb36ec4ae, 0xb2bec333, 0xb36ec4ae, 
  102. 0xb5797014, 0xb8cee3d8, 0xbd553175, 0xc2e92723, 0xc95f619a, 0xd0859d8b, 0xd8243e9f, 0xe0000000, 
  103. 0xe7dbc161, 0xef7a6275, 0xf6a09e66, 0xfd16d8dd, 
  104. },
  105. {
  106. 0x02aace8b, 0x07311c28, 0x0a868fec, 0x0c913b52, 0x0d413ccd, 0x0c913b52, 0x0a868fec, 0x07311c28, 
  107. 0x02aace8b, 0xfd16d8dd, 0xf6a09e66, 0xef7a6275, 0xe7dbc161, 0xe0000000, 0xd8243e9f, 0xd0859d8b, 
  108. 0xc95f619a, 0xc2e92723, 0xbd44ef14, 0xb831a052, 0xb3aa3837, 0xafb789a4, 0xac6145bb, 0xa9adecdc, 
  109. 0xa864491f, 0xad1868f0, 0xb8431f49, 0xc8f42236, 0xdda8e6b1, 0xf47755dc, 0x00000000, 0x00000000, 
  110. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
  111. },
  112. {
  113. 0x07311c28, 0x0d413ccd, 0x07311c28, 0xf6a09e66, 0xe0000000, 0xc95f619a, 0xb8cee3d8, 0xb2bec333, 
  114. 0xb8cee3d8, 0xc95f619a, 0xe0000000, 0xf6a09e66, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
  115. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
  116. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
  117. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 
  118. },
  119. {
  120. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x028e9709, 0x04855ec0, 
  121. 0x026743a1, 0xfcde2c10, 0xf515dc82, 0xec93e53b, 0xe4c880f8, 0xdd5d0b08, 0xd63510b7, 0xcf5e834a, 
  122. 0xc8e6b562, 0xc2da4105, 0xbd553175, 0xb8cee3d8, 0xb5797014, 0xb36ec4ae, 0xb2bec333, 0xb36ec4ae, 
  123. 0xb5797014, 0xb8cee3d8, 0xbd553175, 0xc2e92723, 0xc95f619a, 0xd0859d8b, 0xd8243e9f, 0xe0000000, 
  124. 0xe7dbc161, 0xef7a6275, 0xf6a09e66, 0xfd16d8dd, 
  125. },
  126. };
  127. /* indexing = [mid-side off/on][intensity scale factor]
  128.  * format = Q30, range = [0.0, 1.414]
  129.  *
  130.  * mid-side off: 
  131.  *   ISFMpeg1[0][i] = tan(i*pi/12) / [1 + tan(i*pi/12)]  (left scalefactor)
  132.  *                  =      1       / [1 + tan(i*pi/12)]  (right scalefactor)
  133.  *
  134.  * mid-side on: 
  135.  *   ISFMpeg1[1][i] = sqrt(2) * ISFMpeg1[0][i]
  136.  *
  137.  * output L = ISFMpeg1[midSide][isf][0] * input L
  138.  * output R = ISFMpeg1[midSide][isf][1] * input L
  139.  *
  140.  * obviously left scalefactor + right scalefactor = 1 (m-s off) or sqrt(2) (m-s on)
  141.  *   so just store left and calculate right as 1 - left 
  142.  *  (can derive as right = ISFMpeg1[x][6] - left)
  143.  *
  144.  * if mid-side enabled, multiply joint stereo scale factors by sqrt(2)
  145.  *   - we scaled whole spectrum by 1/sqrt(2) in Dequant for the M+S/sqrt(2) in MidSideProc
  146.  *   - but the joint stereo part of the spectrum doesn't need this, so we have to undo it
  147.  *
  148.  * if scale factor is and illegal intensity position, this becomes a passthrough
  149.  *   - gain = [1, 0] if mid-side off, since L is coded directly and R = 0 in this region
  150.  *   - gain = [1, 1] if mid-side on, since L = (M+S)/sqrt(2), R = (M-S)/sqrt(2)
  151.  *     - and since S = 0 in the joint stereo region (above NZB right) then L = R = M * 1.0
  152.  */
  153. const int ISFMpeg1[2][7] = {
  154. {0x00000000, 0x0d8658ba, 0x176cf5d0, 0x20000000, 0x28930a2f, 0x3279a745, 0x40000000},
  155. {0x00000000, 0x13207f5c, 0x2120fb83, 0x2d413ccc, 0x39617e16, 0x4761fa3d, 0x5a827999}
  156. };
  157. /* indexing = [intensity scale on/off][mid-side off/on][intensity scale factor]
  158.  * format = Q30, range = [0.0, 1.414]
  159.  *
  160.  * if (isf == 0)                 kl = 1.0             kr = 1.0
  161.  * else if (isf & 0x01 == 0x01)  kl = i0^((isf+1)/2), kr = 1.0
  162.  * else if (isf & 0x01 == 0x00)  kl = 1.0,            kr = i0^(isf/2)
  163.  *
  164.  * if (intensityScale == 1)      i0 = 1/sqrt(2)       = 0x2d413ccc (Q30)
  165.  * else                          i0 = 1/sqrt(sqrt(2)) = 0x35d13f32 (Q30)
  166.  *
  167.  * see comments for ISFMpeg1 (just above) regarding scaling, sqrt(2), etc.
  168.  *
  169.  * compress the MPEG2 table using the obvious identities above...
  170.  * for isf = [0, 1, 2, ... 30], let sf = table[(isf+1) >> 1] 
  171.  *   - if isf odd,  L = sf*L,     R = tab[0]*R
  172.  *   - if isf even, L = tab[0]*L, R = sf*R
  173.  */
  174. const int ISFMpeg2[2][2][16] = {
  175. {
  176. {
  177. /* intensityScale off, mid-side off */
  178. 0x40000000, 0x35d13f32, 0x2d413ccc, 0x260dfc14, 0x1fffffff, 0x1ae89f99, 0x16a09e66, 0x1306fe0a, 
  179. 0x0fffffff, 0x0d744fcc, 0x0b504f33, 0x09837f05, 0x07ffffff, 0x06ba27e6, 0x05a82799, 0x04c1bf82,
  180. },
  181. {
  182. /* intensityScale off, mid-side on */
  183. 0x5a827999, 0x4c1bf827, 0x3fffffff, 0x35d13f32, 0x2d413ccc, 0x260dfc13, 0x1fffffff, 0x1ae89f99, 
  184. 0x16a09e66, 0x1306fe09, 0x0fffffff, 0x0d744fcc, 0x0b504f33, 0x09837f04, 0x07ffffff, 0x06ba27e6, 
  185. },
  186. },
  187. {
  188. {
  189. /* intensityScale on, mid-side off */
  190. 0x40000000, 0x2d413ccc, 0x20000000, 0x16a09e66, 0x10000000, 0x0b504f33, 0x08000000, 0x05a82799, 
  191. 0x04000000, 0x02d413cc, 0x02000000, 0x016a09e6, 0x01000000, 0x00b504f3, 0x00800000, 0x005a8279, 
  192. },
  193. /* intensityScale on, mid-side on */
  194. {
  195. 0x5a827999, 0x3fffffff, 0x2d413ccc, 0x1fffffff, 0x16a09e66, 0x0fffffff, 0x0b504f33, 0x07ffffff, 
  196. 0x05a82799, 0x03ffffff, 0x02d413cc, 0x01ffffff, 0x016a09e6, 0x00ffffff, 0x00b504f3, 0x007fffff, 
  197. }
  198. }
  199. };
  200. /* indexing = [intensity scale on/off][left/right]
  201.  * format = Q30, range = [0.0, 1.414]
  202.  *
  203.  * illegal intensity position scalefactors (see comments on ISFMpeg1)
  204.  */
  205. const int ISFIIP[2][2] = {
  206. {0x40000000, 0x00000000}, /* mid-side off */
  207. {0x40000000, 0x40000000}, /* mid-side on */
  208. };
  209. const unsigned char uniqueIDTab[8] = {0x5f, 0x4b, 0x43, 0x5f, 0x5f, 0x4a, 0x52, 0x5f};
  210. /* anti-alias coefficients - see spec Annex B, table 3-B.9 
  211.  *   csa[0][i] = CSi, csa[1][i] = CAi
  212.  * format = Q31
  213.  */
  214. const int csa[8][2] = {
  215. {0x6dc253f0, 0xbe2500aa}, 
  216. {0x70dcebe4, 0xc39e4949},
  217. {0x798d6e73, 0xd7e33f4a},
  218. {0x7ddd40a7, 0xe8b71176},
  219. {0x7f6d20b7, 0xf3e4fe2f},
  220. {0x7fe47e40, 0xfac1a3c7}, 
  221. {0x7ffcb263, 0xfe2ebdc6}, 
  222. {0x7fffc694, 0xff86c25d}, 
  223. };
  224. /* format = Q30, range = [0.0981, 1.9976]
  225.  *
  226.  * n = 16;
  227.  * k = 0;
  228.  * for(i=0; i<5; i++, n=n/2) {
  229.  *   for(p=0; p<n; p++, k++) {
  230.  *     t = (PI / (4*n)) * (2*p + 1);
  231.  *     coef32[k] = 2.0 * cos(t);
  232.  *   }
  233.  * }
  234.  * coef32[30] *= 0.5; / *** for initial back butterfly (i.e. two-point DCT) *** /
  235.  */
  236. const int coef32[31] = {
  237. 0x7fd8878d, 0x7e9d55fc, 0x7c29fbee, 0x78848413, 0x73b5ebd0, 0x6dca0d14, 0x66cf811f, 0x5ed77c89, 
  238. 0x55f5a4d2, 0x4c3fdff3, 0x41ce1e64, 0x36ba2013, 0x2b1f34eb, 0x1f19f97b, 0x12c8106e, 0x0647d97c, 
  239. 0x7f62368f, 0x7a7d055b, 0x70e2cbc6, 0x62f201ac, 0x5133cc94, 0x3c56ba70, 0x25280c5d, 0x0c8bd35e, 
  240. 0x7d8a5f3f, 0x6a6d98a4, 0x471cece6, 0x18f8b83c, 0x7641af3c, 0x30fbc54d, 0x2d413ccc, 
  241. };
  242. /* format = Q30, right shifted by 12 (sign bits only in top 12 - undo this when rounding to short)
  243.  *   this is to enable early-terminating multiplies on ARM
  244.  * range = [-1.144287109, 1.144989014]
  245.  * max gain of filter (per output sample) ~= 2.731
  246.  *
  247.  * new (properly sign-flipped) values 
  248.  *  - these actually are correct to 32 bits, (floating-pt coefficients in spec
  249.  *      chosen such that only ~20 bits are required)
  250.  *
  251.  * Reordering - see table 3-B.3 in spec (appendix B)
  252.  *
  253.  * polyCoef[i] = 
  254.  *   D[ 0, 32, 64, ... 480],   i = [  0, 15]
  255.  *   D[ 1, 33, 65, ... 481],   i = [ 16, 31]
  256.  *   D[ 2, 34, 66, ... 482],   i = [ 32, 47]
  257.  *     ...
  258.  *   D[15, 47, 79, ... 495],   i = [240,255]
  259.  *
  260.  * also exploits symmetry: D[i] = -D[512 - i], for i = [1, 255]
  261.  * 
  262.  * polyCoef[256, 257, ... 263] are for special case of sample 16 (out of 0)
  263.  *   see PolyphaseStereo() and PolyphaseMono()
  264.  */
  265. const int polyCoef[264] = {
  266. /* shuffled vs. original from 0, 1, ... 15 to 0, 15, 2, 13, ... 14, 1 */
  267. 0x00000000, 0x00000074, 0x00000354, 0x0000072c, 0x00001fd4, 0x00005084, 0x000066b8, 0x000249c4,
  268. 0x00049478, 0xfffdb63c, 0x000066b8, 0xffffaf7c, 0x00001fd4, 0xfffff8d4, 0x00000354, 0xffffff8c,
  269. 0xfffffffc, 0x00000068, 0x00000368, 0x00000644, 0x00001f40, 0x00004ad0, 0x00005d1c, 0x00022ce0,
  270. 0x000493c0, 0xfffd9960, 0x00006f78, 0xffffa9cc, 0x0000203c, 0xfffff7e4, 0x00000340, 0xffffff84,
  271. 0xfffffffc, 0x00000060, 0x00000378, 0x0000056c, 0x00001e80, 0x00004524, 0x000052a0, 0x00020ffc,
  272. 0x000491a0, 0xfffd7ca0, 0x00007760, 0xffffa424, 0x00002080, 0xfffff6ec, 0x00000328, 0xffffff74,
  273. 0xfffffffc, 0x00000054, 0x00000384, 0x00000498, 0x00001d94, 0x00003f7c, 0x00004744, 0x0001f32c,
  274. 0x00048e18, 0xfffd6008, 0x00007e70, 0xffff9e8c, 0x0000209c, 0xfffff5ec, 0x00000310, 0xffffff68,
  275. 0xfffffffc, 0x0000004c, 0x0000038c, 0x000003d0, 0x00001c78, 0x000039e4, 0x00003b00, 0x0001d680,
  276. 0x00048924, 0xfffd43ac, 0x000084b0, 0xffff990c, 0x00002094, 0xfffff4e4, 0x000002f8, 0xffffff5c,
  277. 0xfffffffc, 0x00000044, 0x00000390, 0x00000314, 0x00001b2c, 0x0000345c, 0x00002ddc, 0x0001ba04,
  278. 0x000482d0, 0xfffd279c, 0x00008a20, 0xffff93a4, 0x0000206c, 0xfffff3d4, 0x000002dc, 0xffffff4c,
  279. 0xfffffffc, 0x00000040, 0x00000390, 0x00000264, 0x000019b0, 0x00002ef0, 0x00001fd4, 0x00019dc8,
  280. 0x00047b1c, 0xfffd0be8, 0x00008ecc, 0xffff8e64, 0x00002024, 0xfffff2c0, 0x000002c0, 0xffffff3c,
  281. 0xfffffff8, 0x00000038, 0x0000038c, 0x000001bc, 0x000017fc, 0x0000299c, 0x000010e8, 0x000181d8,
  282. 0x0004720c, 0xfffcf09c, 0x000092b4, 0xffff894c, 0x00001fc0, 0xfffff1a4, 0x000002a4, 0xffffff2c,
  283. 0xfffffff8, 0x00000034, 0x00000380, 0x00000120, 0x00001618, 0x00002468, 0x00000118, 0x00016644,
  284. 0x000467a4, 0xfffcd5cc, 0x000095e0, 0xffff8468, 0x00001f44, 0xfffff084, 0x00000284, 0xffffff18,
  285. 0xfffffff8, 0x0000002c, 0x00000374, 0x00000090, 0x00001400, 0x00001f58, 0xfffff068, 0x00014b14,
  286. 0x00045bf0, 0xfffcbb88, 0x00009858, 0xffff7fbc, 0x00001ea8, 0xffffef60, 0x00000268, 0xffffff04,
  287. 0xfffffff8, 0x00000028, 0x0000035c, 0x00000008, 0x000011ac, 0x00001a70, 0xffffded8, 0x00013058,
  288. 0x00044ef8, 0xfffca1d8, 0x00009a1c, 0xffff7b54, 0x00001dfc, 0xffffee3c, 0x0000024c, 0xfffffef0,
  289. 0xfffffff4, 0x00000024, 0x00000340, 0xffffff8c, 0x00000f28, 0x000015b0, 0xffffcc70, 0x0001161c,
  290. 0x000440bc, 0xfffc88d8, 0x00009b3c, 0xffff7734, 0x00001d38, 0xffffed18, 0x0000022c, 0xfffffedc,
  291. 0xfffffff4, 0x00000020, 0x00000320, 0xffffff1c, 0x00000c68, 0x0000111c, 0xffffb92c, 0x0000fc6c,
  292. 0x00043150, 0xfffc708c, 0x00009bb8, 0xffff7368, 0x00001c64, 0xffffebf4, 0x00000210, 0xfffffec4,
  293. 0xfffffff0, 0x0000001c, 0x000002f4, 0xfffffeb4, 0x00000974, 0x00000cb8, 0xffffa518, 0x0000e350,
  294. 0x000420b4, 0xfffc5908, 0x00009b9c, 0xffff6ff4, 0x00001b7c, 0xffffead0, 0x000001f4, 0xfffffeac,
  295. 0xfffffff0, 0x0000001c, 0x000002c4, 0xfffffe58, 0x00000648, 0x00000884, 0xffff9038, 0x0000cad0,
  296. 0x00040ef8, 0xfffc425c, 0x00009af0, 0xffff6ce0, 0x00001a88, 0xffffe9b0, 0x000001d4, 0xfffffe94,
  297. 0xffffffec, 0x00000018, 0x0000028c, 0xfffffe04, 0x000002e4, 0x00000480, 0xffff7a90, 0x0000b2fc,
  298. 0x0003fc28, 0xfffc2c90, 0x000099b8, 0xffff6a3c, 0x00001988, 0xffffe898, 0x000001bc, 0xfffffe7c,
  299. 0x000001a0, 0x0000187c, 0x000097fc, 0x0003e84c, 0xffff6424, 0xffffff4c, 0x00000248, 0xffffffec, 
  300. };