Ejemplo n.º 1
0
// 2D DCT of a 8x8 patches. The result is restored in-place.
// flag: 1/-1 forward/inverse transforms.
void DCT2D(vector< vector< float > >& patch1, int flag)
{
    std::vector< vector< float > > tmp1;
    tmp1.resize(PATCHSIZE);
    std::vector< vector< float > > tmp2;
    tmp2.resize(PATCHSIZE);
    for (int i = 0; i < PATCHSIZE; i ++) {
        tmp1[i].resize(PATCHSIZE);
        tmp2[i].resize(PATCHSIZE);
    }

    // transform row by row
    for (int j = 0; j < PATCHSIZE; j ++) {
        DCT1D(patch1[j], tmp1[j], flag);
    }

    // transform column by column
    // (by transposing the matrix,
    // transforming row by row, and
    // transposing again the matrix.)
    for (int j = 0; j < PATCHSIZE; j ++) {
        for (int i = 0; i < PATCHSIZE; i ++)
            tmp2[j][i] = tmp1[i][j];
    }
    for (int j = 0; j < PATCHSIZE; j ++) {
        DCT1D(tmp2[j], tmp1[j], flag);
    }
    for (int j = 0; j < PATCHSIZE; j ++) {
        for (int i = 0; i < PATCHSIZE; i ++)
            patch1[j][i] = tmp1[i][j];
    }
}
Ejemplo n.º 2
0
static void DCT2D(int32 *p)
{
  int32 c, *q = p;
  for (c = 7; c >= 0; c--, q += 8)
  {
    int32 s0 = q[0], s1 = q[1], s2 = q[2], s3 = q[3], s4 = q[4], s5 = q[5], s6 = q[6], s7 = q[7];
    DCT1D(s0, s1, s2, s3, s4, s5, s6, s7);
    q[0] = s0 << ROW_BITS; q[1] = DCT_DESCALE(s1, CONST_BITS-ROW_BITS); q[2] = DCT_DESCALE(s2, CONST_BITS-ROW_BITS); q[3] = DCT_DESCALE(s3, CONST_BITS-ROW_BITS);
    q[4] = s4 << ROW_BITS; q[5] = DCT_DESCALE(s5, CONST_BITS-ROW_BITS); q[6] = DCT_DESCALE(s6, CONST_BITS-ROW_BITS); q[7] = DCT_DESCALE(s7, CONST_BITS-ROW_BITS);
  }
  for (q = p, c = 7; c >= 0; c--, q++)
  {
    int32 s0 = q[0*8], s1 = q[1*8], s2 = q[2*8], s3 = q[3*8], s4 = q[4*8], s5 = q[5*8], s6 = q[6*8], s7 = q[7*8];
    DCT1D(s0, s1, s2, s3, s4, s5, s6, s7);
    q[0*8] = DCT_DESCALE(s0, ROW_BITS+3); q[1*8] = DCT_DESCALE(s1, CONST_BITS+ROW_BITS+3); q[2*8] = DCT_DESCALE(s2, CONST_BITS+ROW_BITS+3); q[3*8] = DCT_DESCALE(s3, CONST_BITS+ROW_BITS+3);
    q[4*8] = DCT_DESCALE(s4, ROW_BITS+3); q[5*8] = DCT_DESCALE(s5, CONST_BITS+ROW_BITS+3); q[6*8] = DCT_DESCALE(s6, CONST_BITS+ROW_BITS+3); q[7*8] = DCT_DESCALE(s7, CONST_BITS+ROW_BITS+3);
  }
}