00001 #include "common.h"
00002 #include "encoder.h"
00003
00004 void IDCT32 (double *, double *, int);
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #define NEWWS
00018 void window_subband12 (short **buffer, int ch)
00019 {
00020 static double x[2][864];
00021 double *xk;
00022 double t[12];
00023 double y[12][64];
00024 int i, j, k, m;
00025 static double c[512];
00026 static int init = 0;
00027 double c0;
00028
00029 if (!init) {
00030 read_ana_window (c);
00031 printf ("done init\n");
00032 init++;
00033 }
00034
00035 xk = x[ch];
00036
00037
00038 for (i = 863; i >= 384; i--)
00039 xk[i] = xk[i - 384];
00040 for (i = 383; i >= 0; i--)
00041 xk[i] = (double) *(*buffer)++ / SCALE;
00042
00043 for (j = 0; j < 64; j++) {
00044 for (k = 0; k < 12; k++)
00045 t[k] = 0;
00046 for (i = 0; i < 8; i++) {
00047 m = i * 64 + j;
00048 c0 = c[m];
00049 t[0] += c0 * xk[m + 352];
00050 t[1] += c0 * xk[m + 320];
00051 t[2] += c0 * xk[m + 288];
00052 t[3] += c0 * xk[m + 256];
00053 t[4] += c0 * xk[m + 224];
00054 t[5] += c0 * xk[m + 192];
00055 t[6] += c0 * xk[m + 160];
00056 t[7] += c0 * xk[m + 128];
00057 t[8] += c0 * xk[m + 96];
00058 t[9] += c0 * xk[m + 64];
00059 t[10] += c0 * xk[m + 32];
00060 t[11] += c0 * xk[m];
00061 }
00062 for (i = 0; i < 12; i++) {
00063 y[i][j] = t[i];
00064 }
00065 }
00066 #define DB1x
00067 #ifdef DB1
00068 for (i = 0; i < 12; i++) {
00069 printf ("--%i--\n", i);
00070 for (j = 0; j < 64; j++) {
00071 printf ("%f\t", y[i][j]);
00072 if ((j + 1) % 4 == 0)
00073 printf ("\n");
00074 }
00075 }
00076 exit (0);
00077 #endif
00078 }
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089 void read_ana_window (ana_win)
00090 double ana_win[HAN_SIZE];
00091 {
00092 int i, j[4];
00093 FILE *fp;
00094 double f[4];
00095 char t[150];
00096
00097 if (!(fp = OpenTableFile ("enwindow"))) {
00098 printf ("Please check analysis window table 'enwindow'\n");
00099 exit (1);
00100 }
00101 for (i = 0; i < 512; i += 4) {
00102 fgets (t, 150, fp);
00103 sscanf (t, "C[%d] = %lf C[%d] = %lf C[%d] = %lf C[%d] = %lf\n", j, f,
00104 j + 1, f + 1, j + 2, f + 2, j + 3, f + 3);
00105 if (i == j[0]) {
00106 ana_win[i] = f[0];
00107 ana_win[i + 1] = f[1];
00108 ana_win[i + 2] = f[2];
00109 ana_win[i + 3] = f[3];
00110 } else {
00111 printf ("Check index in analysis window table\n");
00112 exit (1);
00113 }
00114 fgets (t, 150, fp);
00115 }
00116 fclose (fp);
00117 }
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 #ifdef COMBWS
00133 void window_subband (short **buffer, double s[SBLIMIT], int k, int sblimit)
00134 {
00135 typedef double XX[2][HAN_SIZE];
00136 static XX *x;
00137 double *xk;
00138 int i;
00139 static int off[2] = { 0, 0 };
00140 static char init = 0;
00141 double t;
00142 static double enwindow[512];
00143 double *ep0, *ep1, *ep2, *ep3, *ep4, *ep5, *ep6, *ep7;
00144 double z[64];
00145 double yprime[32];
00146 if (!init) {
00147 read_ana_window (enwindow);
00148 x = (XX *) mem_alloc (sizeof (XX), "x");
00149 memset (x, 0, 2 * HAN_SIZE * sizeof (double));
00150 init = 1;
00151 }
00152 xk = (*x)[k];
00153
00154
00155 for (i = 0; i < 32; i++)
00156 xk[31 - i + off[k]] = (double) *(*buffer)++ / SCALE;
00157
00158 ep0 = &enwindow[0];
00159 ep1 = &enwindow[64];
00160 ep2 = &enwindow[128];
00161 ep3 = &enwindow[192];
00162 ep4 = &enwindow[256];
00163 ep5 = &enwindow[320];
00164 ep6 = &enwindow[384];
00165 ep7 = &enwindow[448];
00166
00167
00168 for (i = 0; i < 64; i++) {
00169 t = xk[(i + off[k]) & (512 - 1)] * *ep0++;
00170 t += xk[(i + 64 + off[k]) & (512 - 1)] * *ep1++;
00171 t += xk[(i + 128 + off[k]) & (512 - 1)] * *ep2++;
00172 t += xk[(i + 192 + off[k]) & (512 - 1)] * *ep3++;
00173 t += xk[(i + 256 + off[k]) & (512 - 1)] * *ep4++;
00174 t += xk[(i + 320 + off[k]) & (512 - 1)] * *ep5++;
00175 t += xk[(i + 384 + off[k]) & (512 - 1)] * *ep6++;
00176 t += xk[(i + 448 + off[k]) & (512 - 1)] * *ep7++;
00177 z[i] = t;
00178 }
00179
00180 off[k] += 480;
00181 off[k] &= HAN_SIZE - 1;
00182
00183 yprime[0] = z[16];
00184 for (i = 1; i <= 16; i++)
00185 yprime[i] = z[i + 16] + z[16 - i];
00186 for (i = 17; i <= 31; i++)
00187 yprime[i] = z[i + 16] - z[80 - i];
00188 IDCT32 (yprime, s, sblimit);
00189
00190 }
00191 #else
00192 void window_subband (short **buffer, double z[64], int k)
00193 {
00194 typedef double XX[2][HAN_SIZE];
00195 static XX *x;
00196 double *xk;
00197 int i;
00198 static int off[2] = { 0, 0 };
00199 static char init = 0;
00200 double t;
00201 static double enwindow[512];
00202 double *ep0, *ep1, *ep2, *ep3, *ep4, *ep5, *ep6, *ep7;
00203 if (!init) {
00204 read_ana_window (enwindow);
00205 x = (XX *) mem_alloc (sizeof (XX), "x");
00206 memset (x, 0, 2 * HAN_SIZE * sizeof (double));
00207 init = 1;
00208 }
00209 xk = (*x)[k];
00210
00211
00212
00213
00214
00215
00216 {
00217 register double *xk_t = xk + off[k];
00218 for (i = 32; i--;)
00219 xk_t[i] = (double) *(*buffer)++;
00220 }
00221
00222 ep0 = &enwindow[0];
00223 ep1 = &enwindow[64];
00224 ep2 = &enwindow[128];
00225 ep3 = &enwindow[192];
00226 ep4 = &enwindow[256];
00227 ep5 = &enwindow[320];
00228 ep6 = &enwindow[384];
00229 ep7 = &enwindow[448];
00230
00231
00232 for (i = 0; i < 64; i++) {
00233 t = xk[(i + off[k]) & (512 - 1)] * *ep0++;
00234 t += xk[(i + 64 + off[k]) & (512 - 1)] * *ep1++;
00235 t += xk[(i + 128 + off[k]) & (512 - 1)] * *ep2++;
00236 t += xk[(i + 192 + off[k]) & (512 - 1)] * *ep3++;
00237 t += xk[(i + 256 + off[k]) & (512 - 1)] * *ep4++;
00238 t += xk[(i + 320 + off[k]) & (512 - 1)] * *ep5++;
00239 t += xk[(i + 384 + off[k]) & (512 - 1)] * *ep6++;
00240 t += xk[(i + 448 + off[k]) & (512 - 1)] * *ep7++;
00241 z[i] = t;
00242 }
00243
00244 off[k] += 480;
00245 off[k] &= HAN_SIZE - 1;
00246
00247 }
00248 #endif
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 void create_ana_filter (filter)
00263 double filter[SBLIMIT][64];
00264 {
00265 register int i, k;
00266
00267 for (i = 0; i < 32; i++)
00268 for (k = 0; k < 64; k++) {
00269 if ((filter[i][k] =
00270 1e9 * cos ((double) ((2 * i + 1) * (16 - k) * PI64))) >= 0)
00271 modf (filter[i][k] + 0.5, &filter[i][k]);
00272 else
00273 modf (filter[i][k] - 0.5, &filter[i][k]);
00274 filter[i][k] *= 1e-9;
00275 }
00276 }
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291 void create_dct_matrix (filter)
00292 double filter[16][32];
00293 {
00294 register int i, k;
00295
00296 for (i = 0; i < 16; i++)
00297 for (k = 0; k < 32; k++) {
00298 if ((filter[i][k] = 1e9 * cos ((double) ((2 * i + 1) * k * PI64))) >= 0)
00299 modf (filter[i][k] + 0.5, &filter[i][k]);
00300 else
00301 modf (filter[i][k] - 0.5, &filter[i][k]);
00302 filter[i][k] *= 1e-9;
00303 filter[i][k] /= (double) SCALE;
00304 }
00305
00306
00307 }
00308
00309 void IDCT32 (xin, xout, sblimit)
00310 double *xin, *xout;
00311 int sblimit;
00312 {
00313 int i, j;
00314 double s0, s1;
00315 typedef double MM[16][32];
00316 static MM *m = 0;
00317 if (m == 0) {
00318 m = (MM *) mem_alloc (sizeof (MM), "filter");
00319 create_dct_matrix (*m);
00320 }
00321
00322
00323
00324
00325 for (i = ((sblimit > 16) ? SBLIMIT - sblimit : sblimit); i--;) {
00326 s0 = 0.0;
00327 for (j = 0; j < 32; j++) {
00328 s0 += (*m)[i][j] * xin[j + 0];
00329 }
00330 xout[i] = s0;
00331 }
00332 for (i = SBLIMIT - sblimit; i < 16; i++) {
00333 s0 = s1 = 0.0;
00334 for (j = 0; j < 32; j += 2) {
00335 s0 += (*m)[i][j] * xin[j];
00336 s1 += (*m)[i][j + 1] * xin[j + 1];
00337 }
00338 xout[i] = s0 + s1;
00339 xout[31 - i] = s0 - s1;
00340 }
00341
00342
00343
00344 }
00345
00346 void filter_subband (z, s, sblimit)
00347 double z[HAN_SIZE], s[SBLIMIT];
00348 int sblimit;
00349 {
00350 double yprime[32];
00351 int i, j;
00352
00353 {
00354 yprime[0] = z[16];
00355 for (i = 1; i <= 16; i++)
00356 yprime[i] = z[i + 16] + z[16 - i];
00357 for (i = 17; i <= 31; i++)
00358 yprime[i] = z[i + 16] - z[80 - i];
00359 IDCT32 (yprime, s, sblimit);
00360 }
00361 }