Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/*
2
 *	MP3 window subband -> subband filtering -> mdct routine
3
 *
4
 *	Copyright (c) 1999 Takehiro TOMINAGA
5
 *
6
 *
7
 * This library is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Library General Public
9
 * License as published by the Free Software Foundation; either
10
 * version 2 of the License, or (at your option) any later version.
11
 *
12
 * This library is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
15
 * Library General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Library General Public
18
 * License along with this library; if not, write to the
19
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20
 * Boston, MA 02111-1307, USA.
21
 */
22
 
23
/*
24
 *         Special Thanks to Patrick De Smet for your advices.
25
 */
26
 
27
/* $Id: newmdct.c,v 1.25 2001/01/17 09:54:20 robert Exp $ */
28
 
29
#ifdef HAVE_CONFIG_H
30
# include <config.h>
31
#endif
32
 
33
#include "util.h"
34
#include "l3side.h"
35
#include "newmdct.h"
36
 
37
#ifdef WITH_DMALLOC
38
#include <dmalloc.h>
39
#endif
40
 
41
#define SCALE (32768.0/ 2.384e-06)
42
 
43
#ifndef USE_GOGO_SUBBAND
44
static const FLOAT8 enwindow[] = 
45
{
46
      -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,
47
  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*/
48
     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,
49
 -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,
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,  9.30786e-04*0.773010453362737/2.384e-06, 2.521515e-03*0.773010453362737/2.384e-06,
55
  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*/
56
     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,
57
 -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,
58
      8.206787908286602e-01,
59
      3.901806440322567e-01,
60
 
61
 
62
      -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,
63
  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*/
64
     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,
65
 -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,
66
      7.416505462720353e-01,
67
      5.805693545089249e-01,
68
 
69
 
70
      -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,
71
  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*/
72
      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,
73
 -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,
74
      6.681786379192989e-01,
75
      7.653668647301797e-01,
76
 
77
 
78
      -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,
79
  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*/
80
      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,
81
 -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,
82
      5.993769336819237e-01,
83
      9.427934736519954e-01,
84
 
85
 
86
      -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,
87
  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*/
88
      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,
89
 -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,
90
      5.345111359507916e-01,
91
      1.111140466039205e+00,
92
 
93
 
94
      -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,
95
  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*/
96
      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,
97
 -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,
98
      4.729647758913199e-01,
99
      1.268786568327291e+00,
100
 
101
 
102
      -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,
103
  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,
104
      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,
105
 -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,
106
      4.1421356237309504879e-01,  /* tan(PI/8) */
107
      1.414213562373095e+00,
108
 
109
 
110
      -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,
111
  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*/
112
      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,
113
 -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,
114
      3.578057213145241e-01,
115
      1.546020906725474e+00,
116
 
117
 
118
      -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,
119
  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*/
120
      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,
121
 -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,
122
      3.033466836073424e-01,
123
      1.662939224605090e+00,
124
 
125
 
126
     -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,
127
  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*/
128
      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,
129
 -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,
130
      2.504869601913055e-01,
131
      1.763842528696710e+00,
132
 
133
 
134
     -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,
135
  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*/
136
      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,
137
 -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,
138
      1.989123673796580e-01,
139
      1.847759065022573e+00,
140
 
141
 
142
     -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,
143
  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*/
144
      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,
145
 -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,
146
      1.483359875383474e-01,
147
      1.913880671464418e+00,
148
 
149
 
150
     -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,
151
  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,
152
      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,
153
 -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,
154
      9.849140335716425e-02,
155
      1.961570560806461e+00,
156
 
157
 
158
     -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,
159
      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,
160
      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,
161
      -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,
162
      4.912684976946725e-02,
163
      1.990369453344394e+00,
164
 
165
 
166
      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,
167
      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
 
169
      3.0526638e-02/2.384e-06, 4.638195e-03/2.384e-06,  7.47204e-04/2.384e-06,   4.9591e-05/2.384e-06,
170
      4.756451e-03/2.384e-06,   2.1458e-05/2.384e-06,  -6.9618e-05/2.384e-06,/*    2.384e-06/2.384e-06*/
171
};
172
#endif
173
 
174
 
175
#define NS 12
176
#define NL 36
177
 
