#include "stdafx.h" #include "vec1d.h" #include "basefwt.h" #include "fwt2d.h" ///////////////////////////////////constructors/destructors/////////////////////////////////////////////////////////////////// FWT2D::FWT2D(const wchar_t* fname) : BaseFWT2D(fname) { } FWT2D::FWT2D(const wchar_t* fname, const float* tH, unsigned int thL, int thZ, const float* tG, unsigned int tgL, int tgZ, const float* H, unsigned int hL, int hZ, const float* G, unsigned int gL, int gZ) : BaseFWT2D(fname, tH, thL, thZ, tG, tgL, tgZ, H, hL, hZ, G, gL, gZ) { } ///////////////////////////////////constructors/destructors/////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////transforms///////////////////////////////////////////////////////////////////// void FWT2D::transrows(char** dest, char** sour, unsigned int w, unsigned int h) const { int n; float s, d; unsigned int w2 = w / 2; const vec1D& tH = gettH(); const vec1D& tG = gettG(); for (unsigned int y = 0; y < h; y++) { for (unsigned int k = 0; k < w2; k++) { s = 0.0f; d = 0.0f; for (int m = tH.first(); m <= tH.last(); m++) { n = 2 * k + m; if (n < 0) n = 0 - n; if (n >= (int)w) n -= 2 * (1 + n - w); s += tH[m] * float(sour[y][n]); } for (int m = tG.first(); m <= tG.last(); m++) { n = 2 * k + m; if (n < 0) n = 0 - n; if (n >= (int)w) n -= 2 * (1 + n - w); d += tG[m] * float(sour[y][n]); } dest[y][k] = mmxround(s); dest[y][k+w2] = mmxroundTH(d); } } } void FWT2D::transcols(char** dest, char** sour, unsigned int w, unsigned int h) const { int n; float s, d; unsigned int h2 = h / 2; const vec1D& tH = gettH(); const vec1D& tG = gettG(); for (unsigned int x = 0; x < w; x++) { for (unsigned int k = 0; k < h2; k++) { s = 0.0f; d = 0.0f; for (int m = tH.first(); m <= tH.last(); m++) { n = 2 * k + m; if (n < 0) n = 0 - n; if (n >= (int)h) n -= 2 * (1 + n - h); s += tH[m] * float(sour[n][x]); } for (int m = tG.first(); m <= tG.last(); m++) { n = 2 * k + m; if (n < 0) n = 0 - n; if (n >= (int)h) n -= 2 * (1 + n - h); d += tG[m] * float(sour[n][x]); } if (x < w / 2) dest[k][x] = mmxround(s); else dest[k][x] = mmxroundTH(s); //is this needed? hi band were TH'ed on transrows dest[k+h2][x] = mmxroundTH(d); //is this needed? hi band were TH'ed on transrows on x>w/2 } } } ///////////////////////////////////////////////transforms///////////////////////////////////////////////////////////////////// //////////////////////////////////////////////synths////////////////////////////////////////////////////////////////////////// void FWT2D::synthrows(char** dest, char** sour, unsigned int w, unsigned int h) const //w,h of the LO part { int n; float s2k, s2k1; const vec1D& H2m = getH2m(); const vec1D& G2m = getG2m(); const vec1D& H2m1 = getH2m1(); const vec1D& G2m1 = getG2m1(); for (unsigned int y = 0; y < 2*h; y++) { for (unsigned int k = 0; k < w; k++) { s2k = 0.0f; s2k1 = 0.0f; for (int m = H2m.first(); m <= H2m.last(); m++) //s2k even H { n = k - m; if (n < 0) n = 0 - n; if (n >= (int)w) n -= 2 * (1 + n - w); s2k += H2m[m] * float(sour[y][n]); } for (int m = G2m.first(); m <= G2m.last(); m++) //s2k even G { n = k - m; if (n < 0) n = 0 - n; if (n >= (int)w) n -= 2 * (1 + n - w); s2k += G2m[m] * float(sour[y][n+w]); } for (int m = H2m1.first(); m <= H2m1.last(); m++) //s2k1 odd H { n = k - m; if (n < 0) n = 0 - n; if (n >= (int)w) n -= 2 * (1 + n - w); s2k1 += H2m1[m] * float(sour[y][n]); } for (int m = G2m1.first(); m <= G2m1.last(); m++) //s2k1 odd G { n = k - m; if (n < 0) n = 0 - n; if (n >= (int)w) n -= 2 * (1 + n - w); s2k1 += G2m1[m] * float(sour[y][n+w]); } dest[y][2*k] = mmxround(2.0f * s2k); dest[y][2*k+1] = mmxround(2.0f * s2k1); } } } void FWT2D::synthcols(char** dest, char** sour, unsigned int w, unsigned int h) const //w,h of the LO part { int n; float s2k, s2k1; const vec1D& H2m = getH2m(); const vec1D& G2m = getG2m(); const vec1D& H2m1 = getH2m1(); const vec1D& G2m1 = getG2m1(); for (unsigned int x = 0; x < 2*w; x++) { for (unsigned int k = 0; k < h; k++) { s2k = 0; s2k1 = 0; for (int m = H2m.first(); m <= H2m.last(); m++) //s2k even H { n = k - m; if (n < 0) n = 0 - n; if (n >= (int)h) n -= 2 * (1 + n - h); s2k += H2m[m] * float(sour[n][x]); } for (int m = G2m.first(); m <= G2m.last(); m++) //s2k even G { n = k - m; if (n < 0) n = 0 - n; if (n >= (int)h) n -= 2 * (1 + n - h); s2k += G2m[m] * float(sour[n+h][x]); } for (int m = H2m1.first(); m <= H2m1.last(); m++) //s2k1 odd H { n = k - m; if (n < 0) n = 0 - n; if (n >= (int)h) n -= 2 * (1 + n - h); s2k1 += H2m1[m] * float(sour[n][x]); } for (int m = G2m1.first(); m <= G2m1.last(); m++) //s2k1 odd G { n = k - m; if (n < 0) n = 0 - n; if (n >= (int)h) n -= 2 * (1 + n - h); s2k1 += G2m1[m] * float(sour[n+h][x]); } dest[2*k][x] = mmxround(2.0f * s2k); dest[2*k+1][x] = mmxround(2.0f * s2k1); } } } //////////////////////////////////////////////synths//////////////////////////////////////////////////////////////////////////