00001 #include <stdio.h>
00002 #include <string.h>
00003 #include <math.h>
00004 #include "common.h"
00005 #include "encoder.h"
00006 #include "mem.h"
00007 #include "bitstream.h"
00008 #include "encode.h"
00009 #include "enwindow.h"
00010 #include "subband.h"
00011
00012
00013 #ifdef REFERENCECODE
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 void window_subband (short **buffer, double z[64], int k)
00029 {
00030 typedef double XX[2][HAN_SIZE];
00031 static XX *x;
00032 double *xk;
00033 int i;
00034 static int off[2] = { 0, 0 };
00035 static char init = 0;
00036 double t;
00037 double *ep0, *ep1, *ep2, *ep3, *ep4, *ep5, *ep6, *ep7;
00038 if (!init) {
00039 x = (XX *) mem_alloc (sizeof (XX), "x");
00040 memset (x, 0, 2 * HAN_SIZE * sizeof (double));
00041 init = 1;
00042 }
00043 xk = (*x)[k];
00044
00045
00046 for (i = 0; i < 32; i++)
00047 xk[31 - i + off[k]] = (double) *(*buffer)++ / SCALE;
00048
00049 ep0 = &enwindow[0];
00050 ep1 = &enwindow[64];
00051 ep2 = &enwindow[128];
00052 ep3 = &enwindow[192];
00053 ep4 = &enwindow[256];
00054 ep5 = &enwindow[320];
00055 ep6 = &enwindow[384];
00056 ep7 = &enwindow[448];
00057
00058
00059 for (i = 0; i < 64; i++) {
00060 t = xk[(i + off[k]) & (512 - 1)] * *ep0++;
00061 t += xk[(i + 64 + off[k]) & (512 - 1)] * *ep1++;
00062 t += xk[(i + 128 + off[k]) & (512 - 1)] * *ep2++;
00063 t += xk[(i + 192 + off[k]) & (512 - 1)] * *ep3++;
00064 t += xk[(i + 256 + off[k]) & (512 - 1)] * *ep4++;
00065 t += xk[(i + 320 + off[k]) & (512 - 1)] * *ep5++;
00066 t += xk[(i + 384 + off[k]) & (512 - 1)] * *ep6++;
00067 t += xk[(i + 448 + off[k]) & (512 - 1)] * *ep7++;
00068 z[i] = t;
00069 }
00070
00071 off[k] += 480;
00072 off[k] &= HAN_SIZE - 1;
00073
00074 }
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 void filter_subband (double z[HAN_SIZE], double s[SBLIMIT])
00091 {
00092 double yprime[32];
00093 register int i, j;
00094
00095 static double m[16][32];
00096 static int init = 0;
00097
00098 if (init == 0) {
00099 init++;
00100 create_dct_matrix (m);
00101 }
00102
00103 yprime[0] = z[16];
00104 for (i = 1; i <= 16; i++)
00105 yprime[i] = z[i + 16] + z[16 - i];
00106 for (i = 17; i <= 31; i++)
00107 yprime[i] = z[i + 16] - z[80 - i];
00108
00109 for (i = 15; i >= 0; i--) {
00110 register double s0 = 0.0, s1 = 0.0;
00111 register double *mp = m[i];
00112 register double *xinp = yprime;
00113 for (j = 0; j < 8; j++) {
00114 s0 += *mp++ * *xinp++;
00115 s1 += *mp++ * *xinp++;
00116 s0 += *mp++ * *xinp++;
00117 s1 += *mp++ * *xinp++;
00118 }
00119 s[i] = s0 + s1;
00120 s[31 - i] = s0 - s1;
00121 }
00122 }
00123 #endif //REFERENCECODE
00124
00125 void create_dct_matrix (double filter[16][32])
00126 {
00127 register int i, k;
00128
00129 for (i = 0; i < 16; i++)
00130 for (k = 0; k < 32; k++) {
00131 if ((filter[i][k] = 1e9 * cos ((double) ((2 * i + 1) * k * PI64))) >= 0)
00132 modf (filter[i][k] + 0.5, &filter[i][k]);
00133 else
00134 modf (filter[i][k] - 0.5, &filter[i][k]);
00135 filter[i][k] *= 1e-9;
00136 }
00137 }
00138
00139
00140 #ifdef NEWWS
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152 void window_subband12 (short **buffer, int ch)
00153 {
00154 static double x[2][864];
00155 double *xk;
00156 double t[12];
00157 double y[12][64];
00158 int i, j, k, m;
00159 static double c[512];
00160 static int init = 0;
00161 double c0;
00162
00163 xk = x[ch];
00164
00165
00166 for (i = 863; i >= 384; i--)
00167 xk[i] = xk[i - 384];
00168 for (i = 383; i >= 0; i--)
00169 xk[i] = (double) *(*buffer)++ / SCALE;
00170
00171 for (j = 0; j < 64; j++) {
00172 for (k = 0; k < 12; k++)
00173 t[k] = 0;
00174 for (i = 0; i < 8; i++) {
00175 m = i * 64 + j;
00176 c0 = c[m];
00177 t[0] += c0 * xk[m + 352];
00178 t[1] += c0 * xk[m + 320];
00179 t[2] += c0 * xk[m + 288];
00180 t[3] += c0 * xk[m + 256];
00181 t[4] += c0 * xk[m + 224];
00182 t[5] += c0 * xk[m + 192];
00183 t[6] += c0 * xk[m + 160];
00184 t[7] += c0 * xk[m + 128];
00185 t[8] += c0 * xk[m + 96];
00186 t[9] += c0 * xk[m + 64];
00187 t[10] += c0 * xk[m + 32];
00188 t[11] += c0 * xk[m];
00189 }
00190 for (i = 0; i < 12; i++) {
00191 y[i][j] = t[i];
00192 }
00193 }
00194 }
00195 #endif
00196
00197
00198
00199
00200
00201 void WindowFilterSubband (short *pBuffer, int ch, double s[SBLIMIT])
00202 {
00203 register int i, j;
00204 int pa, pb, pc, pd, pe, pf, pg, ph;
00205 double t;
00206 double *dp, *dp2;
00207 double *pEnw;
00208 double y[64];
00209 double yprime[32];
00210
00211 static double x[2][512];
00212 static double m[16][32];
00213 static int init = 0;
00214 static int off[2];
00215 static int half[2];
00216
00217 if (init == 0) {
00218 init++;
00219 off[0] = 0;
00220 off[1] = 0;
00221 half[0] = 0;
00222 half[1] = 0;
00223 for (i = 0; i < 2; i++)
00224 for (j = 0; j < 512; j++)
00225 x[i][j] = 0;
00226 create_dct_matrix (m);
00227 }
00228
00229 dp = x[ch] + off[ch] + half[ch] * 256;
00230
00231
00232 for (i = 0; i < 32; i++)
00233 dp[(31 - i) * 8] = (double) pBuffer[i] / SCALE;
00234
00235
00236 dp = (x[ch] + half[ch] * 256);
00237 pa = off[ch];
00238 pb = (pa + 1) % 8;
00239 pc = (pa + 2) % 8;
00240 pd = (pa + 3) % 8;
00241 pe = (pa + 4) % 8;
00242 pf = (pa + 5) % 8;
00243 pg = (pa + 6) % 8;
00244 ph = (pa + 7) % 8;
00245
00246 for (i = 0; i < 32; i++) {
00247 dp2 = dp + i * 8;
00248 pEnw = enwindow + i;
00249 t = dp2[pa] * pEnw[0];
00250 t += dp2[pb] * pEnw[64];
00251 t += dp2[pc] * pEnw[128];
00252 t += dp2[pd] * pEnw[192];
00253 t += dp2[pe] * pEnw[256];
00254 t += dp2[pf] * pEnw[320];
00255 t += dp2[pg] * pEnw[384];
00256 t += dp2[ph] * pEnw[448];
00257 y[i] = t;
00258 }
00259
00260 yprime[0] = y[16];
00261
00262 dp = half[ch] ? x[ch] : (x[ch] + 256);
00263 pa = half[ch] ? (off[ch] + 1) & 7 : off[ch];
00264 pb = (pa + 1) % 8;
00265 pc = (pa + 2) % 8;
00266 pd = (pa + 3) % 8;
00267 pe = (pa + 4) % 8;
00268 pf = (pa + 5) % 8;
00269 pg = (pa + 6) % 8;
00270 ph = (pa + 7) % 8;
00271
00272 for (i = 0; i < 32; i++) {
00273 dp2 = dp + i * 8;
00274 pEnw = enwindow + i + 32;
00275 t = dp2[pa] * pEnw[0];
00276 t += dp2[pb] * pEnw[64];
00277 t += dp2[pc] * pEnw[128];
00278 t += dp2[pd] * pEnw[192];
00279 t += dp2[pe] * pEnw[256];
00280 t += dp2[pf] * pEnw[320];
00281 t += dp2[pg] * pEnw[384];
00282 t += dp2[ph] * pEnw[448];
00283 y[i + 32] = t;
00284
00285 if (i > 0 && i < 17)
00286 yprime[i] = y[i + 16] + y[16 - i];
00287 }
00288
00289
00290 for (i = 17; i < 32; i++)
00291 yprime[i] = y[i + 16] - y[80 - i];
00292
00293 for (i = 15; i >= 0; i--) {
00294 register double s0 = 0.0, s1 = 0.0;
00295 register double *mp = m[i];
00296 register double *xinp = yprime;
00297 for (j = 0; j < 8; j++) {
00298 s0 += *mp++ * *xinp++;
00299 s1 += *mp++ * *xinp++;
00300 s0 += *mp++ * *xinp++;
00301 s1 += *mp++ * *xinp++;
00302 }
00303 s[i] = s0 + s1;
00304 s[31 - i] = s0 - s1;
00305 }
00306
00307 half[ch] = (half[ch] + 1) & 1;
00308 if (half[ch] == 1)
00309 off[ch] = (off[ch] + 7) & 7;
00310 }