178
static const FLOAT8 win[4][NL] = {
179
  {
180
    2.382191739347913e-13,
181
    6.423305872147834e-13,
182
    9.400849094049688e-13,
183
    1.122435026096556e-12,
184
    1.183840321267481e-12,
185
    1.122435026096556e-12,
186
    9.400849094049690e-13,
187
    6.423305872147839e-13,
188
    2.382191739347918e-13,
189
 
190
    5.456116108943412e-12,
191
    4.878985199565852e-12,
192
    4.240448995017367e-12,
193
    3.559909094758252e-12,
194
    2.858043359288075e-12,
195
    2.156177623817898e-12,
196
    1.475637723558783e-12,
197
    8.371015190102974e-13,
198
    2.599706096327376e-13,
199
 
200
    -5.456116108943412e-12,
201
    -4.878985199565852e-12,
202
    -4.240448995017367e-12,
203
    -3.559909094758252e-12,
204
    -2.858043359288076e-12,
205
    -2.156177623817898e-12,
206
    -1.475637723558783e-12,
207
    -8.371015190102975e-13,
208
    -2.599706096327376e-13,
209
 
210
    -2.382191739347923e-13,
211
    -6.423305872147843e-13,
212
    -9.400849094049696e-13,
213
    -1.122435026096556e-12,
214
    -1.183840321267481e-12,
215
    -1.122435026096556e-12,
216
    -9.400849094049694e-13,
217
    -6.423305872147840e-13,
218
    -2.382191739347918e-13,
219
  },
220
  {
221
    2.382191739347913e-13,
222
    6.423305872147834e-13,
223
    9.400849094049688e-13,
224
    1.122435026096556e-12,
225
    1.183840321267481e-12,
226
    1.122435026096556e-12,
227
    9.400849094049688e-13,
228
    6.423305872147841e-13,
229
    2.382191739347918e-13,
230
 
231
    5.456116108943413e-12,
232
    4.878985199565852e-12,
233
    4.240448995017367e-12,
234
    3.559909094758253e-12,
235
    2.858043359288075e-12,
236
    2.156177623817898e-12,
237
    1.475637723558782e-12,
238
    8.371015190102975e-13,
239
    2.599706096327376e-13,
240
 
241
    -5.461314069809755e-12,
242
    -4.921085770524055e-12,
243
    -4.343405037091838e-12,
244
    -3.732668368707687e-12,
245
    -3.093523840190885e-12,
246
    -2.430835727329465e-12,
247
    -1.734679010007751e-12,
248
    -9.748253656609281e-13,
249
    -2.797435120168326e-13,
250
 
251
    0.000000000000000e+00,
252
    0.000000000000000e+00,
253
    0.000000000000000e+00,
254
    0.000000000000000e+00,
255
    0.000000000000000e+00,
256
    0.000000000000000e+00,
257
    -2.283748241799531e-13,
258
    -4.037858874020686e-13,
259
    -2.146547464825323e-13,
260
  },
261
  {
262
    1.316524975873958e-01, /* win[SHORT_TYPE] */
263
    4.142135623730950e-01,
264
    7.673269879789602e-01,
265
 
266
    1.091308501069271e+00, /* tantab_l */
267
    1.303225372841206e+00,
268
    1.569685577117490e+00,
269
    1.920982126971166e+00,
270
    2.414213562373094e+00,
271
    3.171594802363212e+00,
272
    4.510708503662055e+00,
273
    7.595754112725146e+00,
274
    2.290376554843115e+01,
275
 
276
    0.98480775301220802032, /* cx */
277
    0.64278760968653936292,
278
    0.34202014332566882393,
279
    0.93969262078590842791,
280
    -0.17364817766693030343,
281
    -0.76604444311897790243,
282
    0.86602540378443870761,
283
    0.500000000000000e+00,
284
 
285
    -5.144957554275265e-01, /* ca */
286
    -4.717319685649723e-01,
287
    -3.133774542039019e-01,
288
    -1.819131996109812e-01,
289
    -9.457419252642064e-02,
290
    -4.096558288530405e-02,
291
    -1.419856857247115e-02,
292
    -3.699974673760037e-03,
293
 
294
     8.574929257125442e-01, /* cs */
295
     8.817419973177052e-01,
296
     9.496286491027329e-01,
297
     9.833145924917901e-01,
298
     9.955178160675857e-01,
299
     9.991605581781475e-01,
300
     9.998991952444470e-01,
301
     9.999931550702802e-01,
302
  },
303
  {
304
    0.000000000000000e+00,
305
    0.000000000000000e+00,
306
    0.000000000000000e+00,
307
    0.000000000000000e+00,
308
    0.000000000000000e+00,
309
    0.000000000000000e+00,
310
    2.283748241799531e-13,
311
    4.037858874020686e-13,
312
    2.146547464825323e-13,
313
 
314
    5.461314069809755e-12,
315
    4.921085770524055e-12,
316
    4.343405037091838e-12,
317
    3.732668368707687e-12,
318
    3.093523840190885e-12,
319
    2.430835727329466e-12,
320
    1.734679010007751e-12,
321
    9.748253656609281e-13,
322
    2.797435120168326e-13,
323
 
324
    -5.456116108943413e-12,
325
    -4.878985199565852e-12,
326
    -4.240448995017367e-12,
327
    -3.559909094758253e-12,
328
    -2.858043359288075e-12,
329
    -2.156177623817898e-12,
330
    -1.475637723558782e-12,
331
    -8.371015190102975e-13,
332
    -2.599706096327376e-13,
333
 
334
    -2.382191739347913e-13,
335
    -6.423305872147834e-13,
336
    -9.400849094049688e-13,
337
    -1.122435026096556e-12,
338
    -1.183840321267481e-12,
339
    -1.122435026096556e-12,
340
    -9.400849094049688e-13,
341
    -6.423305872147841e-13,
342
    -2.382191739347918e-13,
343
  }
344
};
345
 
