WEB开发网
开发学院软件开发VC DCT快速变换 阅读

DCT快速变换

 2010-07-25 20:45:40 来源:WEB开发网   
核心提示:位反序函数如下:int bitrev(int bi,int deg){int j = 1, temp = 0, degnum, halfnum;degnum = deg;//if(deg<0) return 0;if(deg == 0) return bi;halfnum = 1 << (deg-1)

位反序函数如下:

int bitrev(int bi,int deg)
{
   int j = 1, temp = 0, degnum, halfnum;
   degnum = deg;
   //if(deg<0) return 0;
   if(deg == 0) return bi;
   halfnum = 1 << (deg-1);
   while(halfnum)
   {
       if(halfnum&bi)
          temp += j;
       j<<=1;
       halfnum >>= 1;
   }
   return temp;
}

完整实现一维DCT变换:

void fdct_1D_no_param(double *f,int deg)
{
   initDCTParam(deg);
   dct_forward(f,deg);
   dct_backward(f,deg);
   fbitrev(f,deg);   // 实现位反序排列
   f[0] = 1/(sqrt(2.0))*f[0];
}
void fdct_1D(double *f,int deg)
{
   fdct_1D_no_param(f,deg);
   int total = 1 << deg;
   double param = sqrt(2.0/total);
   for(int i = 0; i < total; i++)
       f[i] = param*f[i];
}

利用一维DCT变换来实现二维DCT变换:

void fdct_2D(double *f,int deg_row,int deg_col)
{
   int rows,cols,i_row,i_col;
   double two_div_sqrtcolrow;
   rows=1 << deg_row;
   cols=1 << deg_col;
   init2D_Param(rows,cols);
   two_div_sqrtcolrow = 2.0/(sqrt(double(rows*cols)));
   for(i_row = 0; i_row < rows; i_row++)
   {
       fdct_1D_no_param(f+i_row*cols,deg_col);
   }
   for(i_col = 0; i_col < cols; i_col++)
   {
       for(i_row = 0; i_row < rows; i_row++)
       {
          temp_2D[i_row] = f[i_row*cols+i_col];
       }
       fdct_1D_no_param(temp_2D, deg_row);
       for(i_row = 0; i_row < rows; i_row++)
       {
          f[i_row*cols+i_col] = temp_2D[i_row]*two_div_sqrtcolrow;
       }
   }
   bHasInit = false;
}

上一页  1 2 3 4 5 6 7  下一页

Tags:DCT 快速 变换

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接