newmdct.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:18k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * MP3 window subband -> subband filtering -> mdct routine
  3.  *
  4.  * Copyright (c) 1999 Takehiro TOMINAGA
  5.  *
  6.  *
  7.  * This library is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Library General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2 of the License, or (at your option) any later version.
  11.  *
  12.  * This library is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Library General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Library General Public
  18.  * License along with this library; if not, write to the
  19.  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  20.  * Boston, MA 02111-1307, USA.
  21.  */
  22. /*
  23.  *         Special Thanks to Patrick De Smet for your advices.
  24.  */
  25. #include "util.h"
  26. #include "l3side.h"
  27. #include "newmdct.h"
  28. #define SCALE 32768
  29. static FLOAT8 enwindow[] = 
  30. {
  31.   3.5780907e-02,1.7876148e-02,3.134727e-03,2.457142e-03,
  32.     9.71317e-04,  2.18868e-04, 1.01566e-04,  1.3828e-05,
  33.   3.5758972e-02, 3.401756e-03,  9.83715e-04,   9.9182e-05,
  34.       -4.77e-07,  1.03951e-04,  9.53674e-04, 2.841473e-03,
  35.      1.2398e-05,  1.91212e-04, 2.283096e-03,1.6994476e-02,
  36.   1.8756866e-02, 2.630711e-03,  2.47478e-04,   1.4782e-05,
  37.   3.5694122e-02, 3.643036e-03,  9.91821e-04,   9.6321e-05,
  38.       -4.77e-07,  1.05858e-04,  9.30786e-04, 2.521515e-03,
  39.      1.1444e-05,  1.65462e-04, 2.110004e-03,1.6112804e-02,
  40.   1.9634247e-02, 2.803326e-03,  2.77042e-04,   1.6689e-05,
  41.   3.5586357e-02, 3.858566e-03,  9.95159e-04,   9.3460e-05,
  42.       -4.77e-07,  1.07288e-04,  9.02653e-04, 2.174854e-03,
  43.      1.0014e-05,  1.40190e-04, 1.937389e-03,1.5233517e-02,
  44.   2.0506859e-02, 2.974033e-03,  3.07560e-04,   1.8120e-05,
  45.   3.5435200e-02, 4.049301e-03,  9.94205e-04,   9.0599e-05,
  46.       -4.77e-07,  1.08242e-04,  8.68797e-04, 1.800537e-03,
  47.       9.060e-06,  1.16348e-04, 1.766682e-03,1.4358521e-02,
  48.   2.1372318e-02,  3.14188e-03,  3.39031e-04,   1.9550e-05,
  49.   3.5242081e-02, 4.215240e-03,  9.89437e-04,   8.7261e-05,
  50.       -4.77e-07,  1.08719e-04,  8.29220e-04, 1.399517e-03,
  51.       8.106e-06,   9.3937e-05, 1.597881e-03,1.3489246e-02,
  52.   2.2228718e-02, 3.306866e-03,  3.71456e-04,   2.1458e-05,
  53.   3.5007000e-02, 4.357815e-03,  9.80854e-04,   8.3923e-05,
  54.       -4.77e-07,  1.08719e-04,   7.8392e-04,  9.71317e-04,
  55.       7.629e-06,   7.2956e-05, 1.432419e-03,1.2627602e-02,
  56.   2.3074150e-02, 3.467083e-03,  4.04358e-04,   2.3365e-05,
  57.   3.4730434e-02, 4.477024e-03,  9.68933e-04,   8.0585e-05,
  58.       -9.54e-07,  1.08242e-04,  7.31945e-04,  5.15938e-04,
  59.       6.676e-06,   5.2929e-05, 1.269817e-03,1.1775017e-02,
  60.   2.3907185e-02, 3.622532e-03,  4.38213e-04,   2.5272e-05,
  61.   3.4412861e-02, 4.573822e-03,  9.54151e-04,   7.6771e-05,
  62.       -9.54e-07,  1.06812e-04,  6.74248e-04,   3.3379e-05,
  63.       6.199e-06,   3.4332e-05, 1.111031e-03,1.0933399e-02,
  64.   2.4725437e-02, 3.771782e-03,  4.72546e-04,   2.7657e-05,
  65.   3.4055710e-02, 4.649162e-03,  9.35555e-04,   7.3433e-05,
  66.       -9.54e-07,  1.05381e-04,  6.10352e-04, -4.75883e-04,
  67.       5.245e-06,   1.7166e-05,  9.56535e-04,1.0103703e-02,
  68.   2.5527000e-02, 3.914356e-03,  5.07355e-04,   3.0041e-05,
  69.   3.3659935e-02, 4.703045e-03,  9.15051e-04,   7.0095e-05,
  70.       -9.54e-07,  1.02520e-04,  5.39303e-04,-1.011848e-03,
  71.       4.768e-06,     9.54e-07,  8.06808e-04, 9.287834e-03,
  72.   2.6310921e-02, 4.048824e-03,  5.42164e-04,   3.2425e-05,
  73.   3.3225536e-02, 4.737377e-03,  8.91685e-04,   6.6280e-05,
  74.      -1.431e-06,   9.9182e-05,  4.62532e-04,-1.573563e-03,
  75.       4.292e-06,  -1.3828e-05,  6.61850e-04, 8.487225e-03,
  76.   2.7073860e-02, 4.174709e-03,  5.76973e-04,   3.4809e-05,
  77.   3.2754898e-02, 4.752159e-03,  8.66413e-04,   6.2943e-05,
  78.      -1.431e-06,   9.5367e-05,  3.78609e-04,-2.161503e-03,
  79.       3.815e-06,   -2.718e-05,  5.22137e-04, 7.703304e-03,
  80.   2.7815342e-02, 4.290581e-03,  6.11782e-04,   3.7670e-05,
  81.   3.2248020e-02, 4.748821e-03,  8.38757e-04,   5.9605e-05,
  82.      -1.907e-06,   9.0122e-05,  2.88486e-04,-2.774239e-03,
  83.       3.338e-06,  -3.9577e-05,  3.88145e-04, 6.937027e-03,
  84.   2.8532982e-02, 4.395962e-03,  6.46591e-04,   4.0531e-05,
  85.   3.1706810e-02, 4.728317e-03,  8.09669e-04,    5.579e-05,
  86.      -1.907e-06,   8.4400e-05,  1.91689e-04,-3.411293e-03,
  87.       3.338e-06,  -5.0545e-05,  2.59876e-04, 6.189346e-03,
  88.   2.9224873e-02, 4.489899e-03,  6.80923e-04,   4.3392e-05,
  89.   3.1132698e-02, 4.691124e-03,  7.79152e-04,   5.2929e-05,
  90.      -2.384e-06,   7.7724e-05,   8.8215e-05,-4.072189e-03,
  91.       2.861e-06,  -6.0558e-05,  1.37329e-04, 5.462170e-03,
  92.   2.9890060e-02, 4.570484e-03,  7.14302e-04,   4.6253e-05,
  93.   3.0526638e-02, 4.638195e-03,  7.47204e-04,   4.9591e-05,
  94.    4.756451e-03,   2.1458e-05,  -6.9618e-05,    2.384e-06
  95. };
  96. static FLOAT8 sb_sample[2][2][18][SBLIMIT];
  97. static FLOAT8 mm[16][SBLIMIT - 1];
  98. #define NS 12
  99. #define NL 36
  100. static const int all[] = {0,2,3,5,6,8,9,11,12,14,15,17};
  101. static FLOAT8 ca[8], cs[8];
  102. static FLOAT8 cos_s[NS / 2][NS / 2];
  103. static FLOAT8 cos_l[(NL / 2) * 12 + (NL / 6) * 4 + (NL / 18) * 2];
  104. static FLOAT8 win[4][36];
  105. #define work (&win[2][4])
  106. /************************************************************************
  107. *
  108. * window_subband()
  109. *
  110. * PURPOSE:  Overlapping window on PCM samples
  111. *
  112. * SEMANTICS:
  113. * 32 16-bit pcm samples are scaled to fractional 2's complement and
  114. * concatenated to the end of the window buffer #x#. The updated window
  115. * buffer #x# is then windowed by the analysis window #c# to produce the
  116. * windowed sample #z#
  117. *
  118. ************************************************************************/
  119. static void window_subband(short *xk, FLOAT8 d[SBLIMIT], FLOAT8 *in)
  120. {
  121.     int i;
  122.     FLOAT8 s, t, *wp;
  123.     wp = enwindow;
  124.     {
  125. t  =  xk[255];
  126. t += (xk[223] - xk[287]) * *wp++;
  127. t += (xk[191] + xk[319]) * *wp++;
  128. t += (xk[159] - xk[351]) * *wp++;
  129. t += (xk[127] + xk[383]) * *wp++;
  130. t += (xk[ 95] - xk[415]) * *wp++;
  131. t += (xk[ 63] + xk[447]) * *wp++;
  132. t += (xk[ 31] - xk[479]) * *wp++;
  133. in[15] = t;
  134.     }
  135.     for (i = 14; i >= 0; --i) {
  136. short *x1 = &xk[i];
  137. short *x2 = &xk[-i];
  138. FLOAT8 w;
  139. s = x2[270]; t = x1[240];
  140. w = *wp++; s += x2[334] * w; t += x1[176] * w;
  141. w = *wp++; s += x2[398] * w; t += x1[112] * w;
  142. w = *wp++; s += x2[462] * w; t += x1[ 48] * w;
  143. w = *wp++; s += x2[ 14] * w; t += x1[496] * w;
  144. w = *wp++; s += x2[ 78] * w; t += x1[432] * w;
  145. w = *wp++; s += x2[142] * w; t += x1[368] * w;
  146. w = *wp++; s += x2[206] * w; t += x1[304] * w;
  147. w = *wp++; s += x1[ 16] * w; t -= x2[494] * w;
  148. w = *wp++; s += x1[ 80] * w; t -= x2[430] * w;
  149. w = *wp++; s += x1[144] * w; t -= x2[366] * w;
  150. w = *wp++; s += x1[208] * w; t -= x2[302] * w;
  151. w = *wp++; s -= x1[272] * w; t += x2[238] * w;
  152. w = *wp++; s -= x1[336] * w; t += x2[174] * w;
  153. w = *wp++; s -= x1[400] * w; t += x2[110] * w;
  154. w = *wp++; s -= x1[464] * w; t += x2[ 46] * w;
  155. in[30 - i] = s;
  156. in[i] = t;
  157.     }
  158.     {
  159. s  = xk[239];
  160. s += xk[175] * *wp++;
  161. s += xk[111] * *wp++;
  162. s += xk[ 47] * *wp++;
  163. s -= xk[303] * *wp++;
  164. s -= xk[367] * *wp++;
  165. s -= xk[431] * *wp++;
  166. s -= xk[495] * *wp++;
  167. /* in[-1] = s;  */
  168.     }
  169.     in++;
  170.     wp = &mm[0][0];
  171.     for (i = 15; i >= 0; --i) {
  172. int j;
  173. FLOAT8 s0 = s; /* mm[i][0] is always 1 */
  174. FLOAT8 s1 = t * *wp++;
  175. for (j = 14; j >= 0; j--) {
  176.     s0 += *wp++ * *in++;
  177.     s1 += *wp++ * *in++;
  178. }
  179. in -= 30;
  180. d[i     ] = s0 + s1;
  181. d[31 - i] = s0 - s1;
  182.     }
  183. }
  184. /*-------------------------------------------------------------------*/
  185. /*                                                                   */
  186. /*   Function: Calculation of the MDCT                               */
  187. /*   In the case of long blocks (type 0,1,3) there are               */
  188. /*   36 coefficents in the time domain and 18 in the frequency       */
  189. /*   domain.                                                         */
  190. /*   In the case of short blocks (type 2) there are 3                */
  191. /*   transformations with short length. This leads to 12 coefficents */
  192. /*   in the time and 6 in the frequency domain. In this case the     */
  193. /*   results are stored side by side in the vector out[].            */
  194. /*                                                                   */
  195. /*   New layer3                                                      */
  196. /*                                                                   */
  197. /*-------------------------------------------------------------------*/
  198. static void mdct_short(FLOAT8 *out, FLOAT8 *in)
  199. {
  200.     int m;
  201.     for (m = NS / 2 - 1; m >= 0; --m) {
  202. int l;
  203. FLOAT8 a0, a1, a2, a3, a4, a5;
  204. a0 = cos_s[m][0];
  205. a1 = cos_s[m][1];
  206. a2 = cos_s[m][2];
  207. a3 = cos_s[m][3];
  208. a4 = cos_s[m][4];
  209. a5 = cos_s[m][5];
  210. for (l = 2; l >= 0; l--) {
  211.     out[3 * m + l] =
  212. a0 * in[6 * l    ] +
  213. a1 * in[6 * l + 1] +
  214. a2 * in[6 * l + 2] +
  215. a3 * in[6 * l + 3] +
  216. a4 * in[6 * l + 4] +
  217. a5 * in[6 * l + 5];
  218. }
  219.     }
  220. }
  221. static void mdct_long(FLOAT8 *out, FLOAT8 *in)
  222. {
  223.     FLOAT8 s0, s1, s2, s3, s4, s5;
  224.     int j = sizeof(all) / sizeof(int) - 1;
  225.     FLOAT8 *cos_l0 = cos_l;
  226.     do {
  227. out[all[j]] =
  228.     in[ 0] * cos_l0[ 0] +
  229.     in[ 1] * cos_l0[ 1] +
  230.     in[ 2] * cos_l0[ 2] +
  231.     in[ 3] * cos_l0[ 3] +
  232.     in[ 4] * cos_l0[ 4] +
  233.     in[ 5] * cos_l0[ 5] +
  234.     in[ 6] * cos_l0[ 6] +
  235.     in[ 7] * cos_l0[ 7] +
  236.     in[ 8] * cos_l0[ 8] +
  237.     in[ 9] * cos_l0[ 9] +
  238.     in[10] * cos_l0[10] +
  239.     in[11] * cos_l0[11] +
  240.     in[12] * cos_l0[12] +
  241.     in[13] * cos_l0[13] +
  242.     in[14] * cos_l0[14] +
  243.     in[15] * cos_l0[15] +
  244.     in[16] * cos_l0[16] +
  245.     in[17] * cos_l0[17];
  246. cos_l0 += 18;
  247.     } while (--j >= 0);
  248.     s0 = in[0] + in[ 5] + in[15];
  249.     s1 = in[1] + in[ 4] + in[16];
  250.     s2 = in[2] + in[ 3] + in[17];
  251.     s3 = in[6] - in[ 9] + in[14];
  252.     s4 = in[7] - in[10] + in[13];
  253.     s5 = in[8] - in[11] + in[12];
  254.     /* 16 */
  255.     out[16] =
  256. s0 * cos_l0[0] + s1 * cos_l0[1] + s2 * cos_l0[2] +
  257. s3 * cos_l0[3] + s4 * cos_l0[4] + s5 * cos_l0[5];
  258.     cos_l0 += 6;
  259.     /* 10 */
  260.     out[10] =
  261. s0 * cos_l0[0] + s1 * cos_l0[1] + s2 * cos_l0[2] +
  262. s3 * cos_l0[3] + s4 * cos_l0[4] + s5 * cos_l0[5];
  263.     cos_l0 += 6;
  264.     /* 7 */
  265.     out[7] =
  266. s0 * cos_l0[0] + s1 * cos_l0[1] + s2 * cos_l0[2] +
  267. s3 * cos_l0[3] + s4 * cos_l0[4] + s5 * cos_l0[5];
  268.     cos_l0 += 6;
  269.     /* 1 */
  270.     out[1] =
  271. s0 * cos_l0[0] + s1 * cos_l0[1] + s2 * cos_l0[2] +
  272. s3 * cos_l0[3] + s4 * cos_l0[4] + s5 * cos_l0[5];
  273.     cos_l0 += 6;
  274.     s0 = s0 - s1 + s5;
  275.     s2 = s2 - s3 - s4;
  276.     /* 13 */
  277.     out[13] = s0 * cos_l0[0] + s2 * cos_l0[1];
  278.     /* 4 */
  279.     out[4] = s0 * cos_l0[2] + s2 * cos_l0[3];
  280. }
  281. void mdct_sub48(lame_global_flags *gfp,
  282.     short *w0, short *w1,
  283.     FLOAT8 mdct_freq[2][2][576],
  284.     III_side_info_t *l3_side)
  285. {
  286.     int gr, k, ch;
  287.     short *wk;
  288.     static int init = 0;
  289.     if ( init == 0 ) {
  290.         void mdct_init48(void);
  291. mdct_init48();
  292. init++;
  293.     }
  294.     wk = w0;
  295.     /* thinking cache performance, ch->gr loop is better than gr->ch loop */
  296.     for (ch = 0; ch < gfp->stereo; ch++) {
  297. for (gr = 0; gr < gfp->mode_gr; gr++) {
  298.     int band;
  299.     FLOAT8 *mdct_enc = mdct_freq[gr][ch];
  300.     gr_info *gi = &(l3_side->gr[gr].ch[ch].tt);
  301.     FLOAT8 *samp = sb_sample[ch][1 - gr][0];
  302.     for (k = 0; k < 18 / 2; k++) {
  303. window_subband(wk, samp, work);
  304. window_subband(wk + 32, samp + 32, work);
  305. /*
  306.  * Compensate for inversion in the analysis filter
  307.  */
  308. for (band = 1; band < 32; band += 2)
  309.     samp[band + 32] *= -1.0;
  310. samp += 64;
  311. wk += 64;
  312.     }
  313.     /* apply filters on the polyphase filterbank outputs */
  314.     /* bands <= gfp->highpass_band will be zeroed out below */
  315.     /* bands >= gfp->lowpass_band  will be zeroed out below */
  316.     if (gfp->filter_type==0) {
  317.       FLOAT8 amp,freq;
  318.       for (band=gfp->highpass_band+1;  band < gfp->lowpass_band ; band++) { 
  319. freq = band/31.0;
  320. if (gfp->lowpass1 < freq && freq < gfp->lowpass2) {
  321.   amp = cos((PI/2)*(gfp->lowpass1-freq)/(gfp->lowpass2-gfp->lowpass1));
  322.   for (k=0; k<18; k++) 
  323.     sb_sample[ch][1-gr][k][band]*=amp;
  324. }
  325. if (gfp->highpass1 < freq && freq < gfp->highpass2) {
  326.   amp = cos((PI/2)*(gfp->highpass2-freq)/(gfp->highpass2-gfp->highpass1));
  327.   for (k=0; k<18; k++) 
  328.     sb_sample[ch][1-gr][k][band]*=amp;
  329. }
  330.       }
  331.     }
  332.     
  333.     /*
  334.      * Perform imdct of 18 previous subband samples
  335.      * + 18 current subband samples
  336.      */
  337.     for (band = 0; band < 32; band++, mdct_enc += 18) 
  338.               {
  339. int type = gi->block_type;
  340. #ifdef ALLOW_MIXED
  341. if (gi->mixed_block_flag && band < 2)
  342.     type = 0;
  343. #endif
  344. if (band >= gfp->lowpass_band || band <= gfp->highpass_band) {
  345.     memset((char *)mdct_enc,0,18*sizeof(FLOAT8));
  346. }else {
  347.   if (type == SHORT_TYPE) {
  348.     for (k = 2; k >= 0; --k) {
  349.       FLOAT8 w1 = win[SHORT_TYPE][k];
  350.       work[k] =
  351. sb_sample[ch][gr][k+6][band] * w1 -
  352. sb_sample[ch][gr][11-k][band];
  353.       work[k+3] =
  354. sb_sample[ch][gr][k+12][band] +
  355. sb_sample[ch][gr][17-k][band] * w1;
  356.       
  357.       work[k+6] =
  358. sb_sample[ch][gr][k+12][band] * w1 -
  359. sb_sample[ch][gr][17-k][band];
  360.       work[k+9] =
  361. sb_sample[ch][1-gr][k][band] +
  362. sb_sample[ch][1-gr][5-k][band] * w1;
  363.       
  364.       work[k+12] =
  365. sb_sample[ch][1-gr][k][band] * w1 -
  366. sb_sample[ch][1-gr][5-k][band];
  367.       work[k+15] =
  368. sb_sample[ch][1-gr][k+6][band] +
  369. sb_sample[ch][1-gr][11-k][band] * w1;
  370.     }
  371.     mdct_short(mdct_enc, work);
  372.   } else {
  373.     for (k = 8; k >= 0; --k) {
  374.       work[k] =
  375. win[type][k  ] * sb_sample[ch][gr][k   ][band]
  376. - win[type][k+9] * sb_sample[ch][gr][17-k][band];
  377.       
  378.       work[9+k] =
  379. win[type][k+18] * sb_sample[ch][1-gr][k   ][band]
  380. + win[type][k+27] * sb_sample[ch][1-gr][17-k][band];
  381.     }
  382.     mdct_long(mdct_enc, work);
  383.   }
  384. }
  385. /*
  386.   Perform aliasing reduction butterfly
  387. */
  388. if (type != SHORT_TYPE) {
  389.   if (band == 0)
  390.     continue;
  391.   for (k = 7; k >= 0; --k) {
  392.     FLOAT8 bu,bd;
  393.     bu = mdct_enc[k] * ca[k] + mdct_enc[-1-k] * cs[k];
  394.     bd = mdct_enc[k] * cs[k] - mdct_enc[-1-k] * ca[k];
  395.     
  396.     mdct_enc[-1-k] = bu;
  397.     mdct_enc[k]    = bd;
  398.   }
  399. }
  400.       }
  401. }
  402. wk = w1;
  403. if (gfp->mode_gr == 1) {
  404.     memcpy(sb_sample[ch][0], sb_sample[ch][1], 576 * sizeof(FLOAT8));
  405. }
  406.     }
  407. }
  408. void mdct_init48(void)
  409. {
  410.     int i, k, m;
  411.     FLOAT8 sq;
  412.     FLOAT8 max;
  413.     /* prepare the aliasing reduction butterflies */
  414.     for (k = 0; k < 8; k++) {
  415. /*
  416.   This is table B.9: coefficients for aliasing reduction
  417.   */
  418. static const FLOAT8 c[8] = {
  419.     -0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142, -0.0037
  420. };
  421. sq = 1.0 + c[k] * c[k];
  422. sq = sqrt(sq);
  423. ca[k] = c[k] / sq;
  424. cs[k] = 1.0 / sq;
  425.     }
  426.     /* type 0*/
  427.     for (i = 0; i < 36; i++)
  428. win[0][i] = sin(PI/36 * (i + 0.5));
  429.     /* type 1*/
  430.     for (i = 0; i < 18; i++) 
  431. win[1][i] = win[0][i];
  432.     for (; i < 24; i++)
  433. win[1][i] = 1.0;
  434.     for (; i < 30; i++)
  435. win[1][i] = cos(PI/12 * (i + 0.5));
  436.     for (; i < 36; i++)
  437. win[1][i] = 0.0;
  438.     /* type 3*/
  439.     for (i = 0; i < 36; i++)
  440. win[3][i] = win[1][35 - i];
  441.     sq = 4.0 / NL;
  442.     {
  443. FLOAT8 *cos_l0 = cos_l;
  444. static const int d3[] = {1,7,10,16};
  445. static const int d9[] = {4,13};
  446. int j = sizeof(all) / sizeof(int) - 1;
  447. do {
  448.     m = all[j];
  449.     for (k = 0; k < NL / 4; k++) {
  450. *cos_l0++ = sq *
  451.     cos((PI / (4 * NL)) * (2 * m + 1) * (4 * k + 2 + NL));
  452.     }
  453.     for (k = 0; k < NL / 4; k++) {
  454. *cos_l0++ = sq *
  455.     cos((PI / (4 * NL)) * (2 * m + 1) * (4 * k + 2 + NL * 3));
  456.     }
  457. } while (--j >= 0);
  458. j = sizeof(d3) / sizeof(int) - 1;
  459. do {
  460.     m = d3[j];
  461.     for (k = 0; k < 3; k++) {
  462. *cos_l0++ = sq *
  463.     cos((PI / (4 * NL)) * (2 * m + 1) * (4 * k + 2 + NL));
  464.     }
  465.     for (k = 6; k < 9; k++) {
  466. *cos_l0++ = sq *
  467.     cos((PI / (4 * NL)) * (2 * m + 1) * (4 * k + 2 + NL));
  468.     }
  469. } while (--j >= 0);
  470. j = sizeof(d9) / sizeof(int) - 1;
  471. do {
  472.     m = d9[j];
  473.     *cos_l0++ = sq *
  474. cos((PI / (4 * NL)) * (2 * m + 1) * (2 + NL));
  475.     *cos_l0++ = sq *
  476. cos((PI / (4 * NL)) * (2 * m + 1) * (4 * 2 + 2 + NL));
  477. } while (--j >= 0);
  478.     }
  479.     max = enwindow[256 - 8];
  480.     {
  481. FLOAT8 *wp = enwindow;
  482. FLOAT8 *wr = enwindow;
  483. FLOAT8 mmax[32 - 1];
  484. {
  485.     FLOAT8 w = *wp++;
  486.     mmax[15] = w / max;
  487.     for (k = 0; k < 7; k++) {
  488. *wr++ = *wp++ / w;
  489.     }
  490. }
  491. for (i = 14; i >= 0; --i) {
  492.     FLOAT8 w = *wp++;
  493.     mmax[i] = mmax[30 - i] = w / max;
  494.     for (k = 0; k < 15; k++) {
  495. *wr++ = *wp++ / w;
  496.     }
  497. }
  498. {
  499.     wp++;
  500.     for (k = 0; k < 7; k++) {
  501. *wr++ = *wp++ / max;
  502.     }
  503. }
  504. wp = &mm[0][0];
  505. for (i = 15; i >= 0; --i) {
  506.     for (k = 1; k < 32; k++) {
  507. *wp++ = cos((2 * i + 1) * k * PI/64) * mmax[k - 1];
  508.     }
  509. }
  510.     }
  511.     /* swap window data*/
  512.     for (k = 0; k < 4; k++) {
  513. FLOAT8 a;
  514. a = win[0][17-k];
  515. win[0][17-k] = win[0][9+k];
  516. win[0][9+k] = a;
  517. a = win[0][35-k];
  518. win[0][35-k] = win[0][27+k];
  519. win[0][27+k] = a;
  520. a = win[1][17-k];
  521. win[1][17-k] = win[1][9+k];
  522. win[1][9+k] = a;
  523. a = win[1][35-k];
  524. win[1][35-k] = win[1][27+k];
  525. win[1][27+k] = a;
  526. a = win[3][17-k];
  527. win[3][17-k] = win[3][9+k];
  528. win[3][9+k] = a;
  529. a = win[3][35-k];
  530. win[3][35-k] = win[3][27+k];
  531. win[3][27+k] = a;
  532.     }
  533.     for (i = 0; i < 36; i++) {
  534. win[0][i] *= max / SCALE;
  535. win[1][i] *= max / SCALE;
  536. win[3][i] *= max / SCALE;
  537.     }
  538.     /* type 2(short)*/
  539.     sq = 4.0 / NS;
  540.     for (i = 0; i < NS / 4; i++) {
  541. FLOAT8 w2 = cos(PI/12 * (i + 0.5)) * max / SCALE * sq;
  542. win[SHORT_TYPE][i] = tan(PI/12 * (i + 0.5));
  543. for (m = 0; m < NS / 2; m++) {
  544.     cos_s[m][i] = w2 *
  545. cos((PI / (4 * NS)) * (2 * m + 1) * (4 * i + 2 + NS));
  546.     cos_s[m][i + NS / 4] = w2 *
  547. cos((PI / (4 * NS)) * (2 * m + 1) * (4 * i + 2 + NS * 3));
  548. }
  549.     }
  550. }