小波变折算法看不懂

小波变换算法看不懂
红色的部分,也就是进行小波变换和反变换的部分,不知道是怎么回事?向高手请教!
void CDImageProcessView::OnWl() 
{
CDImageProcessDoc* pDoc = GetDocument(); //获取文档
LPSTR lpDIB; //指向源图像的指针
LPSTR lpDIBBits; //指向DIB像素指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHObject()); //锁定DIB
lpDIBBits = pDoc->m_dib.GetBits(lpDIB); //找到DIB图像像素起始位置
if (pDoc->m_dib.GetColorNum(lpDIB) != 256) //判断是否是256色位图
{
//提示用户
//MessageBox("目前只支持256色位图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) pDoc->GetHObject()); //解除锁定
return; //返回
}
int nWidth; //图像宽度
int nHeight; //图像高度
nWidth=(int)pDoc->m_dib.GetWidth(lpDIB); //获取图像宽度
nHeight=(int)pDoc->m_dib.GetHeight(lpDIB); //获取图像高度

DIBDWTStep(lpDIBBits,m_pDbImage, nWidth,nHeight, 0, m_nDWTCurDepth,1);
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL) pDoc->GetHObject());

}
/*************************************************************************
*
* \函数名称:
* DWTStep_2D()
*
* \输入参数:
* double * pDbSrc - 指向源数据的指针
* int nCurWLevel - X方向上当前分解的层数
* int nCurHLevel - Y方向上当前分解的层数
* int nMaxWLevel - X方向上最大可分解的层数
* int nMaxHLevel - Y方向上最大可分解的层数
* int nInv - 是否为DWT,1表示为IDWT,0表示DWT
* int nStep - 当前的计算层数
* int nSupp - 小波基的紧支集的长度
*
* \返回值:
* BOOL - 成功则返回TRUE,否则返回FALSE
*
* \说明:
* 该函数用对存放在pDBSrc中的数据进行一层的二维DWT或者IDWT。
* 计算后数据仍存放在pDbSrc中
*
*************************************************************************
*/
BOOL DWTStep_2D(double* pDbSrc, int nCurWLevel, int nCurHLevel,
int nMaxWLevel, int nMaxHLevel, int nInv, int nStep, int nSupp)
{
// 计算图像的长度和宽度(2次幂对齐)
int W = 1<<nMaxWLevel, H = 1<<nMaxHLevel;

// 计算当前分解的图像的长度和宽度
int CurW = 1<<nCurWLevel, CurH = 1<<nCurHLevel;

// 判断是进行DWT还是IDWT
if (!nInv)
{
int i = 0;
// 对行进行一维DWT
for (i=0; i<CurH; i++)
if (!DWTStep_1D(pDbSrc+(int)i*W*nStep, nCurWLevel, nInv, nStep, nSupp)) return FALSE;
// 对列进行一维DWT
for (i=0; i<CurW; i++)
if (!DWTStep_1D(pDbSrc+i*nStep, nCurHLevel, nInv, W*nStep, nSupp)) return FALSE;
}

// 否则进行IDWT
else
{
// 计算当前变换的图像的长度和宽度
CurW <<= 1;
CurH <<= 1;

int i = 0;
// 对列进行IDWT
for (i=0; i<CurW; i++)
if (!DWTStep_1D(pDbSrc+i*nStep, nCurHLevel, nInv, W*nStep, nSupp)) return FALSE;
// 对行进行IDWT
for (i=0; i<CurH; i++)
if (!DWTStep_1D(pDbSrc+(int)i*W*nStep, nCurWLevel, nInv, nStep, nSupp)) return FALSE;
}

// 返回
return TRUE;
}

/*************************************************************************
*
* \函数名称:
* DWTStep_1D()
*
* \输入参数:
* double * pDbSrc - 指向源数据的指针
* int nCurLevel - 当前分界的层数
* int nInv - 是否为DWT,1表示为IDWT,0表示DWT
* int nStep - 当前的计算层数
* int nSupp - 小波基的紧支集的长度
*
* \返回值:
* BOOL - 成功则返回TRUE,否则返回FALSE
*
* \说明:
* 该函数用对存放在pDBSrc中的数据进行一层的一维DWT或者IDWT。其中,nInv为表示进行
* DWT或者IDWT的标志。nCurLevel为当前需要进行分界的层数。nStep为已经分界的层数
* 计算后数据仍存放在pDbSrc中
*
*************************************************************************
*/
BOOL DWTStep_1D(double* pDbSrc, int nCurLevel,
int nInv, int nStep,int nSupp)
{
double s = sqrt((double)2);
// 获得小波基的指针
double* h = (double*)hCoef[nSupp-1];
// 确认当前层数有效
ASSERT(nCurLevel>=0);

// 计算当前层数的长度
int CurN = 1<<nCurLevel;
if (nInv) CurN <<= 1;

// 确认所选择的小波基和当前层数的长度有效
if (nSupp<1 || nSupp>10 || CurN<2*nSupp) 
return FALSE;

// 分配临时内存用于存放结果
double *ptemp = new double[CurN];