2 * MP3 window subband -> subband filtering -> mdct routine
4 * Copyright (c) 1999 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.2 2006/02/09 16:56:23 kramm Exp $ */
30 #include "config_static.h"
40 #define SCALE (32768.0/ 2.384e-06)
42 #ifndef USE_GOGO_SUBBAND
43 static const FLOAT8 enwindow
[] =
45 -4.77e-07*0.740951125354959/2.384e-06, 1.03951e-04*0.740951125354959/2.384e-06, 9.53674e-04*0.740951125354959/2.384e-06, 2.841473e-03*0.740951125354959/2.384e-06,
46 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*/
47 1.2398e-05*0.740951125354959/2.384e-06, 1.91212e-04*0.740951125354959/2.384e-06, 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, -2.47478e-04*0.740951125354959/2.384e-06, -1.4782e-05*0.740951125354959/2.384e-06,
49 9.063471690191471e-01,
50 1.960342806591213e-01,
53 -4.77e-07*0.773010453362737/2.384e-06, 1.05858e-04*0.773010453362737/2.384e-06, 9.30786e-04*0.773010453362737/2.384e-06, 2.521515e-03*0.773010453362737/2.384e-06,
54 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*/
55 1.1444e-05*0.773010453362737/2.384e-06, 1.65462e-04*0.773010453362737/2.384e-06, 2.110004e-03*0.773010453362737/2.384e-06,1.6112804e-02*0.773010453362737/2.384e-06,
56 -1.9634247e-02*0.773010453362737/2.384e-06,-2.803326e-03*0.773010453362737/2.384e-06, -2.77042e-04*0.773010453362737/2.384e-06, -1.6689e-05*0.773010453362737/2.384e-06,
57 8.206787908286602e-01,
58 3.901806440322567e-01,
61 -4.77e-07*0.803207531480645/2.384e-06, 1.07288e-04*0.803207531480645/2.384e-06, 9.02653e-04*0.803207531480645/2.384e-06, 2.174854e-03*0.803207531480645/2.384e-06,
62 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*/
63 1.0014e-05*0.803207531480645/2.384e-06, 1.40190e-04*0.803207531480645/2.384e-06, 1.937389e-03*0.803207531480645/2.384e-06,1.5233517e-02*0.803207531480645/2.384e-06,
64 -2.0506859e-02*0.803207531480645/2.384e-06,-2.974033e-03*0.803207531480645/2.384e-06, -3.07560e-04*0.803207531480645/2.384e-06, -1.8120e-05*0.803207531480645/2.384e-06,
65 7.416505462720353e-01,
66 5.805693545089249e-01,
69 -4.77e-07*0.831469612302545/2.384e-06, 1.08242e-04*0.831469612302545/2.384e-06, 8.68797e-04*0.831469612302545/2.384e-06, 1.800537e-03*0.831469612302545/2.384e-06,
70 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*/
71 9.060e-06*0.831469612302545/2.384e-06, 1.16348e-04*0.831469612302545/2.384e-06, 1.766682e-03*0.831469612302545/2.384e-06,1.4358521e-02*0.831469612302545/2.384e-06,
72 -2.1372318e-02*0.831469612302545/2.384e-06, -3.14188e-03*0.831469612302545/2.384e-06, -3.39031e-04*0.831469612302545/2.384e-06, -1.9550e-05*0.831469612302545/2.384e-06,
73 6.681786379192989e-01,
74 7.653668647301797e-01,
77 -4.77e-07*0.857728610000272/2.384e-06, 1.08719e-04*0.857728610000272/2.384e-06, 8.29220e-04*0.857728610000272/2.384e-06, 1.399517e-03*0.857728610000272/2.384e-06,
78 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*/
79 8.106e-06*0.857728610000272/2.384e-06, 9.3937e-05*0.857728610000272/2.384e-06, 1.597881e-03*0.857728610000272/2.384e-06,1.3489246e-02*0.857728610000272/2.384e-06,
80 -2.2228718e-02*0.857728610000272/2.384e-06,-3.306866e-03*0.857728610000272/2.384e-06, -3.71456e-04*0.857728610000272/2.384e-06, -2.1458e-05*0.857728610000272/2.384e-06,
81 5.993769336819237e-01,
82 9.427934736519954e-01,
85 -4.77e-07*0.881921264348355/2.384e-06, 1.08719e-04*0.881921264348355/2.384e-06, 7.8392e-04*0.881921264348355/2.384e-06, 9.71317e-04*0.881921264348355/2.384e-06,
86 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*/
87 7.629e-06*0.881921264348355/2.384e-06, 7.2956e-05*0.881921264348355/2.384e-06, 1.432419e-03*0.881921264348355/2.384e-06,1.2627602e-02*0.881921264348355/2.384e-06,
88 -2.3074150e-02*0.881921264348355/2.384e-06,-3.467083e-03*0.881921264348355/2.384e-06, -4.04358e-04*0.881921264348355/2.384e-06, -2.3365e-05*0.881921264348355/2.384e-06,
89 5.345111359507916e-01,
90 1.111140466039205e+00,
93 -9.54e-07*0.903989293123443/2.384e-06, 1.08242e-04*0.903989293123443/2.384e-06, 7.31945e-04*0.903989293123443/2.384e-06, 5.15938e-04*0.903989293123443/2.384e-06,
94 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*/
95 6.676e-06*0.903989293123443/2.384e-06, 5.2929e-05*0.903989293123443/2.384e-06, 1.269817e-03*0.903989293123443/2.384e-06,1.1775017e-02*0.903989293123443/2.384e-06,
96 -2.3907185e-02*0.903989293123443/2.384e-06,-3.622532e-03*0.903989293123443/2.384e-06, -4.38213e-04*0.903989293123443/2.384e-06, -2.5272e-05*0.903989293123443/2.384e-06,
97 4.729647758913199e-01,
98 1.268786568327291e+00,
101 -9.54e-07*0.92387953251128675613/2.384e-06, 1.06812e-04*0.92387953251128675613/2.384e-06, 6.74248e-04*0.92387953251128675613/2.384e-06, 3.3379e-05*0.92387953251128675613/2.384e-06,
102 3.4412861e-02*0.92387953251128675613/2.384e-06, 4.573822e-03*0.92387953251128675613/2.384e-06, 9.54151e-04*0.92387953251128675613/2.384e-06, 7.6771e-05*0.92387953251128675613/2.384e-06,
103 6.199e-06*0.92387953251128675613/2.384e-06, 3.4332e-05*0.92387953251128675613/2.384e-06, 1.111031e-03*0.92387953251128675613/2.384e-06,1.0933399e-02*0.92387953251128675613/2.384e-06,
104 -2.4725437e-02*0.92387953251128675613/2.384e-06,-3.771782e-03*0.92387953251128675613/2.384e-06, -4.72546e-04*0.92387953251128675613/2.384e-06, -2.7657e-05*0.92387953251128675613/2.384e-06,
105 4.1421356237309504879e-01, /* tan(PI/8) */
106 1.414213562373095e+00,
109 -9.54e-07*0.941544065183021/2.384e-06, 1.05381e-04*0.941544065183021/2.384e-06, 6.10352e-04*0.941544065183021/2.384e-06, -4.75883e-04*0.941544065183021/2.384e-06,
110 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*/
111 5.245e-06*0.941544065183021/2.384e-06, 1.7166e-05*0.941544065183021/2.384e-06, 9.56535e-04*0.941544065183021/2.384e-06,1.0103703e-02*0.941544065183021/2.384e-06,
112 -2.5527000e-02*0.941544065183021/2.384e-06,-3.914356e-03*0.941544065183021/2.384e-06, -5.07355e-04*0.941544065183021/2.384e-06, -3.0041e-05*0.941544065183021/2.384e-06,
113 3.578057213145241e-01,
114 1.546020906725474e+00,
117 -9.54e-07*0.956940335732209/2.384e-06, 1.02520e-04*0.956940335732209/2.384e-06, 5.39303e-04*0.956940335732209/2.384e-06,-1.011848e-03*0.956940335732209/2.384e-06,
118 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*/
119 4.768e-06*0.956940335732209/2.384e-06, 9.54e-07*0.956940335732209/2.384e-06, 8.06808e-04*0.956940335732209/2.384e-06, 9.287834e-03*0.956940335732209/2.384e-06,
120 -2.6310921e-02*0.956940335732209/2.384e-06,-4.048824e-03*0.956940335732209/2.384e-06, -5.42164e-04*0.956940335732209/2.384e-06, -3.2425e-05*0.956940335732209/2.384e-06,
121 3.033466836073424e-01,
122 1.662939224605090e+00,
125 -1.431e-06*0.970031253194544/2.384e-06, 9.9182e-05*0.970031253194544/2.384e-06, 4.62532e-04*0.970031253194544/2.384e-06,-1.573563e-03*0.970031253194544/2.384e-06,
126 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*/
127 4.292e-06*0.970031253194544/2.384e-06, -1.3828e-05*0.970031253194544/2.384e-06, 6.61850e-04*0.970031253194544/2.384e-06, 8.487225e-03*0.970031253194544/2.384e-06,
128 -2.7073860e-02*0.970031253194544/2.384e-06,-4.174709e-03*0.970031253194544/2.384e-06, -5.76973e-04*0.970031253194544/2.384e-06, -3.4809e-05*0.970031253194544/2.384e-06,
129 2.504869601913055e-01,
130 1.763842528696710e+00,
133 -1.431e-06*0.98078528040323/2.384e-06, 9.5367e-05*0.98078528040323/2.384e-06, 3.78609e-04*0.98078528040323/2.384e-06,-2.161503e-03*0.98078528040323/2.384e-06,
134 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*/
135 3.815e-06*0.98078528040323/2.384e-06, -2.718e-05*0.98078528040323/2.384e-06, 5.22137e-04*0.98078528040323/2.384e-06, 7.703304e-03*0.98078528040323/2.384e-06,
136 -2.7815342e-02*0.98078528040323/2.384e-06,-4.290581e-03*0.98078528040323/2.384e-06, -6.11782e-04*0.98078528040323/2.384e-06, -3.7670e-05*0.98078528040323/2.384e-06,
137 1.989123673796580e-01,
138 1.847759065022573e+00,
141 -1.907e-06*0.989176509964781/2.384e-06, 9.0122e-05*0.989176509964781/2.384e-06, 2.88486e-04*0.989176509964781/2.384e-06,-2.774239e-03*0.989176509964781/2.384e-06,
142 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*/
143 3.338e-06*0.989176509964781/2.384e-06, -3.9577e-05*0.989176509964781/2.384e-06, 3.88145e-04*0.989176509964781/2.384e-06, 6.937027e-03*0.989176509964781/2.384e-06,
144 -2.8532982e-02*0.989176509964781/2.384e-06,-4.395962e-03*0.989176509964781/2.384e-06, -6.46591e-04*0.989176509964781/2.384e-06, -4.0531e-05*0.989176509964781/2.384e-06,
145 1.483359875383474e-01,
146 1.913880671464418e+00,
149 -1.907e-06*0.995184726672197/2.384e-06, 8.4400e-05*0.995184726672197/2.384e-06, 1.91689e-04*0.995184726672197/2.384e-06,-3.411293e-03*0.995184726672197/2.384e-06,
150 3.1706810e-02*0.995184726672197/2.384e-06, 4.728317e-03*0.995184726672197/2.384e-06, 8.09669e-04*0.995184726672197/2.384e-06, 5.579e-05*0.995184726672197/2.384e-06,
151 3.338e-06*0.995184726672197/2.384e-06, -5.0545e-05*0.995184726672197/2.384e-06, 2.59876e-04*0.995184726672197/2.384e-06, 6.189346e-03*0.995184726672197/2.384e-06,
152 -2.9224873e-02*0.995184726672197/2.384e-06,-4.489899e-03*0.995184726672197/2.384e-06, -6.80923e-04*0.995184726672197/2.384e-06, -4.3392e-05*0.995184726672197/2.384e-06,
153 9.849140335716425e-02,
154 1.961570560806461e+00,
157 -2.384e-06*0.998795456205172/2.384e-06, 7.7724e-05*0.998795456205172/2.384e-06, 8.8215e-05*0.998795456205172/2.384e-06,-4.072189e-03*0.998795456205172/2.384e-06,
158 3.1132698e-02*0.998795456205172/2.384e-06, 4.691124e-03*0.998795456205172/2.384e-06, 7.79152e-04*0.998795456205172/2.384e-06, 5.2929e-05*0.998795456205172/2.384e-06,
159 2.861e-06*0.998795456205172/2.384e-06, -6.0558e-05*0.998795456205172/2.384e-06, 1.37329e-04*0.998795456205172/2.384e-06, 5.462170e-03*0.998795456205172/2.384e-06,
160 -2.9890060e-02*0.998795456205172/2.384e-06,-4.570484e-03*0.998795456205172/2.384e-06, -7.14302e-04*0.998795456205172/2.384e-06, -4.6253e-05*0.998795456205172/2.384e-06,
161 4.912684976946725e-02,
162 1.990369453344394e+00,
165 3.5780907e-02 * SQRT2
*0.5/2.384e-06,1.7876148e-02 * SQRT2
*0.5/2.384e-06, 3.134727e-03 * SQRT2
*0.5/2.384e-06, 2.457142e-03 * SQRT2
*0.5/2.384e-06,
166 9.71317e-04 * SQRT2
*0.5/2.384e-06, 2.18868e-04 * SQRT2
*0.5/2.384e-06, 1.01566e-04 * SQRT2
*0.5/2.384e-06, 1.3828e-05 * SQRT2
*0.5/2.384e-06,
168 3.0526638e-02/2.384e-06, 4.638195e-03/2.384e-06, 7.47204e-04/2.384e-06, 4.9591e-05/2.384e-06,
169 4.756451e-03/2.384e-06, 2.1458e-05/2.384e-06, -6.9618e-05/2.384e-06,/* 2.384e-06/2.384e-06*/
177 static const FLOAT8 win
[4][NL
] = {
179 2.382191739347913e-13,
180 6.423305872147834e-13,
181 9.400849094049688e-13,
182 1.122435026096556e-12,
183 1.183840321267481e-12,
184 1.122435026096556e-12,
185 9.400849094049690e-13,
186 6.423305872147839e-13,
187 2.382191739347918e-13,
189 5.456116108943412e-12,
190 4.878985199565852e-12,
191 4.240448995017367e-12,
192 3.559909094758252e-12,
193 2.858043359288075e-12,
194 2.156177623817898e-12,
195 1.475637723558783e-12,
196 8.371015190102974e-13,
197 2.599706096327376e-13,
199 -5.456116108943412e-12,
200 -4.878985199565852e-12,
201 -4.240448995017367e-12,
202 -3.559909094758252e-12,
203 -2.858043359288076e-12,
204 -2.156177623817898e-12,
205 -1.475637723558783e-12,
206 -8.371015190102975e-13,
207 -2.599706096327376e-13,
209 -2.382191739347923e-13,
210 -6.423305872147843e-13,
211 -9.400849094049696e-13,
212 -1.122435026096556e-12,
213 -1.183840321267481e-12,
214 -1.122435026096556e-12,
215 -9.400849094049694e-13,
216 -6.423305872147840e-13,
217 -2.382191739347918e-13,
220 2.382191739347913e-13,
221 6.423305872147834e-13,
222 9.400849094049688e-13,
223 1.122435026096556e-12,
224 1.183840321267481e-12,
225 1.122435026096556e-12,
226 9.400849094049688e-13,
227 6.423305872147841e-13,
228 2.382191739347918e-13,
230 5.456116108943413e-12,
231 4.878985199565852e-12,
232 4.240448995017367e-12,
233 3.559909094758253e-12,
234 2.858043359288075e-12,
235 2.156177623817898e-12,
236 1.475637723558782e-12,
237 8.371015190102975e-13,
238 2.599706096327376e-13,
240 -5.461314069809755e-12,
241 -4.921085770524055e-12,
242 -4.343405037091838e-12,
243 -3.732668368707687e-12,
244 -3.093523840190885e-12,
245 -2.430835727329465e-12,
246 -1.734679010007751e-12,
247 -9.748253656609281e-13,
248 -2.797435120168326e-13,
250 0.000000000000000e+00,
251 0.000000000000000e+00,
252 0.000000000000000e+00,
253 0.000000000000000e+00,
254 0.000000000000000e+00,
255 0.000000000000000e+00,
256 -2.283748241799531e-13,
257 -4.037858874020686e-13,
258 -2.146547464825323e-13,
261 1.316524975873958e-01, /* win[SHORT_TYPE] */
262 4.142135623730950e-01,
263 7.673269879789602e-01,
265 1.091308501069271e+00, /* tantab_l */
266 1.303225372841206e+00,
267 1.569685577117490e+00,
268 1.920982126971166e+00,
269 2.414213562373094e+00,
270 3.171594802363212e+00,
271 4.510708503662055e+00,
272 7.595754112725146e+00,
273 2.290376554843115e+01,
275 0.98480775301220802032, /* cx */
276 0.64278760968653936292,
277 0.34202014332566882393,
278 0.93969262078590842791,
279 -0.17364817766693030343,
280 -0.76604444311897790243,
281 0.86602540378443870761,
282 0.500000000000000e+00,
284 -5.144957554275265e-01, /* ca */
285 -4.717319685649723e-01,
286 -3.133774542039019e-01,
287 -1.819131996109812e-01,
288 -9.457419252642064e-02,
289 -4.096558288530405e-02,
290 -1.419856857247115e-02,
291 -3.699974673760037e-03,
293 8.574929257125442e-01, /* cs */
294 8.817419973177052e-01,
295 9.496286491027329e-01,
296 9.833145924917901e-01,
297 9.955178160675857e-01,
298 9.991605581781475e-01,
299 9.998991952444470e-01,
300 9.999931550702802e-01,
303 0.000000000000000e+00,
304 0.000000000000000e+00,
305 0.000000000000000e+00,
306 0.000000000000000e+00,
307 0.000000000000000e+00,
308 0.000000000000000e+00,
309 2.283748241799531e-13,
310 4.037858874020686e-13,
311 2.146547464825323e-13,
313 5.461314069809755e-12,
314 4.921085770524055e-12,
315 4.343405037091838e-12,
316 3.732668368707687e-12,
317 3.093523840190885e-12,
318 2.430835727329466e-12,
319 1.734679010007751e-12,
320 9.748253656609281e-13,
321 2.797435120168326e-13,
323 -5.456116108943413e-12,
324 -4.878985199565852e-12,
325 -4.240448995017367e-12,
326 -3.559909094758253e-12,
327 -2.858043359288075e-12,
328 -2.156177623817898e-12,
329 -1.475637723558782e-12,
330 -8.371015190102975e-13,
331 -2.599706096327376e-13,
333 -2.382191739347913e-13,
334 -6.423305872147834e-13,
335 -9.400849094049688e-13,
336 -1.122435026096556e-12,
337 -1.183840321267481e-12,
338 -1.122435026096556e-12,
339 -9.400849094049688e-13,
340 -6.423305872147841e-13,
341 -2.382191739347918e-13,
345 #define tantab_l (win[SHORT_TYPE]+3)
346 #define cx (win[SHORT_TYPE]+12)
347 #define ca (win[SHORT_TYPE]+20)
348 #define cs (win[SHORT_TYPE]+28)
350 /************************************************************************
354 * PURPOSE: Overlapping window on PCM samples
357 * 32 16-bit pcm samples are scaled to fractional 2's complement and
358 * concatenated to the end of the window buffer #x#. The updated window
359 * buffer #x# is then windowed by the analysis window #c# to produce the
360 * windowed sample #z#
362 ************************************************************************/
365 * new IDCT routine written by Takehiro TOMINAGA
367 static const int order
[] = {
368 0, 1,16,17, 8, 9,24,25, 4, 5,20,21,12,13,28,29,
369 2, 3,18,19,10,11,26,27, 6, 7,22,23,14,15,30,31
373 /* returns sum_j=0^31 a[j]*cos(PI*j*(k+1/2)/32), 0<=k<32 */
375 window_subband(const sample_t
*x1
, FLOAT8 a
[SBLIMIT
])
378 FLOAT8
const *wp
= enwindow
+10;
380 const sample_t
*x2
= &x1
[238-14-286];
382 for (i
= -15; i
< 0; i
++) {
385 w
= wp
[-10]; s
= x2
[-224] * w
; t
= x1
[ 224] * w
;
386 w
= wp
[-9]; s
+= x2
[-160] * w
; t
+= x1
[ 160] * w
;
387 w
= wp
[-8]; s
+= x2
[- 96] * w
; t
+= x1
[ 96] * w
;
388 w
= wp
[-7]; s
+= x2
[- 32] * w
; t
+= x1
[ 32] * w
;
389 w
= wp
[-6]; s
+= x2
[ 32] * w
; t
+= x1
[- 32] * w
;
390 w
= wp
[-5]; s
+= x2
[ 96] * w
; t
+= x1
[- 96] * w
;
391 w
= wp
[-4]; s
+= x2
[ 160] * w
; t
+= x1
[-160] * w
;
392 w
= wp
[-3]; s
+= x2
[ 224] * w
; t
+= x1
[-224] * w
;
394 w
= wp
[-2]; s
+= x1
[-256] * w
; t
-= x2
[ 256] * w
;
395 w
= wp
[-1]; s
+= x1
[-192] * w
; t
-= x2
[ 192] * w
;
396 w
= wp
[ 0]; s
+= x1
[-128] * w
; t
-= x2
[ 128] * w
;
397 w
= wp
[ 1]; s
+= x1
[- 64] * w
; t
-= x2
[ 64] * w
;
398 w
= wp
[ 2]; s
+= x1
[ 0] * w
; t
-= x2
[ 0] * w
;
399 w
= wp
[ 3]; s
+= x1
[ 64] * w
; t
-= x2
[- 64] * w
;
400 w
= wp
[ 4]; s
+= x1
[ 128] * w
; t
-= x2
[-128] * w
;
401 w
= wp
[ 5]; s
+= x1
[ 192] * w
; t
-= x2
[-192] * w
;
404 * this multiplyer could be removed, but it needs more 256 FLOAT data.
405 * thinking about the data cache performance, I think we should not
406 * use such a huge table. tt 2000/Oct/25
411 a
[31+i
*2] = wp
[7] * w
;
418 t
= x1
[- 16] * wp
[-10]; s
= x1
[ -32] * wp
[-2];
419 t
+= (x1
[- 48] - x1
[ 16]) * wp
[-9]; s
+= x1
[ -96] * wp
[-1];
420 t
+= (x1
[- 80] + x1
[ 48]) * wp
[-8]; s
+= x1
[-160] * wp
[ 0];
421 t
+= (x1
[-112] - x1
[ 80]) * wp
[-7]; s
+= x1
[-224] * wp
[ 1];
422 t
+= (x1
[-144] + x1
[112]) * wp
[-6]; s
-= x1
[ 32] * wp
[ 2];
423 t
+= (x1
[-176] - x1
[144]) * wp
[-5]; s
-= x1
[ 96] * wp
[ 3];
424 t
+= (x1
[-208] + x1
[176]) * wp
[-4]; s
-= x1
[ 160] * wp
[ 4];
425 t
+= (x1
[-240] - x1
[208]) * wp
[-3]; s
-= x1
[ 224];
440 xr
= a
[28] - a
[ 0]; a
[ 0] += a
[28]; a
[28] = xr
* wp
[-2*18+7];
441 xr
= a
[29] - a
[ 1]; a
[ 1] += a
[29]; a
[29] = xr
* wp
[-2*18+7];
443 xr
= a
[26] - a
[ 2]; a
[ 2] += a
[26]; a
[26] = xr
* wp
[-4*18+7];
444 xr
= a
[27] - a
[ 3]; a
[ 3] += a
[27]; a
[27] = xr
* wp
[-4*18+7];
446 xr
= a
[24] - a
[ 4]; a
[ 4] += a
[24]; a
[24] = xr
* wp
[-6*18+7];
447 xr
= a
[25] - a
[ 5]; a
[ 5] += a
[25]; a
[25] = xr
* wp
[-6*18+7];
449 xr
= a
[22] - a
[ 6]; a
[ 6] += a
[22]; a
[22] = xr
* SQRT2
;
450 xr
= a
[23] - a
[ 7]; a
[ 7] += a
[23]; a
[23] = xr
* SQRT2
- a
[ 7];
455 xr
= a
[ 6]; a
[ 6] = a
[31] - xr
; a
[31] = a
[31] + xr
;
456 xr
= a
[ 7]; a
[ 7] = a
[30] - xr
; a
[30] = a
[30] + xr
;
457 xr
= a
[22]; a
[22] = a
[15] - xr
; a
[15] = a
[15] + xr
;
458 xr
= a
[23]; a
[23] = a
[14] - xr
; a
[14] = a
[14] + xr
;
460 xr
= a
[20] - a
[ 8]; a
[ 8] += a
[20]; a
[20] = xr
* wp
[-10*18+7];
461 xr
= a
[21] - a
[ 9]; a
[ 9] += a
[21]; a
[21] = xr
* wp
[-10*18+7];
463 xr
= a
[18] - a
[10]; a
[10] += a
[18]; a
[18] = xr
* wp
[-12*18+7];
464 xr
= a
[19] - a
[11]; a
[11] += a
[19]; a
[19] = xr
* wp
[-12*18+7];
466 xr
= a
[16] - a
[12]; a
[12] += a
[16]; a
[16] = xr
* wp
[-14*18+7];
467 xr
= a
[17] - a
[13]; a
[13] += a
[17]; a
[17] = xr
* wp
[-14*18+7];
469 xr
= -a
[20] + a
[24]; a
[20] += a
[24]; a
[24] = xr
* wp
[-12*18+7];
470 xr
= -a
[21] + a
[25]; a
[21] += a
[25]; a
[25] = xr
* wp
[-12*18+7];
472 xr
= a
[ 4] - a
[ 8]; a
[ 4] += a
[ 8]; a
[ 8] = xr
* wp
[-12*18+7];
473 xr
= a
[ 5] - a
[ 9]; a
[ 5] += a
[ 9]; a
[ 9] = xr
* wp
[-12*18+7];
475 xr
= a
[ 0] - a
[12]; a
[ 0] += a
[12]; a
[12] = xr
* wp
[-4*18+7];
476 xr
= a
[ 1] - a
[13]; a
[ 1] += a
[13]; a
[13] = xr
* wp
[-4*18+7];
477 xr
= a
[16] - a
[28]; a
[16] += a
[28]; a
[28] = xr
* wp
[-4*18+7];
478 xr
= -a
[17] + a
[29]; a
[17] += a
[29]; a
[29] = xr
* wp
[-4*18+7];
480 xr
= SQRT2
* (a
[ 2] - a
[10]); a
[ 2] += a
[10]; a
[10] = xr
;
481 xr
= SQRT2
* (a
[ 3] - a
[11]); a
[ 3] += a
[11]; a
[11] = xr
;
482 xr
= SQRT2
* (-a
[18] + a
[26]); a
[18] += a
[26]; a
[26] = xr
- a
[18];
483 xr
= SQRT2
* (-a
[19] + a
[27]); a
[19] += a
[27]; a
[27] = xr
- a
[19];
485 xr
= a
[ 2]; a
[19] -= a
[ 3]; a
[ 3] -= xr
; a
[ 2] = a
[31] - xr
; a
[31] += xr
;
486 xr
= a
[ 3]; a
[11] -= a
[19]; a
[18] -= xr
; a
[ 3] = a
[30] - xr
; a
[30] += xr
;
487 xr
= a
[18]; a
[27] -= a
[11]; a
[19] -= xr
; a
[18] = a
[15] - xr
; a
[15] += xr
;
489 xr
= a
[19]; a
[10] -= xr
; a
[19] = a
[14] - xr
; a
[14] += xr
;
490 xr
= a
[10]; a
[11] -= xr
; a
[10] = a
[23] - xr
; a
[23] += xr
;
491 xr
= a
[11]; a
[26] -= xr
; a
[11] = a
[22] - xr
; a
[22] += xr
;
492 xr
= a
[26]; a
[27] -= xr
; a
[26] = a
[ 7] - xr
; a
[ 7] += xr
;
494 xr
= a
[27]; a
[27] = a
[ 6] - xr
; a
[ 6] += xr
;
496 xr
= SQRT2
* (a
[ 0] - a
[ 4]); a
[ 0] += a
[ 4]; a
[ 4] = xr
;
497 xr
= SQRT2
* (a
[ 1] - a
[ 5]); a
[ 1] += a
[ 5]; a
[ 5] = xr
;
498 xr
= SQRT2
* (a
[16] - a
[20]); a
[16] += a
[20]; a
[20] = xr
;
499 xr
= SQRT2
* (a
[17] - a
[21]); a
[17] += a
[21]; a
[21] = xr
;
501 xr
= -SQRT2
* (a
[ 8] - a
[12]); a
[ 8] += a
[12]; a
[12] = xr
- a
[ 8];
502 xr
= -SQRT2
* (a
[ 9] - a
[13]); a
[ 9] += a
[13]; a
[13] = xr
- a
[ 9];
503 xr
= -SQRT2
* (a
[25] - a
[29]); a
[25] += a
[29]; a
[29] = xr
- a
[25];
504 xr
= -SQRT2
* (a
[24] + a
[28]); a
[24] -= a
[28]; a
[28] = xr
- a
[24];
506 xr
= a
[24] - a
[16]; a
[24] = xr
;
507 xr
= a
[20] - xr
; a
[20] = xr
;
508 xr
= a
[28] - xr
; a
[28] = xr
;
510 xr
= a
[25] - a
[17]; a
[25] = xr
;
511 xr
= a
[21] - xr
; a
[21] = xr
;
512 xr
= a
[29] - xr
; a
[29] = xr
;
514 xr
= a
[17] - a
[ 1]; a
[17] = xr
;
515 xr
= a
[ 9] - xr
; a
[ 9] = xr
;
516 xr
= a
[25] - xr
; a
[25] = xr
;
517 xr
= a
[ 5] - xr
; a
[ 5] = xr
;
518 xr
= a
[21] - xr
; a
[21] = xr
;
519 xr
= a
[13] - xr
; a
[13] = xr
;
520 xr
= a
[29] - xr
; a
[29] = xr
;
522 xr
= a
[ 1] - a
[ 0]; a
[ 1] = xr
;
523 xr
= a
[16] - xr
; a
[16] = xr
;
524 xr
= a
[17] - xr
; a
[17] = xr
;
525 xr
= a
[ 8] - xr
; a
[ 8] = xr
;
526 xr
= a
[ 9] - xr
; a
[ 9] = xr
;
527 xr
= a
[24] - xr
; a
[24] = xr
;
528 xr
= a
[25] - xr
; a
[25] = xr
;
529 xr
= a
[ 4] - xr
; a
[ 4] = xr
;
530 xr
= a
[ 5] - xr
; a
[ 5] = xr
;
531 xr
= a
[20] - xr
; a
[20] = xr
;
532 xr
= a
[21] - xr
; a
[21] = xr
;
533 xr
= a
[12] - xr
; a
[12] = xr
;
534 xr
= a
[13] - xr
; a
[13] = xr
;
535 xr
= a
[28] - xr
; a
[28] = xr
;
536 xr
= a
[29] - xr
; a
[29] = xr
;
538 xr
= a
[ 0]; a
[ 0] += a
[31]; a
[31] -= xr
;
539 xr
= a
[ 1]; a
[ 1] += a
[30]; a
[30] -= xr
;
540 xr
= a
[16]; a
[16] += a
[15]; a
[15] -= xr
;
541 xr
= a
[17]; a
[17] += a
[14]; a
[14] -= xr
;
542 xr
= a
[ 8]; a
[ 8] += a
[23]; a
[23] -= xr
;
543 xr
= a
[ 9]; a
[ 9] += a
[22]; a
[22] -= xr
;
544 xr
= a
[24]; a
[24] += a
[ 7]; a
[ 7] -= xr
;
545 xr
= a
[25]; a
[25] += a
[ 6]; a
[ 6] -= xr
;
546 xr
= a
[ 4]; a
[ 4] += a
[27]; a
[27] -= xr
;
547 xr
= a
[ 5]; a
[ 5] += a
[26]; a
[26] -= xr
;
548 xr
= a
[20]; a
[20] += a
[11]; a
[11] -= xr
;
549 xr
= a
[21]; a
[21] += a
[10]; a
[10] -= xr
;
550 xr
= a
[12]; a
[12] += a
[19]; a
[19] -= xr
;
551 xr
= a
[13]; a
[13] += a
[18]; a
[18] -= xr
;
552 xr
= a
[28]; a
[28] += a
[ 3]; a
[ 3] -= xr
;
553 xr
= a
[29]; a
[29] += a
[ 2]; a
[ 2] -= xr
;
559 /*-------------------------------------------------------------------*/
561 /* Function: Calculation of the MDCT */
562 /* In the case of long blocks (type 0,1,3) there are */
563 /* 36 coefficents in the time domain and 18 in the frequency */
565 /* In the case of short blocks (type 2) there are 3 */
566 /* transformations with short length. This leads to 12 coefficents */
567 /* in the time and 6 in the frequency domain. In this case the */
568 /* results are stored side by side in the vector out[]. */
572 /*-------------------------------------------------------------------*/
574 inline static void mdct_short(FLOAT8
*inout
)
577 for ( l
= 0; l
< 3; l
++ ) {
578 FLOAT8 tc0
,tc1
,tc2
,ts0
,ts1
,ts2
;
580 ts0
= inout
[2*3] * win
[SHORT_TYPE
][0] - inout
[5*3];
581 tc0
= inout
[0*3] * win
[SHORT_TYPE
][2] - inout
[3*3];
585 ts0
= inout
[5*3] * win
[SHORT_TYPE
][0] + inout
[2*3];
586 tc0
= inout
[3*3] * win
[SHORT_TYPE
][2] + inout
[0*3];
590 tc0
= (inout
[1*3] * win
[SHORT_TYPE
][1] - inout
[4*3]) * 2.069978111953089e-11; /* tritab_s[1] */
591 ts0
= (inout
[4*3] * win
[SHORT_TYPE
][1] + inout
[1*3]) * 2.069978111953089e-11; /* tritab_s[1] */
593 inout
[3*0] = tc1
* 1.907525191737280e-11 /* tritab_s[2] */ + tc0
;
594 inout
[3*5] = -ts1
* 1.907525191737280e-11 /* tritab_s[0] */ + ts0
;
596 tc2
= tc2
* 0.86602540378443870761 * 1.907525191737281e-11 /* tritab_s[2] */;
597 ts1
= ts1
* 0.5 * 1.907525191737281e-11 + ts0
;
598 inout
[3*1] = tc2
-ts1
;
599 inout
[3*2] = tc2
+ts1
;
601 tc1
= tc1
* 0.5 * 1.907525191737281e-11 - tc0
;
602 ts2
= ts2
* 0.86602540378443870761 * 1.907525191737281e-11 /* tritab_s[0] */;
603 inout
[3*3] = tc1
+ts2
;
604 inout
[3*4] = tc1
-ts2
;
610 inline static void mdct_long(FLOAT8
*out
, FLOAT8
*in
)
614 FLOAT8 tc1
, tc2
, tc3
, tc4
, ts5
, ts6
, ts7
, ts8
;
615 // 1,2, 5,6, 9,10, 13,14, 17
624 out
[17] = (ts5
+ts7
-ts8
)-(ts6
-in
[4]);
625 st
= (ts5
+ts7
-ts8
)*cx
[7]+(ts6
-in
[4]);
626 ct
= (tc1
-tc3
-tc4
)*cx
[6];
630 tc2
= (in
[16]-in
[10])*cx
[6];
631 ts6
= ts6
*cx
[7] + in
[4];
632 ct
= tc1
*cx
[0] + tc2
+ tc3
*cx
[1] + tc4
*cx
[2];
633 st
= -ts5
*cx
[4] + ts6
- ts7
*cx
[5] + ts8
*cx
[3];
637 ct
= tc1
*cx
[1] - tc2
- tc3
*cx
[2] + tc4
*cx
[0];
638 st
= -ts5
*cx
[5] + ts6
- ts7
*cx
[3] + ts8
*cx
[4];
642 ct
= tc1
*cx
[2] - tc2
+ tc3
*cx
[0] - tc4
*cx
[1];
643 st
= ts5
*cx
[3] - ts6
+ ts7
*cx
[4] - ts8
*cx
[5];
648 FLOAT8 ts1
, ts2
, ts3
, ts4
, tc5
, tc6
, tc7
, tc8
;
658 out
[0] = (tc5
+tc7
+tc8
)+(tc6
+in
[13]);
659 ct
= (tc5
+tc7
+tc8
)*cx
[7]-(tc6
+in
[13]);
660 st
= (ts1
-ts3
+ts4
)*cx
[6];
664 ts2
= (in
[7]-in
[1])*cx
[6];
665 tc6
= in
[13] - tc6
*cx
[7];
666 ct
= tc5
*cx
[3] - tc6
+ tc7
*cx
[4] + tc8
*cx
[5];
667 st
= ts1
*cx
[2] + ts2
+ ts3
*cx
[0] + ts4
*cx
[1];
671 ct
= -tc5
*cx
[5] + tc6
- tc7
*cx
[3] - tc8
*cx
[4];
672 st
= ts1
*cx
[1] + ts2
- ts3
*cx
[2] - ts4
*cx
[0];
676 ct
= -tc5
*cx
[4] + tc6
- tc7
*cx
[5] - tc8
*cx
[3];
677 st
= ts1
*cx
[0] - ts2
+ ts3
*cx
[1] - ts4
*cx
[2];
684 void mdct_sub48( lame_internal_flags
*gfc
, const sample_t
*w0
, const sample_t
*w1
,
685 FLOAT8 mdct_freq
[2][2][576] )
691 /* thinking cache performance, ch->gr loop is better than gr->ch loop */
692 for (ch
= 0; ch
< gfc
->channels_out
; ch
++) {
693 for (gr
= 0; gr
< gfc
->mode_gr
; gr
++) {
695 FLOAT8
*mdct_enc
= &mdct_freq
[gr
][ch
][0];
696 gr_info
*gi
= &(gfc
->l3_side
.gr
[gr
].ch
[ch
].tt
);
697 FLOAT8
*samp
= gfc
->sb_sample
[ch
][1 - gr
][0];
699 for (k
= 0; k
< 18 / 2; k
++) {
700 window_subband(wk
, samp
);
701 window_subband(wk
+ 32, samp
+ 32);
705 * Compensate for inversion in the analysis filter
707 for (band
= 1; band
< 32; band
+=2) {
713 /* apply filters on the polyphase filterbank outputs */
714 /* bands <= gfc->highpass_band will be zeroed out below */
715 /* bands >= gfc->lowpass_band will be zeroed out below */
716 if (gfc
->filter_type
==0) {
717 for (band
=gfc
->highpass_start_band
; band
<= gfc
->highpass_end_band
; band
++) {
719 gfc
->sb_sample
[ch
][1-gr
][k
][order
[band
]]*=gfc
->amp_highpass
[band
];
721 for (band
=gfc
->lowpass_start_band
; band
<= gfc
->lowpass_end_band
; band
++) {
723 gfc
->sb_sample
[ch
][1-gr
][k
][order
[band
]]*=gfc
->amp_lowpass
[band
];
730 * Perform imdct of 18 previous subband samples
731 * + 18 current subband samples
733 for (band
= 0; band
< 32; band
++, mdct_enc
+= 18) {
734 int type
= gi
->block_type
;
735 FLOAT8
*band0
, *band1
;
736 band0
= gfc
->sb_sample
[ch
][ gr
][0] + order
[band
];
737 band1
= gfc
->sb_sample
[ch
][1-gr
][0] + order
[band
];
738 if (gi
->mixed_block_flag
&& band
< 2)
740 if (band
>= gfc
->lowpass_band
|| band
<= gfc
->highpass_band
) {
741 memset((char *)mdct_enc
,0,18*sizeof(FLOAT8
));
743 if (type
== SHORT_TYPE
) {
744 for (k
= -NS
/4; k
< 0; k
++) {
745 FLOAT8 w
= win
[SHORT_TYPE
][k
+3];
746 mdct_enc
[k
*3+ 9] = band0
[( 9+k
)*32] * w
- band0
[( 8-k
)*32];
747 mdct_enc
[k
*3+18] = band0
[(14-k
)*32] * w
+ band0
[(15+k
)*32];
748 mdct_enc
[k
*3+10] = band0
[(15+k
)*32] * w
- band0
[(14-k
)*32];
749 mdct_enc
[k
*3+19] = band1
[( 2-k
)*32] * w
+ band1
[( 3+k
)*32];
750 mdct_enc
[k
*3+11] = band1
[( 3+k
)*32] * w
- band1
[( 2-k
)*32];
751 mdct_enc
[k
*3+20] = band1
[( 8-k
)*32] * w
+ band1
[( 9+k
)*32];
753 mdct_short(mdct_enc
);
756 for (k
= -NL
/4; k
< 0; k
++) {
758 a
= win
[type
][k
+27] * band1
[(k
+9)*32]
759 + win
[type
][k
+36] * band1
[(8-k
)*32];
760 b
= win
[type
][k
+ 9] * band0
[(k
+9)*32]
761 - win
[type
][k
+18] * band0
[(8-k
)*32];
762 work
[k
+ 9] = a
- b
*tantab_l
[k
+9];
763 work
[k
+18] = a
*tantab_l
[k
+9] + b
;
766 mdct_long(mdct_enc
, work
);
770 * Perform aliasing reduction butterfly
772 if (type
!= SHORT_TYPE
) {
775 for (k
= 7; k
>= 0; --k
) {
777 bu
= mdct_enc
[k
] * ca
[k
] + mdct_enc
[-1-k
] * cs
[k
];
778 bd
= mdct_enc
[k
] * cs
[k
] - mdct_enc
[-1-k
] * ca
[k
];
787 if (gfc
->mode_gr
== 1) {
788 memcpy(gfc
->sb_sample
[ch
][0], gfc
->sb_sample
[ch
][1], 576 * sizeof(FLOAT8
));