346
#define tantab_l (win[SHORT_TYPE]+3)
347
#define cx (win[SHORT_TYPE]+12)
348
#define ca (win[SHORT_TYPE]+20)
349
#define cs (win[SHORT_TYPE]+28)
350
 
351
/************************************************************************
352
*
353
* window_subband()
354
*
355
* PURPOSE:  Overlapping window on PCM samples
356
*
357
* SEMANTICS:
358
* 32 16-bit pcm samples are scaled to fractional 2's complement and
359
* concatenated to the end of the window buffer #x#. The updated window
360
* buffer #x# is then windowed by the analysis window #c# to produce the
361
* windowed sample #z#
362
*
363
************************************************************************/
364
 
365
/*
366
 *      new IDCT routine written by Takehiro TOMINAGA
367
 */
368
static const int order[] = {
369
  0, 1,16,17, 8, 9,24,25, 4, 5,20,21,12,13,28,29,
370
  2, 3,18,19,10,11,26,27, 6, 7,22,23,14,15,30,31
371
};
372
 
373
 
374
/* returns sum_j=0^31 a[j]*cos(PI*j*(k+1/2)/32), 0<=k<32 */
375
INLINE static void
376
window_subband(const sample_t *x1, FLOAT8 a[SBLIMIT])
377
{
378
    int i;
379
    FLOAT8 const *wp = enwindow+10;
380
 
381
    const sample_t *x2 = &x1[238-14-286];
382
 
383
    for (i = -15; i < 0; i++) {
384
	FLOAT8 w, s, t;
385
 
386
	w = wp[-10]; s = x2[-224] * w; t  = x1[ 224] * w;
387
	w = wp[-9]; s += x2[-160] * w; t += x1[ 160] * w;
388
	w = wp[-8]; s += x2[- 96] * w; t += x1[  96] * w;
389
	w = wp[-7]; s += x2[- 32] * w; t += x1[  32] * w;
390
	w = wp[-6]; s += x2[  32] * w; t += x1[- 32] * w;
391
	w = wp[-5]; s += x2[  96] * w; t += x1[- 96] * w;
392
	w = wp[-4]; s += x2[ 160] * w; t += x1[-160] * w;
393
	w = wp[-3]; s += x2[ 224] * w; t += x1[-224] * w;
394
 
395
	w = wp[-2]; s += x1[-256] * w; t -= x2[ 256] * w;
396
	w = wp[-1]; s += x1[-192] * w; t -= x2[ 192] * w;
397
	w = wp[ 0]; s += x1[-128] * w; t -= x2[ 128] * w;
398
	w = wp[ 1]; s += x1[- 64] * w; t -= x2[  64] * w;
399
	w = wp[ 2]; s += x1[   0] * w; t -= x2[   0] * w;
400
	w = wp[ 3]; s += x1[  64] * w; t -= x2[- 64] * w;
401
	w = wp[ 4]; s += x1[ 128] * w; t -= x2[-128] * w;
402
	w = wp[ 5]; s += x1[ 192] * w; t -= x2[-192] * w;
403
 
404
	/*
405
	 * this multiplyer could be removed, but it needs more 256 FLOAT data.
406
	 * thinking about the data cache performance, I think we should not
407
	 * use such a huge table. tt 2000/Oct/25
408
	 */
409
	s *= wp[6];
410
	w = t - s;
411
	a[30+i*2] = t + s;
412
	a[31+i*2] = wp[7] * w;
413
	wp += 18;
414
	x1--;
415
	x2++;
416
    }
417
    {
418
	FLOAT8 s,t,u,v;
419
	t  =  x1[- 16] * wp[-10];              s  = x1[ -32] * wp[-2];
420
	t += (x1[- 48] - x1[ 16]) * wp[-9];    s += x1[ -96] * wp[-1];
421
	t += (x1[- 80] + x1[ 48]) * wp[-8];    s += x1[-160] * wp[ 0];
422
	t += (x1[-112] - x1[ 80]) * wp[-7];    s += x1[-224] * wp[ 1];
423
	t += (x1[-144] + x1[112]) * wp[-6];    s -= x1[  32] * wp[ 2];
424
	t += (x1[-176] - x1[144]) * wp[-5];    s -= x1[  96] * wp[ 3];
425
	t += (x1[-208] + x1[176]) * wp[-4];    s -= x1[ 160] * wp[ 4];
426
	t += (x1[-240] - x1[208]) * wp[-3];    s -= x1[ 224];
427
 
428
	u = s - t;
429
	v = s + t;
430
 
431
	t = a[14];
432
	s = a[15] - t;
433
 
434
	a[31] = v + t;   // A0
435
	a[30] = u + s;   // A1
436
	a[15] = u - s;   // A2
437
	a[14] = v - t;   // A3
438
    }
439
{
440
    FLOAT8 xr;
441
    xr = a[28] - a[ 0]; a[ 0] += a[28]; a[28] = xr * wp[-2*18+7];
442
    xr = a[29] - a[ 1]; a[ 1] += a[29]; a[29] = xr * wp[-2*18+7];
443
 
444
    xr = a[26] - a[ 2]; a[ 2] += a[26]; a[26] = xr * wp[-4*18+7];
445
    xr = a[27] - a[ 3]; a[ 3] += a[27]; a[27] = xr * wp[-4*18+7];
446
 
447
    xr = a[24] - a[ 4]; a[ 4] += a[24]; a[24] = xr * wp[-6*18+7];
448
    xr = a[25] - a[ 5]; a[ 5] += a[25]; a[25] = xr * wp[-6*18+7];
449
 
450
    xr = a[22] - a[ 6]; a[ 6] += a[22]; a[22] = xr * SQRT2;
451
    xr = a[23] - a[ 7]; a[ 7] += a[23]; a[23] = xr * SQRT2 - a[ 7];
452
    a[ 7] -= a[ 6];
453
    a[22] -= a[ 7];
454
    a[23] -= a[22];
455
 
456
    xr = a[ 6]; a[ 6] = a[31] - xr; a[31] = a[31] + xr;
457
    xr = a[ 7]; a[ 7] = a[30] - xr; a[30] = a[30] + xr;
458
    xr = a[22]; a[22] = a[15] - xr; a[15] = a[15] + xr;
459
    xr = a[23]; a[23] = a[14] - xr; a[14] = a[14] + xr;
460
 
461
    xr = a[20] - a[ 8]; a[ 8] += a[20]; a[20] = xr * wp[-10*18+7];
462
    xr = a[21] - a[ 9]; a[ 9] += a[21]; a[21] = xr * wp[-10*18+7];
463
 
464
    xr = a[18] - a[10]; a[10] += a[18]; a[18] = xr * wp[-12*18+7];
465
    xr = a[19] - a[11]; a[11] += a[19]; a[19] = xr * wp[-12*18+7];
466
 
467
    xr = a[16] - a[12]; a[12] += a[16]; a[16] = xr * wp[-14*18+7];
468
    xr = a[17] - a[13]; a[13] += a[17]; a[17] = xr * wp[-14*18+7];
469
 
470
    xr = -a[20] + a[24]; a[20] += a[24]; a[24] = xr * wp[-12*18+7];
471
    xr = -a[21] + a[25]; a[21] += a[25]; a[25] = xr * wp[-12*18+7];
472
 
473
    xr = a[ 4] - a[ 8]; a[ 4] += a[ 8]; a[ 8] = xr * wp[-12*18+7];
474
    xr = a[ 5] - a[ 9]; a[ 5] += a[ 9]; a[ 9] = xr * wp[-12*18+7];
475
 
476
    xr = a[ 0] - a[12]; a[ 0] += a[12]; a[12] = xr * wp[-4*18+7];
477
    xr = a[ 1] - a[13]; a[ 1] += a[13]; a[13] = xr * wp[-4*18+7];
478
    xr = a[16] - a[28]; a[16] += a[28]; a[28] = xr * wp[-4*18+7];
479
    xr = -a[17] + a[29]; a[17] += a[29]; a[29] = xr * wp[-4*18+7];
480
 
481
    xr = SQRT2 * (a[ 2] - a[10]); a[ 2] += a[10]; a[10] = xr;
482
    xr = SQRT2 * (a[ 3] - a[11]); a[ 3] += a[11]; a[11] = xr;
483
    xr = SQRT2 * (-a[18] + a[26]); a[18] += a[26]; a[26] = xr - a[18];
484
    xr = SQRT2 * (-a[19] + a[27]); a[19] += a[27]; a[27] = xr - a[19];
485
 
486
    xr = a[ 2]; a[19] -= a[ 3]; a[ 3] -= xr; a[ 2] = a[31] - xr; a[31] += xr;
487
    xr = a[ 3]; a[11] -= a[19]; a[18] -= xr; a[ 3] = a[30] - xr; a[30] += xr;
488
    xr = a[18]; a[27] -= a[11]; a[19] -= xr; a[18] = a[15] - xr; a[15] += xr;
489
 
490
    xr = a[19]; a[10] -= xr; a[19] = a[14] - xr; a[14] += xr;
491
    xr = a[10]; a[11] -= xr; a[10] = a[23] - xr; a[23] += xr;
492
    xr = a[11]; a[26] -= xr; a[11] = a[22] - xr; a[22] += xr;
493
    xr = a[26]; a[27] -= xr; a[26] = a[ 7] - xr; a[ 7] += xr;
494
 
495
    xr = a[27]; a[27] = a[ 6] - xr; a[ 6] += xr;
496
 
497
    xr = SQRT2 * (a[ 0] - a[ 4]); a[ 0] += a[ 4]; a[ 4] = xr;
498
    xr = SQRT2 * (a[ 1] - a[ 5]); a[ 1] += a[ 5]; a[ 5] = xr;
499
    xr = SQRT2 * (a[16] - a[20]); a[16] += a[20]; a[20] = xr;
500
    xr = SQRT2 * (a[17] - a[21]); a[17] += a[21]; a[21] = xr;
501
 
502
    xr = -SQRT2 * (a[ 8] - a[12]); a[ 8] += a[12]; a[12] = xr - a[ 8];
503
    xr = -SQRT2 * (a[ 9] - a[13]); a[ 9] += a[13]; a[13] = xr - a[ 9];
504
    xr = -SQRT2 * (a[25] - a[29]); a[25] += a[29]; a[29] = xr - a[25];
505
    xr = -SQRT2 * (a[24] + a[28]); a[24] -= a[28]; a[28] = xr - a[24];
506
 
507
    xr = a[24] - a[16]; a[24] = xr;
508
    xr = a[20] - xr;    a[20] = xr;
509
    xr = a[28] - xr;    a[28] = xr;
510
 
511
    xr = a[25] - a[17]; a[25] = xr;
512
    xr = a[21] - xr;    a[21] = xr;
513
    xr = a[29] - xr;    a[29] = xr;
514
 
515
    xr = a[17] - a[ 1]; a[17] = xr;
516
    xr = a[ 9] - xr;    a[ 9] = xr;
517
    xr = a[25] - xr;    a[25] = xr;
518
    xr = a[ 5] - xr;    a[ 5] = xr;
519
    xr = a[21] - xr;    a[21] = xr;
520
    xr = a[13] - xr;    a[13] = xr;
521
    xr = a[29] - xr;    a[29] = xr;
522
 
523
    xr = a[ 1] - a[ 0]; a[ 1] = xr;
524
    xr = a[16] - xr;    a[16] = xr;
525
    xr = a[17] - xr;    a[17] = xr;
526
    xr = a[ 8] - xr;    a[ 8] = xr;
527
    xr = a[ 9] - xr;    a[ 9] = xr;
528
    xr = a[24] - xr;    a[24] = xr;
529
    xr = a[25] - xr;    a[25] = xr;
530
    xr = a[ 4] - xr;    a[ 4] = xr;
531
    xr = a[ 5] - xr;    a[ 5] = xr;
532
    xr = a[20] - xr;    a[20] = xr;
533
    xr = a[21] - xr;    a[21] = xr;
534
    xr = a[12] - xr;    a[12] = xr;
535
    xr = a[13] - xr;    a[13] = xr;
536
    xr = a[28] - xr;    a[28] = xr;
537
    xr = a[29] - xr;    a[29] = xr;
538
 
539
    xr = a[ 0]; a[ 0] += a[31]; a[31] -= xr;
540
    xr = a[ 1]; a[ 1] += a[30]; a[30] -= xr;
541
    xr = a[16]; a[16] += a[15]; a[15] -= xr;
542
    xr = a[17]; a[17] += a[14]; a[14] -= xr;
543
    xr = a[ 8]; a[ 8] += a[23]; a[23] -= xr;
544
    xr = a[ 9]; a[ 9] += a[22]; a[22] -= xr;
545
    xr = a[24]; a[24] += a[ 7]; a[ 7] -= xr;
546
    xr = a[25]; a[25] += a[ 6]; a[ 6] -= xr;
547
    xr = a[ 4]; a[ 4] += a[27]; a[27] -= xr;
548
    xr = a[ 5]; a[ 5] += a[26]; a[26] -= xr;
549
    xr = a[20]; a[20] += a[11]; a[11] -= xr;
550
    xr = a[21]; a[21] += a[10]; a[10] -= xr;
551
    xr = a[12]; a[12] += a[19]; a[19] -= xr;
552
    xr = a[13]; a[13] += a[18]; a[18] -= xr;
553
    xr = a[28]; a[28] += a[ 3]; a[ 3] -= xr;
554
    xr = a[29]; a[29] += a[ 2]; a[ 2] -= xr;
555
}
556
 
557
}
558
 
