1 /*
2  *      MP3 window subband -> subband filtering -> mdct routine
3  *
4  *      Copyright (c) 1999-2000 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 /*
24  *         Special Thanks to Patrick De Smet for your advices.
25  */
26 
27 /* $Id: newmdct.c,v 1.39 2011/05/07 16:05:17 rbrito Exp $ */
28 
29 #ifdef HAVE_CONFIG_H
30 # include <config.h>
31 #endif
32 
33 #include "lame.h"
34 #include "lame-machine.h"
35 #include "encoder.h"
36 #include "util.h"
37 #include "newmdct.h"
38 
39 
40 
41 #ifndef USE_GOGO_SUBBAND
42 static const FLOAT enwindow[] = {
43     -4.77e-07 * 0.740951125354959 / 2.384e-06, 1.03951e-04 * 0.740951125354959 / 2.384e-06,
44     9.53674e-04 * 0.740951125354959 / 2.384e-06, 2.841473e-03 * 0.740951125354959 / 2.384e-06,
45     3.5758972e-02 * 0.740951125354959 / 2.384e-06, 3.401756e-03 * 0.740951125354959 / 2.384e-06, 9.83715e-04 * 0.740951125354959 / 2.384e-06, 9.9182e-05 * 0.740951125354959 / 2.384e-06, /* 15 */
46     1.2398e-05 * 0.740951125354959 / 2.384e-06, 1.91212e-04 * 0.740951125354959 / 2.384e-06,
47     2.283096e-03 * 0.740951125354959 / 2.384e-06, 1.6994476e-02 * 0.740951125354959 / 2.384e-06,
48     -1.8756866e-02 * 0.740951125354959 / 2.384e-06, -2.630711e-03 * 0.740951125354959 / 2.384e-06,
49     -2.47478e-04 * 0.740951125354959 / 2.384e-06, -1.4782e-05 * 0.740951125354959 / 2.384e-06,
50     9.063471690191471e-01,
51     1.960342806591213e-01,
52 
53 
54     -4.77e-07 * 0.773010453362737 / 2.384e-06, 1.05858e-04 * 0.773010453362737 / 2.384e-06,
55     9.30786e-04 * 0.773010453362737 / 2.384e-06, 2.521515e-03 * 0.773010453362737 / 2.384e-06,
56     3.5694122e-02 * 0.773010453362737 / 2.384e-06, 3.643036e-03 * 0.773010453362737 / 2.384e-06, 9.91821e-04 * 0.773010453362737 / 2.384e-06, 9.6321e-05 * 0.773010453362737 / 2.384e-06, /* 14 */
57     1.1444e-05 * 0.773010453362737 / 2.384e-06, 1.65462e-04 * 0.773010453362737 / 2.384e-06,
58     2.110004e-03 * 0.773010453362737 / 2.384e-06, 1.6112804e-02 * 0.773010453362737 / 2.384e-06,
59     -1.9634247e-02 * 0.773010453362737 / 2.384e-06, -2.803326e-03 * 0.773010453362737 / 2.384e-06,
60     -2.77042e-04 * 0.773010453362737 / 2.384e-06, -1.6689e-05 * 0.773010453362737 / 2.384e-06,
61     8.206787908286602e-01,
62     3.901806440322567e-01,
63 
64 
65     -4.77e-07 * 0.803207531480645 / 2.384e-06, 1.07288e-04 * 0.803207531480645 / 2.384e-06,
66     9.02653e-04 * 0.803207531480645 / 2.384e-06, 2.174854e-03 * 0.803207531480645 / 2.384e-06,
67     3.5586357e-02 * 0.803207531480645 / 2.384e-06, 3.858566e-03 * 0.803207531480645 / 2.384e-06, 9.95159e-04 * 0.803207531480645 / 2.384e-06, 9.3460e-05 * 0.803207531480645 / 2.384e-06, /* 13 */
68     1.0014e-05 * 0.803207531480645 / 2.384e-06, 1.40190e-04 * 0.803207531480645 / 2.384e-06,
69     1.937389e-03 * 0.803207531480645 / 2.384e-06, 1.5233517e-02 * 0.803207531480645 / 2.384e-06,
70     -2.0506859e-02 * 0.803207531480645 / 2.384e-06, -2.974033e-03 * 0.803207531480645 / 2.384e-06,
71     -3.07560e-04 * 0.803207531480645 / 2.384e-06, -1.8120e-05 * 0.803207531480645 / 2.384e-06,
72     7.416505462720353e-01,
73     5.805693545089249e-01,
74 
75 
76     -4.77e-07 * 0.831469612302545 / 2.384e-06, 1.08242e-04 * 0.831469612302545 / 2.384e-06,
77     8.68797e-04 * 0.831469612302545 / 2.384e-06, 1.800537e-03 * 0.831469612302545 / 2.384e-06,
78     3.5435200e-02 * 0.831469612302545 / 2.384e-06, 4.049301e-03 * 0.831469612302545 / 2.384e-06, 9.94205e-04 * 0.831469612302545 / 2.384e-06, 9.0599e-05 * 0.831469612302545 / 2.384e-06, /* 12 */
79     9.060e-06 * 0.831469612302545 / 2.384e-06, 1.16348e-04 * 0.831469612302545 / 2.384e-06,
80     1.766682e-03 * 0.831469612302545 / 2.384e-06, 1.4358521e-02 * 0.831469612302545 / 2.384e-06,
81     -2.1372318e-02 * 0.831469612302545 / 2.384e-06, -3.14188e-03 * 0.831469612302545 / 2.384e-06,
82     -3.39031e-04 * 0.831469612302545 / 2.384e-06, -1.9550e-05 * 0.831469612302545 / 2.384e-06,
83     6.681786379192989e-01,
84     7.653668647301797e-01,
85 
86 
87     -4.77e-07 * 0.857728610000272 / 2.384e-06, 1.08719e-04 * 0.857728610000272 / 2.384e-06,
88     8.29220e-04 * 0.857728610000272 / 2.384e-06, 1.399517e-03 * 0.857728610000272 / 2.384e-06,
89     3.5242081e-02 * 0.857728610000272 / 2.384e-06, 4.215240e-03 * 0.857728610000272 / 2.384e-06, 9.89437e-04 * 0.857728610000272 / 2.384e-06, 8.7261e-05 * 0.857728610000272 / 2.384e-06, /* 11 */
90     8.106e-06 * 0.857728610000272 / 2.384e-06, 9.3937e-05 * 0.857728610000272 / 2.384e-06,
91     1.597881e-03 * 0.857728610000272 / 2.384e-06, 1.3489246e-02 * 0.857728610000272 / 2.384e-06,
92     -2.2228718e-02 * 0.857728610000272 / 2.384e-06, -3.306866e-03 * 0.857728610000272 / 2.384e-06,
93     -3.71456e-04 * 0.857728610000272 / 2.384e-06, -2.1458e-05 * 0.857728610000272 / 2.384e-06,
94     5.993769336819237e-01,
95     9.427934736519954e-01,
96 
97 
98     -4.77e-07 * 0.881921264348355 / 2.384e-06, 1.08719e-04 * 0.881921264348355 / 2.384e-06,
99     7.8392e-04 * 0.881921264348355 / 2.384e-06, 9.71317e-04 * 0.881921264348355 / 2.384e-06,
100     3.5007000e-02 * 0.881921264348355 / 2.384e-06, 4.357815e-03 * 0.881921264348355 / 2.384e-06, 9.80854e-04 * 0.881921264348355 / 2.384e-06, 8.3923e-05 * 0.881921264348355 / 2.384e-06, /* 10 */
101     7.629e-06 * 0.881921264348355 / 2.384e-06, 7.2956e-05 * 0.881921264348355 / 2.384e-06,
102     1.432419e-03 * 0.881921264348355 / 2.384e-06, 1.2627602e-02 * 0.881921264348355 / 2.384e-06,
103     -2.3074150e-02 * 0.881921264348355 / 2.384e-06, -3.467083e-03 * 0.881921264348355 / 2.384e-06,
104     -4.04358e-04 * 0.881921264348355 / 2.384e-06, -2.3365e-05 * 0.881921264348355 / 2.384e-06,
105     5.345111359507916e-01,
106     1.111140466039205e+00,
107 
108 
109     -9.54e-07 * 0.903989293123443 / 2.384e-06, 1.08242e-04 * 0.903989293123443 / 2.384e-06,
110     7.31945e-04 * 0.903989293123443 / 2.384e-06, 5.15938e-04 * 0.903989293123443 / 2.384e-06,
111     3.4730434e-02 * 0.903989293123443 / 2.384e-06, 4.477024e-03 * 0.903989293123443 / 2.384e-06, 9.68933e-04 * 0.903989293123443 / 2.384e-06, 8.0585e-05 * 0.903989293123443 / 2.384e-06, /* 9 */
112     6.676e-06 * 0.903989293123443 / 2.384e-06, 5.2929e-05 * 0.903989293123443 / 2.384e-06,
113     1.269817e-03 * 0.903989293123443 / 2.384e-06, 1.1775017e-02 * 0.903989293123443 / 2.384e-06,
114     -2.3907185e-02 * 0.903989293123443 / 2.384e-06, -3.622532e-03 * 0.903989293123443 / 2.384e-06,
115     -4.38213e-04 * 0.903989293123443 / 2.384e-06, -2.5272e-05 * 0.903989293123443 / 2.384e-06,
116     4.729647758913199e-01,
117     1.268786568327291e+00,
118 
119 
120     -9.54e-07 * 0.92387953251128675613 / 2.384e-06,
121     1.06812e-04 * 0.92387953251128675613 / 2.384e-06,
122     6.74248e-04 * 0.92387953251128675613 / 2.384e-06,
123     3.3379e-05 * 0.92387953251128675613 / 2.384e-06,
124     3.4412861e-02 * 0.92387953251128675613 / 2.384e-06,
125     4.573822e-03 * 0.92387953251128675613 / 2.384e-06,
126     9.54151e-04 * 0.92387953251128675613 / 2.384e-06,
127     7.6771e-05 * 0.92387953251128675613 / 2.384e-06,
128     6.199e-06 * 0.92387953251128675613 / 2.384e-06, 3.4332e-05 * 0.92387953251128675613 / 2.384e-06,
129     1.111031e-03 * 0.92387953251128675613 / 2.384e-06,
130     1.0933399e-02 * 0.92387953251128675613 / 2.384e-06,
131     -2.4725437e-02 * 0.92387953251128675613 / 2.384e-06,
132     -3.771782e-03 * 0.92387953251128675613 / 2.384e-06,
133     -4.72546e-04 * 0.92387953251128675613 / 2.384e-06,
134     -2.7657e-05 * 0.92387953251128675613 / 2.384e-06,
135     4.1421356237309504879e-01, /* tan(PI/8) */
136     1.414213562373095e+00,
137 
138 
139     -9.54e-07 * 0.941544065183021 / 2.384e-06, 1.05381e-04 * 0.941544065183021 / 2.384e-06,
140     6.10352e-04 * 0.941544065183021 / 2.384e-06, -4.75883e-04 * 0.941544065183021 / 2.384e-06,
141     3.4055710e-02 * 0.941544065183021 / 2.384e-06, 4.649162e-03 * 0.941544065183021 / 2.384e-06, 9.35555e-04 * 0.941544065183021 / 2.384e-06, 7.3433e-05 * 0.941544065183021 / 2.384e-06, /* 7 */
142     5.245e-06 * 0.941544065183021 / 2.384e-06, 1.7166e-05 * 0.941544065183021 / 2.384e-06,
143     9.56535e-04 * 0.941544065183021 / 2.384e-06, 1.0103703e-02 * 0.941544065183021 / 2.384e-06,
144     -2.5527000e-02 * 0.941544065183021 / 2.384e-06, -3.914356e-03 * 0.941544065183021 / 2.384e-06,
145     -5.07355e-04 * 0.941544065183021 / 2.384e-06, -3.0041e-05 * 0.941544065183021 / 2.384e-06,
146     3.578057213145241e-01,
147     1.546020906725474e+00,
148 
149 
150     -9.54e-07 * 0.956940335732209 / 2.384e-06, 1.02520e-04 * 0.956940335732209 / 2.384e-06,
151     5.39303e-04 * 0.956940335732209 / 2.384e-06, -1.011848e-03 * 0.956940335732209 / 2.384e-06,
152     3.3659935e-02 * 0.956940335732209 / 2.384e-06, 4.703045e-03 * 0.956940335732209 / 2.384e-06, 9.15051e-04 * 0.956940335732209 / 2.384e-06, 7.0095e-05 * 0.956940335732209 / 2.384e-06, /* 6 */
153     4.768e-06 * 0.956940335732209 / 2.384e-06, 9.54e-07 * 0.956940335732209 / 2.384e-06,
154     8.06808e-04 * 0.956940335732209 / 2.384e-06, 9.287834e-03 * 0.956940335732209 / 2.384e-06,
155     -2.6310921e-02 * 0.956940335732209 / 2.384e-06, -4.048824e-03 * 0.956940335732209 / 2.384e-06,
156     -5.42164e-04 * 0.956940335732209 / 2.384e-06, -3.2425e-05 * 0.956940335732209 / 2.384e-06,
157     3.033466836073424e-01,
158     1.662939224605090e+00,
159 
160 
161     -1.431e-06 * 0.970031253194544 / 2.384e-06, 9.9182e-05 * 0.970031253194544 / 2.384e-06,
162     4.62532e-04 * 0.970031253194544 / 2.384e-06, -1.573563e-03 * 0.970031253194544 / 2.384e-06,
163     3.3225536e-02 * 0.970031253194544 / 2.384e-06, 4.737377e-03 * 0.970031253194544 / 2.384e-06, 8.91685e-04 * 0.970031253194544 / 2.384e-06, 6.6280e-05 * 0.970031253194544 / 2.384e-06, /* 5 */
164     4.292e-06 * 0.970031253194544 / 2.384e-06, -1.3828e-05 * 0.970031253194544 / 2.384e-06,
165     6.61850e-04 * 0.970031253194544 / 2.384e-06, 8.487225e-03 * 0.970031253194544 / 2.384e-06,
166     -2.7073860e-02 * 0.970031253194544 / 2.384e-06, -4.174709e-03 * 0.970031253194544 / 2.384e-06,
167     -5.76973e-04 * 0.970031253194544 / 2.384e-06, -3.4809e-05 * 0.970031253194544 / 2.384e-06,
168     2.504869601913055e-01,
169     1.763842528696710e+00,
170 
171 
172     -1.431e-06 * 0.98078528040323 / 2.384e-06, 9.5367e-05 * 0.98078528040323 / 2.384e-06,
173     3.78609e-04 * 0.98078528040323 / 2.384e-06, -2.161503e-03 * 0.98078528040323 / 2.384e-06,
174     3.2754898e-02 * 0.98078528040323 / 2.384e-06, 4.752159e-03 * 0.98078528040323 / 2.384e-06, 8.66413e-04 * 0.98078528040323 / 2.384e-06, 6.2943e-05 * 0.98078528040323 / 2.384e-06, /* 4 */
175     3.815e-06 * 0.98078528040323 / 2.384e-06, -2.718e-05 * 0.98078528040323 / 2.384e-06,
176     5.22137e-04 * 0.98078528040323 / 2.384e-06, 7.703304e-03 * 0.98078528040323 / 2.384e-06,
177     -2.7815342e-02 * 0.98078528040323 / 2.384e-06, -4.290581e-03 * 0.98078528040323 / 2.384e-06,
178     -6.11782e-04 * 0.98078528040323 / 2.384e-06, -3.7670e-05 * 0.98078528040323 / 2.384e-06,
179     1.989123673796580e-01,
180     1.847759065022573e+00,
181 
182 
183     -1.907e-06 * 0.989176509964781 / 2.384e-06, 9.0122e-05 * 0.989176509964781 / 2.384e-06,
184     2.88486e-04 * 0.989176509964781 / 2.384e-06, -2.774239e-03 * 0.989176509964781 / 2.384e-06,
185     3.2248020e-02 * 0.989176509964781 / 2.384e-06, 4.748821e-03 * 0.989176509964781 / 2.384e-06, 8.38757e-04 * 0.989176509964781 / 2.384e-06, 5.9605e-05 * 0.989176509964781 / 2.384e-06, /* 3 */
186     3.338e-06 * 0.989176509964781 / 2.384e-06, -3.9577e-05 * 0.989176509964781 / 2.384e-06,
187     3.88145e-04 * 0.989176509964781 / 2.384e-06, 6.937027e-03 * 0.989176509964781 / 2.384e-06,
188     -2.8532982e-02 * 0.989176509964781 / 2.384e-06, -4.395962e-03 * 0.989176509964781 / 2.384e-06,
189     -6.46591e-04 * 0.989176509964781 / 2.384e-06, -4.0531e-05 * 0.989176509964781 / 2.384e-06,
190     1.483359875383474e-01,
191     1.913880671464418e+00,
192 
193 
194     -1.907e-06 * 0.995184726672197 / 2.384e-06, 8.4400e-05 * 0.995184726672197 / 2.384e-06,
195     1.91689e-04 * 0.995184726672197 / 2.384e-06, -3.411293e-03 * 0.995184726672197 / 2.384e-06,
196     3.1706810e-02 * 0.995184726672197 / 2.384e-06, 4.728317e-03 * 0.995184726672197 / 2.384e-06,
197     8.09669e-04 * 0.995184726672197 / 2.384e-06, 5.579e-05 * 0.995184726672197 / 2.384e-06,
198     3.338e-06 * 0.995184726672197 / 2.384e-06, -5.0545e-05 * 0.995184726672197 / 2.384e-06,
199     2.59876e-04 * 0.995184726672197 / 2.384e-06, 6.189346e-03 * 0.995184726672197 / 2.384e-06,
200     -2.9224873e-02 * 0.995184726672197 / 2.384e-06, -4.489899e-03 * 0.995184726672197 / 2.384e-06,
201     -6.80923e-04 * 0.995184726672197 / 2.384e-06, -4.3392e-05 * 0.995184726672197 / 2.384e-06,
202     9.849140335716425e-02,
203     1.961570560806461e+00,
204 
205 
206     -2.384e-06 * 0.998795456205172 / 2.384e-06, 7.7724e-05 * 0.998795456205172 / 2.384e-06,
207     8.8215e-05 * 0.998795456205172 / 2.384e-06, -4.072189e-03 * 0.998795456205172 / 2.384e-06,
208     3.1132698e-02 * 0.998795456205172 / 2.384e-06, 4.691124e-03 * 0.998795456205172 / 2.384e-06,
209     7.79152e-04 * 0.998795456205172 / 2.384e-06, 5.2929e-05 * 0.998795456205172 / 2.384e-06,
210     2.861e-06 * 0.998795456205172 / 2.384e-06, -6.0558e-05 * 0.998795456205172 / 2.384e-06,
211     1.37329e-04 * 0.998795456205172 / 2.384e-06, 5.462170e-03 * 0.998795456205172 / 2.384e-06,
212     -2.9890060e-02 * 0.998795456205172 / 2.384e-06, -4.570484e-03 * 0.998795456205172 / 2.384e-06,
213     -7.14302e-04 * 0.998795456205172 / 2.384e-06, -4.6253e-05 * 0.998795456205172 / 2.384e-06,
214     4.912684976946725e-02,
215     1.990369453344394e+00,
216 
217 
218     3.5780907e-02 * SQRT2 * 0.5 / 2.384e-06, 1.7876148e-02 * SQRT2 * 0.5 / 2.384e-06,
219     3.134727e-03 * SQRT2 * 0.5 / 2.384e-06, 2.457142e-03 * SQRT2 * 0.5 / 2.384e-06,
220     9.71317e-04 * SQRT2 * 0.5 / 2.384e-06, 2.18868e-04 * SQRT2 * 0.5 / 2.384e-06,
221     1.01566e-04 * SQRT2 * 0.5 / 2.384e-06, 1.3828e-05 * SQRT2 * 0.5 / 2.384e-06,
222 
223     3.0526638e-02 / 2.384e-06, 4.638195e-03 / 2.384e-06, 7.47204e-04 / 2.384e-06,
224     4.9591e-05 / 2.384e-06,
225     4.756451e-03 / 2.384e-06, 2.1458e-05 / 2.384e-06, -6.9618e-05 / 2.384e-06, /*    2.384e-06/2.384e-06 */
226 };
227 #endif
228 
229 
230 #define NS 12
231 #define NL 36
232 
233 static const FLOAT win[4][NL] = {
234     {
235      2.382191739347913e-13,
236      6.423305872147834e-13,
237      9.400849094049688e-13,
238      1.122435026096556e-12,
239      1.183840321267481e-12,
240      1.122435026096556e-12,
241      9.400849094049690e-13,
242      6.423305872147839e-13,
243      2.382191739347918e-13,
244 
245      5.456116108943412e-12,
246      4.878985199565852e-12,
247      4.240448995017367e-12,
248      3.559909094758252e-12,
249      2.858043359288075e-12,
250      2.156177623817898e-12,
251      1.475637723558783e-12,
252      8.371015190102974e-13,
253      2.599706096327376e-13,
254 
255      -5.456116108943412e-12,
256      -4.878985199565852e-12,
257      -4.240448995017367e-12,
258      -3.559909094758252e-12,
259      -2.858043359288076e-12,
260      -2.156177623817898e-12,
261      -1.475637723558783e-12,
262      -8.371015190102975e-13,
263      -2.599706096327376e-13,
264 
265      -2.382191739347923e-13,
266      -6.423305872147843e-13,
267      -9.400849094049696e-13,
268      -1.122435026096556e-12,
269      -1.183840321267481e-12,
270      -1.122435026096556e-12,
271      -9.400849094049694e-13,
272      -6.423305872147840e-13,
273      -2.382191739347918e-13,
274      },
275     {
276      2.382191739347913e-13,
277      6.423305872147834e-13,
278      9.400849094049688e-13,
279      1.122435026096556e-12,
280      1.183840321267481e-12,
281      1.122435026096556e-12,
282      9.400849094049688e-13,
283      6.423305872147841e-13,
284      2.382191739347918e-13,
285 
286      5.456116108943413e-12,
287      4.878985199565852e-12,
288      4.240448995017367e-12,
289      3.559909094758253e-12,
290      2.858043359288075e-12,
291      2.156177623817898e-12,
292      1.475637723558782e-12,
293      8.371015190102975e-13,
294      2.599706096327376e-13,
295 
296      -5.461314069809755e-12,
297      -4.921085770524055e-12,
298      -4.343405037091838e-12,
299      -3.732668368707687e-12,
300      -3.093523840190885e-12,
301      -2.430835727329465e-12,
302      -1.734679010007751e-12,
303      -9.748253656609281e-13,
304      -2.797435120168326e-13,
305 
306      0.000000000000000e+00,
307      0.000000000000000e+00,
308      0.000000000000000e+00,
309      0.000000000000000e+00,
310      0.000000000000000e+00,
311      0.000000000000000e+00,
312      -2.283748241799531e-13,
313      -4.037858874020686e-13,
314      -2.146547464825323e-13,
315      },
316     {
317      1.316524975873958e-01, /* win[SHORT_TYPE] */
318      4.142135623730950e-01,
319      7.673269879789602e-01,
320 
321      1.091308501069271e+00, /* tantab_l */
322      1.303225372841206e+00,
323      1.569685577117490e+00,
324      1.920982126971166e+00,
325      2.414213562373094e+00,
326      3.171594802363212e+00,
327      4.510708503662055e+00,
328      7.595754112725146e+00,
329      2.290376554843115e+01,
330 
331      0.98480775301220802032, /* cx */
332      0.64278760968653936292,
333      0.34202014332566882393,
334      0.93969262078590842791,
335      -0.17364817766693030343,
336      -0.76604444311897790243,
337      0.86602540378443870761,
338      0.500000000000000e+00,
339 
340      -5.144957554275265e-01, /* ca */
341      -4.717319685649723e-01,
342      -3.133774542039019e-01,
343      -1.819131996109812e-01,
344      -9.457419252642064e-02,
345      -4.096558288530405e-02,
346      -1.419856857247115e-02,
347      -3.699974673760037e-03,
348 
349      8.574929257125442e-01, /* cs */
350      8.817419973177052e-01,
351      9.496286491027329e-01,
352      9.833145924917901e-01,
353      9.955178160675857e-01,
354      9.991605581781475e-01,
355      9.998991952444470e-01,
356      9.999931550702802e-01,
357      },
358     {
359      0.000000000000000e+00,
360      0.000000000000000e+00,
361      0.000000000000000e+00,
362      0.000000000000000e+00,
363      0.000000000000000e+00,
364      0.000000000000000e+00,
365      2.283748241799531e-13,
366      4.037858874020686e-13,
367      2.146547464825323e-13,
368 
369      5.461314069809755e-12,
370      4.921085770524055e-12,
371      4.343405037091838e-12,
372      3.732668368707687e-12,
373      3.093523840190885e-12,
374      2.430835727329466e-12,
375      1.734679010007751e-12,
376      9.748253656609281e-13,
377      2.797435120168326e-13,
378 
379      -5.456116108943413e-12,
380      -4.878985199565852e-12,
381      -4.240448995017367e-12,
382      -3.559909094758253e-12,
383      -2.858043359288075e-12,
384      -2.156177623817898e-12,
385      -1.475637723558782e-12,
386      -8.371015190102975e-13,
387      -2.599706096327376e-13,
388 
389      -2.382191739347913e-13,
390      -6.423305872147834e-13,
391      -9.400849094049688e-13,
392      -1.122435026096556e-12,
393      -1.183840321267481e-12,
394      -1.122435026096556e-12,
395      -9.400849094049688e-13,
396      -6.423305872147841e-13,
397      -2.382191739347918e-13,
398      }
399 };
400 
401 #define tantab_l (win[SHORT_TYPE]+3)
402 #define cx (win[SHORT_TYPE]+12)
403 #define ca (win[SHORT_TYPE]+20)
404 #define cs (win[SHORT_TYPE]+28)
405 
406 /************************************************************************
407 *
408 * window_subband()
409 *
410 * PURPOSE:  Overlapping window on PCM samples
411 *
412 * SEMANTICS:
413 * 32 16-bit pcm samples are scaled to fractional 2's complement and
414 * concatenated to the end of the window buffer #x#. The updated window
415 * buffer #x# is then windowed by the analysis window #c# to produce the
416 * windowed sample #z#
417 *
418 ************************************************************************/
419 
420 /*
421  *      new IDCT routine written by Takehiro TOMINAGA
422  */
423 static const int order[] = {
424     0, 1, 16, 17, 8, 9, 24, 25, 4, 5, 20, 21, 12, 13, 28, 29,
425     2, 3, 18, 19, 10, 11, 26, 27, 6, 7, 22, 23, 14, 15, 30, 31
426 };
427 
428 
429 /* returns sum_j=0^31 a[j]*cos(PI*j*(k+1/2)/32), 0<=k<32 */
430 inline static void
window_subband(const sample_t * x1,FLOAT a[SBLIMIT])431 window_subband(const sample_t * x1, FLOAT a[SBLIMIT])
432 {
433     int     i;
434     FLOAT const *wp = enwindow + 10;
435 
436     const sample_t *x2 = &x1[238 - 14 - 286];
437 
438     for (i = -15; i < 0; i++) {
439         FLOAT   w, s, t;
440 
441         w = wp[-10];
442         s = x2[-224] * w;
443         t = x1[224] * w;
444         w = wp[-9];
445         s += x2[-160] * w;
446         t += x1[160] * w;
447         w = wp[-8];
448         s += x2[-96] * w;
449         t += x1[96] * w;
450         w = wp[-7];
451         s += x2[-32] * w;
452         t += x1[32] * w;
453         w = wp[-6];
454         s += x2[32] * w;
455         t += x1[-32] * w;
456         w = wp[-5];
457         s += x2[96] * w;
458         t += x1[-96] * w;
459         w = wp[-4];
460         s += x2[160] * w;
461         t += x1[-160] * w;
462         w = wp[-3];
463         s += x2[224] * w;
464         t += x1[-224] * w;
465 
466         w = wp[-2];
467         s += x1[-256] * w;
468         t -= x2[256] * w;
469         w = wp[-1];
470         s += x1[-192] * w;
471         t -= x2[192] * w;
472         w = wp[0];
473         s += x1[-128] * w;
474         t -= x2[128] * w;
475         w = wp[1];
476         s += x1[-64] * w;
477         t -= x2[64] * w;
478         w = wp[2];
479         s += x1[0] * w;
480         t -= x2[0] * w;
481         w = wp[3];
482         s += x1[64] * w;
483         t -= x2[-64] * w;
484         w = wp[4];
485         s += x1[128] * w;
486         t -= x2[-128] * w;
487         w = wp[5];
488         s += x1[192] * w;
489         t -= x2[-192] * w;
490 
491         /*
492          * this multiplyer could be removed, but it needs more 256 FLOAT data.
493          * thinking about the data cache performance, I think we should not
494          * use such a huge table. tt 2000/Oct/25
495          */
496         s *= wp[6];
497         w = t - s;
498         a[30 + i * 2] = t + s;
499         a[31 + i * 2] = wp[7] * w;
500         wp += 18;
501         x1--;
502         x2++;
503     }
504     {
505         FLOAT   s, t, u, v;
506         t = x1[-16] * wp[-10];
507         s = x1[-32] * wp[-2];
508         t += (x1[-48] - x1[16]) * wp[-9];
509         s += x1[-96] * wp[-1];
510         t += (x1[-80] + x1[48]) * wp[-8];
511         s += x1[-160] * wp[0];
512         t += (x1[-112] - x1[80]) * wp[-7];
513         s += x1[-224] * wp[1];
514         t += (x1[-144] + x1[112]) * wp[-6];
515         s -= x1[32] * wp[2];
516         t += (x1[-176] - x1[144]) * wp[-5];
517         s -= x1[96] * wp[3];
518         t += (x1[-208] + x1[176]) * wp[-4];
519         s -= x1[160] * wp[4];
520         t += (x1[-240] - x1[208]) * wp[-3];
521         s -= x1[224];
522 
523         u = s - t;
524         v = s + t;
525 
526         t = a[14];
527         s = a[15] - t;
528 
529         a[31] = v + t;  /* A0 */
530         a[30] = u + s;  /* A1 */
531         a[15] = u - s;  /* A2 */
532         a[14] = v - t;  /* A3 */
533     }
534     {
535         FLOAT   xr;
536         xr = a[28] - a[0];
537         a[0] += a[28];
538         a[28] = xr * wp[-2 * 18 + 7];
539         xr = a[29] - a[1];
540         a[1] += a[29];
541         a[29] = xr * wp[-2 * 18 + 7];
542 
543         xr = a[26] - a[2];
544         a[2] += a[26];
545         a[26] = xr * wp[-4 * 18 + 7];
546         xr = a[27] - a[3];
547         a[3] += a[27];
548         a[27] = xr * wp[-4 * 18 + 7];
549 
550         xr = a[24] - a[4];
551         a[4] += a[24];
552         a[24] = xr * wp[-6 * 18 + 7];
553         xr = a[25] - a[5];
554         a[5] += a[25];
555         a[25] = xr * wp[-6 * 18 + 7];
556 
557         xr = a[22] - a[6];
558         a[6] += a[22];
559         a[22] = xr * SQRT2;
560         xr = a[23] - a[7];
561         a[7] += a[23];
562         a[23] = xr * SQRT2 - a[7];
563         a[7] -= a[6];
564         a[22] -= a[7];
565         a[23] -= a[22];
566 
567         xr = a[6];
568         a[6] = a[31] - xr;
569         a[31] = a[31] + xr;
570         xr = a[7];
571         a[7] = a[30] - xr;
572         a[30] = a[30] + xr;
573         xr = a[22];
574         a[22] = a[15] - xr;
575         a[15] = a[15] + xr;
576         xr = a[23];
577         a[23] = a[14] - xr;
578         a[14] = a[14] + xr;
579 
580         xr = a[20] - a[8];
581         a[8] += a[20];
582         a[20] = xr * wp[-10 * 18 + 7];
583         xr = a[21] - a[9];
584         a[9] += a[21];
585         a[21] = xr * wp[-10 * 18 + 7];
586 
587         xr = a[18] - a[10];
588         a[10] += a[18];
589         a[18] = xr * wp[-12 * 18 + 7];
590         xr = a[19] - a[11];
591         a[11] += a[19];
592         a[19] = xr * wp[-12 * 18 + 7];
593 
594         xr = a[16] - a[12];
595         a[12] += a[16];
596         a[16] = xr * wp[-14 * 18 + 7];
597         xr = a[17] - a[13];
598         a[13] += a[17];
599         a[17] = xr * wp[-14 * 18 + 7];
600 
601         xr = -a[20] + a[24];
602         a[20] += a[24];
603         a[24] = xr * wp[-12 * 18 + 7];
604         xr = -a[21] + a[25];
605         a[21] += a[25];
606         a[25] = xr * wp[-12 * 18 + 7];
607 
608         xr = a[4] - a[8];
609         a[4] += a[8];
610         a[8] = xr * wp[-12 * 18 + 7];
611         xr = a[5] - a[9];
612         a[5] += a[9];
613         a[9] = xr * wp[-12 * 18 + 7];
614 
615         xr = a[0] - a[12];
616         a[0] += a[12];
617         a[12] = xr * wp[-4 * 18 + 7];
618         xr = a[1] - a[13];
619         a[1] += a[13];
620         a[13] = xr * wp[-4 * 18 + 7];
621         xr = a[16] - a[28];
622         a[16] += a[28];
623         a[28] = xr * wp[-4 * 18 + 7];
624         xr = -a[17] + a[29];
625         a[17] += a[29];
626         a[29] = xr * wp[-4 * 18 + 7];
627 
628         xr = SQRT2 * (a[2] - a[10]);
629         a[2] += a[10];
630         a[10] = xr;
631         xr = SQRT2 * (a[3] - a[11]);
632         a[3] += a[11];
633         a[11] = xr;
634         xr = SQRT2 * (-a[18] + a[26]);
635         a[18] += a[26];
636         a[26] = xr - a[18];
637         xr = SQRT2 * (-a[19] + a[27]);
638         a[19] += a[27];
639         a[27] = xr - a[19];
640 
641         xr = a[2];
642         a[19] -= a[3];
643         a[3] -= xr;
644         a[2] = a[31] - xr;
645         a[31] += xr;
646         xr = a[3];
647         a[11] -= a[19];
648         a[18] -= xr;
649         a[3] = a[30] - xr;
650         a[30] += xr;
651         xr = a[18];
652         a[27] -= a[11];
653         a[19] -= xr;
654         a[18] = a[15] - xr;
655         a[15] += xr;
656 
657         xr = a[19];
658         a[10] -= xr;
659         a[19] = a[14] - xr;
660         a[14] += xr;
661         xr = a[10];
662         a[11] -= xr;
663         a[10] = a[23] - xr;
664         a[23] += xr;
665         xr = a[11];
666         a[26] -= xr;
667         a[11] = a[22] - xr;
668         a[22] += xr;
669         xr = a[26];
670         a[27] -= xr;
671         a[26] = a[7] - xr;
672         a[7] += xr;
673 
674         xr = a[27];
675         a[27] = a[6] - xr;
676         a[6] += xr;
677 
678         xr = SQRT2 * (a[0] - a[4]);
679         a[0] += a[4];
680         a[4] = xr;
681         xr = SQRT2 * (a[1] - a[5]);
682         a[1] += a[5];
683         a[5] = xr;
684         xr = SQRT2 * (a[16] - a[20]);
685         a[16] += a[20];
686         a[20] = xr;
687         xr = SQRT2 * (a[17] - a[21]);
688         a[17] += a[21];
689         a[21] = xr;
690 
691         xr = -SQRT2 * (a[8] - a[12]);
692         a[8] += a[12];
693         a[12] = xr - a[8];
694         xr = -SQRT2 * (a[9] - a[13]);
695         a[9] += a[13];
696         a[13] = xr - a[9];
697         xr = -SQRT2 * (a[25] - a[29]);
698         a[25] += a[29];
699         a[29] = xr - a[25];
700         xr = -SQRT2 * (a[24] + a[28]);
701         a[24] -= a[28];
702         a[28] = xr - a[24];
703 
704         xr = a[24] - a[16];
705         a[24] = xr;
706         xr = a[20] - xr;
707         a[20] = xr;
708         xr = a[28] - xr;
709         a[28] = xr;
710 
711         xr = a[25] - a[17];
712         a[25] = xr;
713         xr = a[21] - xr;
714         a[21] = xr;
715         xr = a[29] - xr;
716         a[29] = xr;
717 
718         xr = a[17] - a[1];
719         a[17] = xr;
720         xr = a[9] - xr;
721         a[9] = xr;
722         xr = a[25] - xr;
723         a[25] = xr;
724         xr = a[5] - xr;
725         a[5] = xr;
726         xr = a[21] - xr;
727         a[21] = xr;
728         xr = a[13] - xr;
729         a[13] = xr;
730         xr = a[29] - xr;
731         a[29] = xr;
732 
733         xr = a[1] - a[0];
734         a[1] = xr;
735         xr = a[16] - xr;
736         a[16] = xr;
737         xr = a[17] - xr;
738         a[17] = xr;
739         xr = a[8] - xr;
740         a[8] = xr;
741         xr = a[9] - xr;
742         a[9] = xr;
743         xr = a[24] - xr;
744         a[24] = xr;
745         xr = a[25] - xr;
746         a[25] = xr;
747         xr = a[4] - xr;
748         a[4] = xr;
749         xr = a[5] - xr;
750         a[5] = xr;
751         xr = a[20] - xr;
752         a[20] = xr;
753         xr = a[21] - xr;
754         a[21] = xr;
755         xr = a[12] - xr;
756         a[12] = xr;
757         xr = a[13] - xr;
758         a[13] = xr;
759         xr = a[28] - xr;
760         a[28] = xr;
761         xr = a[29] - xr;
762         a[29] = xr;
763 
764         xr = a[0];
765         a[0] += a[31];
766         a[31] -= xr;
767         xr = a[1];
768         a[1] += a[30];
769         a[30] -= xr;
770         xr = a[16];
771         a[16] += a[15];
772         a[15] -= xr;
773         xr = a[17];
774         a[17] += a[14];
775         a[14] -= xr;
776         xr = a[8];
777         a[8] += a[23];
778         a[23] -= xr;
779         xr = a[9];
780         a[9] += a[22];
781         a[22] -= xr;
782         xr = a[24];
783         a[24] += a[7];
784         a[7] -= xr;
785         xr = a[25];
786         a[25] += a[6];
787         a[6] -= xr;
788         xr = a[4];
789         a[4] += a[27];
790         a[27] -= xr;
791         xr = a[5];
792         a[5] += a[26];
793         a[26] -= xr;
794         xr = a[20];
795         a[20] += a[11];
796         a[11] -= xr;
797         xr = a[21];
798         a[21] += a[10];
799         a[10] -= xr;
800         xr = a[12];
801         a[12] += a[19];
802         a[19] -= xr;
803         xr = a[13];
804         a[13] += a[18];
805         a[18] -= xr;
806         xr = a[28];
807         a[28] += a[3];
808         a[3] -= xr;
809         xr = a[29];
810         a[29] += a[2];
811         a[2] -= xr;
812     }
813 
814 }
815 
816 
817 /*-------------------------------------------------------------------*/
818 /*                                                                   */
819 /*   Function: Calculation of the MDCT                               */
820 /*   In the case of long blocks (type 0,1,3) there are               */
821 /*   36 coefficents in the time domain and 18 in the frequency       */
822 /*   domain.                                                         */
823 /*   In the case of short blocks (type 2) there are 3                */
824 /*   transformations with short length. This leads to 12 coefficents */
825 /*   in the time and 6 in the frequency domain. In this case the     */
826 /*   results are stored side by side in the vector out[].            */
827 /*                                                                   */
828 /*   New layer3                                                      */
829 /*                                                                   */
830 /*-------------------------------------------------------------------*/
831 
832 inline static void
mdct_short(FLOAT * inout)833 mdct_short(FLOAT * inout)
834 {
835     int     l;
836     for (l = 0; l < 3; l++) {
837         FLOAT   tc0, tc1, tc2, ts0, ts1, ts2;
838 
839         ts0 = inout[2 * 3] * win[SHORT_TYPE][0] - inout[5 * 3];
840         tc0 = inout[0 * 3] * win[SHORT_TYPE][2] - inout[3 * 3];
841         tc1 = ts0 + tc0;
842         tc2 = ts0 - tc0;
843 
844         ts0 = inout[5 * 3] * win[SHORT_TYPE][0] + inout[2 * 3];
845         tc0 = inout[3 * 3] * win[SHORT_TYPE][2] + inout[0 * 3];
846         ts1 = ts0 + tc0;
847         ts2 = -ts0 + tc0;
848 
849         tc0 = (inout[1 * 3] * win[SHORT_TYPE][1] - inout[4 * 3]) * 2.069978111953089e-11; /* tritab_s[1] */
850         ts0 = (inout[4 * 3] * win[SHORT_TYPE][1] + inout[1 * 3]) * 2.069978111953089e-11; /* tritab_s[1] */
851 
852         inout[3 * 0] = tc1 * 1.907525191737280e-11 /* tritab_s[2] */  + tc0;
853         inout[3 * 5] = -ts1 * 1.907525191737280e-11 /* tritab_s[0] */  + ts0;
854 
855         tc2 = tc2 * 0.86602540378443870761 * 1.907525191737281e-11 /* tritab_s[2] */ ;
856         ts1 = ts1 * 0.5 * 1.907525191737281e-11 + ts0;
857         inout[3 * 1] = tc2 - ts1;
858         inout[3 * 2] = tc2 + ts1;
859 
860         tc1 = tc1 * 0.5 * 1.907525191737281e-11 - tc0;
861         ts2 = ts2 * 0.86602540378443870761 * 1.907525191737281e-11 /* tritab_s[0] */ ;
862         inout[3 * 3] = tc1 + ts2;
863         inout[3 * 4] = tc1 - ts2;
864 
865         inout++;
866     }
867 }
868 
869 inline static void
mdct_long(FLOAT * out,FLOAT const * in)870 mdct_long(FLOAT * out, FLOAT const *in)
871 {
872     FLOAT   ct, st;
873     {
874         FLOAT   tc1, tc2, tc3, tc4, ts5, ts6, ts7, ts8;
875         /* 1,2, 5,6, 9,10, 13,14, 17 */
876         tc1 = in[17] - in[9];
877         tc3 = in[15] - in[11];
878         tc4 = in[14] - in[12];
879         ts5 = in[0] + in[8];
880         ts6 = in[1] + in[7];
881         ts7 = in[2] + in[6];
882         ts8 = in[3] + in[5];
883 
884         out[17] = (ts5 + ts7 - ts8) - (ts6 - in[4]);
885         st = (ts5 + ts7 - ts8) * cx[7] + (ts6 - in[4]);
886         ct = (tc1 - tc3 - tc4) * cx[6];
887         out[5] = ct + st;
888         out[6] = ct - st;
889 
890         tc2 = (in[16] - in[10]) * cx[6];
891         ts6 = ts6 * cx[7] + in[4];
892         ct = tc1 * cx[0] + tc2 + tc3 * cx[1] + tc4 * cx[2];
893         st = -ts5 * cx[4] + ts6 - ts7 * cx[5] + ts8 * cx[3];
894         out[1] = ct + st;
895         out[2] = ct - st;
896 
897         ct = tc1 * cx[1] - tc2 - tc3 * cx[2] + tc4 * cx[0];
898         st = -ts5 * cx[5] + ts6 - ts7 * cx[3] + ts8 * cx[4];
899         out[9] = ct + st;
900         out[10] = ct - st;
901 
902         ct = tc1 * cx[2] - tc2 + tc3 * cx[0] - tc4 * cx[1];
903         st = ts5 * cx[3] - ts6 + ts7 * cx[4] - ts8 * cx[5];
904         out[13] = ct + st;
905         out[14] = ct - st;
906     }
907     {
908         FLOAT   ts1, ts2, ts3, ts4, tc5, tc6, tc7, tc8;
909 
910         ts1 = in[8] - in[0];
911         ts3 = in[6] - in[2];
912         ts4 = in[5] - in[3];
913         tc5 = in[17] + in[9];
914         tc6 = in[16] + in[10];
915         tc7 = in[15] + in[11];
916         tc8 = in[14] + in[12];
917 
918         out[0] = (tc5 + tc7 + tc8) + (tc6 + in[13]);
919         ct = (tc5 + tc7 + tc8) * cx[7] - (tc6 + in[13]);
920         st = (ts1 - ts3 + ts4) * cx[6];
921         out[11] = ct + st;
922         out[12] = ct - st;
923 
924         ts2 = (in[7] - in[1]) * cx[6];
925         tc6 = in[13] - tc6 * cx[7];
926         ct = tc5 * cx[3] - tc6 + tc7 * cx[4] + tc8 * cx[5];
927         st = ts1 * cx[2] + ts2 + ts3 * cx[0] + ts4 * cx[1];
928         out[3] = ct + st;
929         out[4] = ct - st;
930 
931         ct = -tc5 * cx[5] + tc6 - tc7 * cx[3] - tc8 * cx[4];
932         st = ts1 * cx[1] + ts2 - ts3 * cx[2] - ts4 * cx[0];
933         out[7] = ct + st;
934         out[8] = ct - st;
935 
936         ct = -tc5 * cx[4] + tc6 - tc7 * cx[5] - tc8 * cx[3];
937         st = ts1 * cx[0] - ts2 + ts3 * cx[1] - ts4 * cx[2];
938         out[15] = ct + st;
939         out[16] = ct - st;
940     }
941 }
942 
943 
944 void
mdct_sub48(lame_internal_flags * gfc,const sample_t * w0,const sample_t * w1)945 mdct_sub48(lame_internal_flags * gfc, const sample_t * w0, const sample_t * w1)
946 {
947     SessionConfig_t const *const cfg = &gfc->cfg;
948     EncStateVar_t *const esv = &gfc->sv_enc;
949     int     gr, k, ch;
950     const sample_t *wk;
951 
952     wk = w0 + 286;
953     /* thinking cache performance, ch->gr loop is better than gr->ch loop */
954     for (ch = 0; ch < cfg->channels_out; ch++) {
955         for (gr = 0; gr < cfg->mode_gr; gr++) {
956             int     band;
957             gr_info *const gi = &(gfc->l3_side.tt[gr][ch]);
958             FLOAT  *mdct_enc = gi->xr;
959             FLOAT  *samp = esv->sb_sample[ch][1 - gr][0];
960 
961             for (k = 0; k < 18 / 2; k++) {
962                 window_subband(wk, samp);
963                 window_subband(wk + 32, samp + 32);
964                 samp += 64;
965                 wk += 64;
966                 /*
967                  * Compensate for inversion in the analysis filter
968                  */
969                 for (band = 1; band < 32; band += 2) {
970                     samp[band - 32] *= -1;
971                 }
972             }
973 
974             /*
975              * Perform imdct of 18 previous subband samples
976              * + 18 current subband samples
977              */
978             for (band = 0; band < 32; band++, mdct_enc += 18) {
979                 int     type = gi->block_type;
980                 FLOAT const *const band0 = esv->sb_sample[ch][gr][0] + order[band];
981                 FLOAT  *const band1 = esv->sb_sample[ch][1 - gr][0] + order[band];
982                 if (gi->mixed_block_flag && band < 2)
983                     type = 0;
984                 if (esv->amp_filter[band] < 1e-12) {
985                     memset(mdct_enc, 0, 18 * sizeof(FLOAT));
986                 }
987                 else {
988                     if (esv->amp_filter[band] < 1.0) {
989                         for (k = 0; k < 18; k++)
990                             band1[k * 32] *= esv->amp_filter[band];
991                     }
992                     if (type == SHORT_TYPE) {
993                         for (k = -NS / 4; k < 0; k++) {
994                             FLOAT const w = win[SHORT_TYPE][k + 3];
995                             mdct_enc[k * 3 + 9] = band0[(9 + k) * 32] * w - band0[(8 - k) * 32];
996                             mdct_enc[k * 3 + 18] = band0[(14 - k) * 32] * w + band0[(15 + k) * 32];
997                             mdct_enc[k * 3 + 10] = band0[(15 + k) * 32] * w - band0[(14 - k) * 32];
998                             mdct_enc[k * 3 + 19] = band1[(2 - k) * 32] * w + band1[(3 + k) * 32];
999                             mdct_enc[k * 3 + 11] = band1[(3 + k) * 32] * w - band1[(2 - k) * 32];
1000                             mdct_enc[k * 3 + 20] = band1[(8 - k) * 32] * w + band1[(9 + k) * 32];
1001                         }
1002                         mdct_short(mdct_enc);
1003                     }
1004                     else {
1005                         FLOAT   work[18];
1006                         for (k = -NL / 4; k < 0; k++) {
1007                             FLOAT   a, b;
1008                             a = win[type][k + 27] * band1[(k + 9) * 32]
1009                                 + win[type][k + 36] * band1[(8 - k) * 32];
1010                             b = win[type][k + 9] * band0[(k + 9) * 32]
1011                                 - win[type][k + 18] * band0[(8 - k) * 32];
1012                             work[k + 9] = a - b * tantab_l[k + 9];
1013                             work[k + 18] = a * tantab_l[k + 9] + b;
1014                         }
1015 
1016                         mdct_long(mdct_enc, work);
1017                     }
1018                 }
1019                 /*
1020                  * Perform aliasing reduction butterfly
1021                  */
1022                 if (type != SHORT_TYPE && band != 0) {
1023                     for (k = 7; k >= 0; --k) {
1024                         FLOAT   bu, bd;
1025                         bu = mdct_enc[k] * ca[k] + mdct_enc[-1 - k] * cs[k];
1026                         bd = mdct_enc[k] * cs[k] - mdct_enc[-1 - k] * ca[k];
1027 
1028                         mdct_enc[-1 - k] = bu;
1029                         mdct_enc[k] = bd;
1030                     }
1031                 }
1032             }
1033         }
1034         wk = w1 + 286;
1035         if (cfg->mode_gr == 1) {
1036             memcpy(esv->sb_sample[ch][0], esv->sb_sample[ch][1], 576 * sizeof(FLOAT));
1037         }
1038     }
1039 }
1040