2 * MP3 window subband -> subband filtering -> mdct routine
4 * Copyright (c) 1999-2000 Takehiro Tominaga
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.
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.
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.
24 * Special Thanks to Patrick De Smet for your advices.
27 /* $Id: newmdct.c,v 1.39 2011/05/07 16:05:17 rbrito Exp $ */
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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 */
233 static const FLOAT win[4][NL] = {
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,
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,
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,
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,
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,
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,
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,
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,
317 1.316524975873958e-01, /* win[SHORT_TYPE] */
318 4.142135623730950e-01,
319 7.673269879789602e-01,
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,
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,
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,
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,
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,
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,
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,
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,
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)
406 /************************************************************************
410 * PURPOSE: Overlapping window on PCM samples
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#
418 ************************************************************************/
421 * new IDCT routine written by Takehiro TOMINAGA
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
429 /* returns sum_j=0^31 a[j]*cos(PI*j*(k+1/2)/32), 0<=k<32 */
431 window_subband(const sample_t * x1, FLOAT a[SBLIMIT])
434 FLOAT const *wp = enwindow + 10;
436 const sample_t *x2 = &x1[238 - 14 - 286];
438 for (i = -15; i < 0; i++) {
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
498 a[30 + i * 2] = t + s;
499 a[31 + i * 2] = wp[7] * w;
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];
516 t += (x1[-176] - x1[144]) * wp[-5];
518 t += (x1[-208] + x1[176]) * wp[-4];
519 s -= x1[160] * wp[4];
520 t += (x1[-240] - x1[208]) * wp[-3];
529 a[31] = v + t; /* A0 */
530 a[30] = u + s; /* A1 */
531 a[15] = u - s; /* A2 */
532 a[14] = v - t; /* A3 */
538 a[28] = xr * wp[-2 * 18 + 7];
541 a[29] = xr * wp[-2 * 18 + 7];
545 a[26] = xr * wp[-4 * 18 + 7];
548 a[27] = xr * wp[-4 * 18 + 7];
552 a[24] = xr * wp[-6 * 18 + 7];
555 a[25] = xr * wp[-6 * 18 + 7];
562 a[23] = xr * SQRT2 - a[7];
582 a[20] = xr * wp[-10 * 18 + 7];
585 a[21] = xr * wp[-10 * 18 + 7];
589 a[18] = xr * wp[-12 * 18 + 7];
592 a[19] = xr * wp[-12 * 18 + 7];
596 a[16] = xr * wp[-14 * 18 + 7];
599 a[17] = xr * wp[-14 * 18 + 7];
603 a[24] = xr * wp[-12 * 18 + 7];
606 a[25] = xr * wp[-12 * 18 + 7];
610 a[8] = xr * wp[-12 * 18 + 7];
613 a[9] = xr * wp[-12 * 18 + 7];
617 a[12] = xr * wp[-4 * 18 + 7];
620 a[13] = xr * wp[-4 * 18 + 7];
623 a[28] = xr * wp[-4 * 18 + 7];
626 a[29] = xr * wp[-4 * 18 + 7];
628 xr = SQRT2 * (a[2] - a[10]);
631 xr = SQRT2 * (a[3] - a[11]);
634 xr = SQRT2 * (-a[18] + a[26]);
637 xr = SQRT2 * (-a[19] + a[27]);
678 xr = SQRT2 * (a[0] - a[4]);
681 xr = SQRT2 * (a[1] - a[5]);
684 xr = SQRT2 * (a[16] - a[20]);
687 xr = SQRT2 * (a[17] - a[21]);
691 xr = -SQRT2 * (a[8] - a[12]);
694 xr = -SQRT2 * (a[9] - a[13]);
697 xr = -SQRT2 * (a[25] - a[29]);
700 xr = -SQRT2 * (a[24] + a[28]);
817 /*-------------------------------------------------------------------*/
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 */
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[]. */
830 /*-------------------------------------------------------------------*/
833 mdct_short(FLOAT * inout)
836 for (l = 0; l < 3; l++) {
837 FLOAT tc0, tc1, tc2, ts0, ts1, ts2;
839 ts0 = inout[2 * 3] * win[SHORT_TYPE][0] - inout[5 * 3];
840 tc0 = inout[0 * 3] * win[SHORT_TYPE][2] - inout[3 * 3];
844 ts0 = inout[5 * 3] * win[SHORT_TYPE][0] + inout[2 * 3];
845 tc0 = inout[3 * 3] * win[SHORT_TYPE][2] + inout[0 * 3];
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] */
852 inout[3 * 0] = tc1 * 1.907525191737280e-11 /* tritab_s[2] */ + tc0;
853 inout[3 * 5] = -ts1 * 1.907525191737280e-11 /* tritab_s[0] */ + ts0;
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;
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;
870 mdct_long(FLOAT * out, FLOAT const *in)
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];
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];
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];
897 ct = tc1 * cx[1] - tc2 - tc3 * cx[2] + tc4 * cx[0];
898 st = -ts5 * cx[5] + ts6 - ts7 * cx[3] + ts8 * cx[4];
902 ct = tc1 * cx[2] - tc2 + tc3 * cx[0] - tc4 * cx[1];
903 st = ts5 * cx[3] - ts6 + ts7 * cx[4] - ts8 * cx[5];
908 FLOAT ts1, ts2, ts3, ts4, tc5, tc6, tc7, tc8;
913 tc5 = in[17] + in[9];
914 tc6 = in[16] + in[10];
915 tc7 = in[15] + in[11];
916 tc8 = in[14] + in[12];
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];
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];
931 ct = -tc5 * cx[5] + tc6 - tc7 * cx[3] - tc8 * cx[4];
932 st = ts1 * cx[1] + ts2 - ts3 * cx[2] - ts4 * cx[0];
936 ct = -tc5 * cx[4] + tc6 - tc7 * cx[5] - tc8 * cx[3];
937 st = ts1 * cx[0] - ts2 + ts3 * cx[1] - ts4 * cx[2];
945 mdct_sub48(lame_internal_flags * gfc, const sample_t * w0, const sample_t * w1)
947 SessionConfig_t const *const cfg = &gfc->cfg;
948 EncStateVar_t *const esv = &gfc->sv_enc;
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++) {
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];
961 for (k = 0; k < 18 / 2; k++) {
962 window_subband(wk, samp);
963 window_subband(wk + 32, samp + 32);
967 * Compensate for inversion in the analysis filter
969 for (band = 1; band < 32; band += 2) {
970 samp[band - 32] *= -1;
975 * Perform imdct of 18 previous subband samples
976 * + 18 current subband samples
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)
984 if (esv->amp_filter[band] < 1e-12) {
985 memset(mdct_enc, 0, 18 * sizeof(FLOAT));
988 if (esv->amp_filter[band] < 1.0) {
989 for (k = 0; k < 18; k++)
990 band1[k * 32] *= esv->amp_filter[band];
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];
1002 mdct_short(mdct_enc);
1006 for (k = -NL / 4; k < 0; k++) {
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;
1016 mdct_long(mdct_enc, work);
1020 * Perform aliasing reduction butterfly
1022 if (type != SHORT_TYPE && band != 0) {
1023 for (k = 7; k >= 0; --k) {
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];
1028 mdct_enc[-1 - k] = bu;
1035 if (cfg->mode_gr == 1) {
1036 memcpy(esv->sb_sample[ch][0], esv->sb_sample[ch][1], 576 * sizeof(FLOAT));