559
 
560
/*-------------------------------------------------------------------*/
561
/*                                                                   */
562
/*   Function: Calculation of the MDCT                               */
563
/*   In the case of long blocks (type 0,1,3) there are               */
564
/*   36 coefficents in the time domain and 18 in the frequency       */
565
/*   domain.                                                         */
566
/*   In the case of short blocks (type 2) there are 3                */
567
/*   transformations with short length. This leads to 12 coefficents */
568
/*   in the time and 6 in the frequency domain. In this case the     */
569
/*   results are stored side by side in the vector out[].            */
570
/*                                                                   */
571
/*   New layer3                                                      */
572
/*                                                                   */
573
/*-------------------------------------------------------------------*/
574
 
575
inline static void mdct_short(FLOAT8 *inout)
576
{
577
    int l;
578
    for ( l = 0; l < 3; l++ ) {
579
	FLOAT8 tc0,tc1,tc2,ts0,ts1,ts2;
580
 
581
	ts0 = inout[2*3] * win[SHORT_TYPE][0] - inout[5*3];
582
	tc0 = inout[0*3] * win[SHORT_TYPE][2] - inout[3*3];
583
	tc1 = ts0 + tc0;
584
	tc2 = ts0 - tc0;
585
 
586
	ts0 = inout[5*3] * win[SHORT_TYPE][0] + inout[2*3];
587
	tc0 = inout[3*3] * win[SHORT_TYPE][2] + inout[0*3];
588
	ts1 = ts0 + tc0;
589
	ts2 = -ts0 + tc0;
590
 
591
	tc0 = (inout[1*3] * win[SHORT_TYPE][1] - inout[4*3]) * 2.069978111953089e-11; /* tritab_s[1] */
592
	ts0 = (inout[4*3] * win[SHORT_TYPE][1] + inout[1*3]) * 2.069978111953089e-11; /* tritab_s[1] */
593
 
594
	inout[3*0] = tc1 * 1.907525191737280e-11 /* tritab_s[2] */ + tc0;
595
	inout[3*5] = -ts1 * 1.907525191737280e-11 /* tritab_s[0] */ + ts0;
596
 
597
	tc2 = tc2 * 0.86602540378443870761 * 1.907525191737281e-11 /* tritab_s[2] */;
598
	ts1 = ts1 * 0.5 * 1.907525191737281e-11 + ts0;
599
	inout[3*1] = tc2-ts1;
600
	inout[3*2] = tc2+ts1;
601
 
602
	tc1 = tc1 * 0.5 * 1.907525191737281e-11 - tc0;
603
	ts2 = ts2 * 0.86602540378443870761 * 1.907525191737281e-11 /* tritab_s[0] */;
604
	inout[3*3] = tc1+ts2;
605
	inout[3*4] = tc1-ts2;
606
 
607
	inout++;
608
    }
609
}
610
 
611
inline static void mdct_long(FLOAT8 *out, FLOAT8 *in)
612
{
613
    FLOAT8 ct,st;
614
  {
615
    FLOAT8 tc1, tc2, tc3, tc4, ts5, ts6, ts7, ts8;
616
    // 1,2, 5,6, 9,10, 13,14, 17
617
    tc1 = in[17]-in[ 9];
618
    tc3 = in[15]-in[11];
619
    tc4 = in[14]-in[12];
620
    ts5 = in[ 0]+in[ 8];
621
    ts6 = in[ 1]+in[ 7];
622
    ts7 = in[ 2]+in[ 6];
623
    ts8 = in[ 3]+in[ 5];
624
 
625
    out[17] = (ts5+ts7-ts8)-(ts6-in[4]);
626
    st = (ts5+ts7-ts8)*cx[7]+(ts6-in[4]);
627
    ct = (tc1-tc3-tc4)*cx[6];
628
    out[5] = ct+st;
629
    out[6] = ct-st;
630
 
631
    tc2 = (in[16]-in[10])*cx[6];
632
    ts6 = ts6*cx[7] + in[4];
633
    ct =  tc1*cx[0] + tc2 + tc3*cx[1] + tc4*cx[2];
634
    st = -ts5*cx[4] + ts6 - ts7*cx[5] + ts8*cx[3];
635
    out[1] = ct+st;
636
    out[2] = ct-st;
637
 
638
    ct =  tc1*cx[1] - tc2 - tc3*cx[2] + tc4*cx[0];
639
    st = -ts5*cx[5] + ts6 - ts7*cx[3] + ts8*cx[4];
640
    out[ 9] = ct+st;
641
    out[10] = ct-st;
642
 
643
    ct = tc1*cx[2] - tc2 + tc3*cx[0] - tc4*cx[1];
644
    st = ts5*cx[3] - ts6 + ts7*cx[4] - ts8*cx[5];
645
    out[13] = ct+st;
646
    out[14] = ct-st;
647
  }
648
  {
649
    FLOAT8 ts1, ts2, ts3, ts4, tc5, tc6, tc7, tc8;
650
 
651
    ts1 = in[ 8]-in[ 0];
652
    ts3 = in[ 6]-in[ 2];
653
    ts4 = in[ 5]-in[ 3];
654
    tc5 = in[17]+in[ 9];
655
    tc6 = in[16]+in[10];
656
    tc7 = in[15]+in[11];
657
    tc8 = in[14]+in[12];
658
 
659
    out[0]  = (tc5+tc7+tc8)+(tc6+in[13]);
660
    ct = (tc5+tc7+tc8)*cx[7]-(tc6+in[13]);
661
    st = (ts1-ts3+ts4)*cx[6];
662
    out[11] = ct+st;
663
    out[12] = ct-st;
664
 
665
    ts2 = (in[7]-in[1])*cx[6];
666
    tc6 = in[13] - tc6*cx[7];
667
    ct = tc5*cx[3] - tc6 + tc7*cx[4] + tc8*cx[5];
668
    st = ts1*cx[2] + ts2 + ts3*cx[0] + ts4*cx[1];
669
    out[3] = ct+st;
670
    out[4] = ct-st;
671
 
672
    ct = -tc5*cx[5] + tc6 - tc7*cx[3] - tc8*cx[4];
673
    st =  ts1*cx[1] + ts2 - ts3*cx[2] - ts4*cx[0];
674
    out[7] = ct+st;
675
    out[8] = ct-st;
676
 
677
    ct = -tc5*cx[4] + tc6 - tc7*cx[5] - tc8*cx[3];
678
    st =  ts1*cx[0] - ts2 + ts3*cx[1] - ts4*cx[2];
679
    out[15] = ct+st;
680
    out[16] = ct-st;
681
  }
682
}
683
 
684
 
685
void mdct_sub48( lame_internal_flags *gfc, const sample_t *w0, const sample_t *w1, 
686
                 FLOAT8 mdct_freq[2][2][576] )
687
{
688
    int gr, k, ch;
689
    const sample_t *wk;
690
 
691
    wk = w0 + 286;
692
    /* thinking cache performance, ch->gr loop is better than gr->ch loop */
693
    for (ch = 0; ch < gfc->channels_out; ch++) {
694
	for (gr = 0; gr < gfc->mode_gr; gr++) {
695
	    int	band;
696
	    FLOAT8 *mdct_enc = &mdct_freq[gr][ch][0];
697
	    gr_info *gi = &(gfc->l3_side.gr[gr].ch[ch].tt);
698
	    FLOAT8 *samp = gfc->sb_sample[ch][1 - gr][0];
699
 
700
	    for (k = 0; k < 18 / 2; k++) {
701
		window_subband(wk, samp);
702
		window_subband(wk + 32, samp + 32);
703
		samp += 64;
704
		wk += 64;
705
		/*
706
		 * Compensate for inversion in the analysis filter
707
		 */
708
		for (band = 1; band < 32; band+=2) {
709
		    samp[band-32] *= -1;
710
		}
711
	    }
712
 
713
 
714
	    /* apply filters on the polyphase filterbank outputs */
715
	    /* bands <= gfc->highpass_band will be zeroed out below */
716
	    /* bands >= gfc->lowpass_band  will be zeroed out below */
717
	    if (gfc->filter_type==0) {
718
              for (band=gfc->highpass_start_band;  band <= gfc->highpass_end_band; band++) { 
719
		  for (k=0; k<18; k++) 
720
		    gfc->sb_sample[ch][1-gr][k][order[band]]*=gfc->amp_highpass[band];
721
	      }
722
              for (band=gfc->lowpass_start_band;  band <= gfc->lowpass_end_band; band++) { 
723
		  for (k=0; k<18; k++) 
724
		    gfc->sb_sample[ch][1-gr][k][order[band]]*=gfc->amp_lowpass[band];
725
	      }
726
	    }
727
 
728
 
729
 
730
	    /*
731
	     * Perform imdct of 18 previous subband samples
732
	     * + 18 current subband samples
733
	     */
734
	    for (band = 0; band < 32; band++, mdct_enc += 18) {
735
		int type = gi->block_type;
736
		FLOAT8 *band0, *band1;
737
		band0 = gfc->sb_sample[ch][  gr][0] + order[band];
738
		band1 = gfc->sb_sample[ch][1-gr][0] + order[band];
739
		if (gi->mixed_block_flag && band < 2)
740
		    type = 0;
741
		if (band >= gfc->lowpass_band || band <= gfc->highpass_band) {
742
		    memset((char *)mdct_enc,0,18*sizeof(FLOAT8));
743
		} else {
744
		  if (type == SHORT_TYPE) {
745
		    for (k = -NS/4; k < 0; k++) {
746
			FLOAT8 w = win[SHORT_TYPE][k+3];
747
			mdct_enc[k*3+ 9] = band0[( 9+k)*32] * w - band0[( 8-k)*32];
748
			mdct_enc[k*3+18] = band0[(14-k)*32] * w + band0[(15+k)*32];
749
			mdct_enc[k*3+10] = band0[(15+k)*32] * w - band0[(14-k)*32];
750
			mdct_enc[k*3+19] = band1[( 2-k)*32] * w + band1[( 3+k)*32];
751
			mdct_enc[k*3+11] = band1[( 3+k)*32] * w - band1[( 2-k)*32];
752
			mdct_enc[k*3+20] = band1[( 8-k)*32] * w + band1[( 9+k)*32];
753
		    }
754
		    mdct_short(mdct_enc);
755
		  } else {
756
		    FLOAT8 work[18];
757
		    for (k = -NL/4; k < 0; k++) {
758
			FLOAT8 a, b;
759
			a = win[type][k+27] * band1[(k+9)*32]
760
			  + win[type][k+36] * band1[(8-k)*32];
761
			b = win[type][k+ 9] * band0[(k+9)*32]
762
			  - win[type][k+18] * band0[(8-k)*32];
763
			work[k+ 9] = a - b*tantab_l[k+9];
764
			work[k+18] = a*tantab_l[k+9] + b;
765
		    }
766
 
767
		    mdct_long(mdct_enc, work);
768
		  }
769
		}
770
		/*
771
		 * Perform aliasing reduction butterfly
772
		 */
773
		if (type != SHORT_TYPE) {
774
		  if (band == 0)
775
		    continue;
776
		  for (k = 7; k >= 0; --k) {
777
		    FLOAT8 bu,bd;
778
		    bu = mdct_enc[k] * ca[k] + mdct_enc[-1-k] * cs[k];
779
		    bd = mdct_enc[k] * cs[k] - mdct_enc[-1-k] * ca[k];
780
 
781
		    mdct_enc[-1-k] = bu;
782
		    mdct_enc[k]    = bd;
783
		  }
784
		}
785
	      }
786
	}
787
	wk = w1 + 286;
788
	if (gfc->mode_gr == 1) {
789
	    memcpy(gfc->sb_sample[ch][0], gfc->sb_sample[ch][1], 576 * sizeof(FLOAT8));
790
	}
791
    }
792
}