网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 网络学院 >> 程序设计 >> VC编程 >> 文章正文
  基于对称延拓的小波变换算法的VC实现            【字体:
基于对称延拓的小波变换算法的VC实现
作者:佚名    文章来源:不详    点击数:    更新时间:2007-9-12    

参考《Visual C++数字图像处理典型算法及实现 》中的源代码,按照matlab中的程序做了修改,并用matlab进行了分解及重构的验证。
正在装载数据……

局限性:该算法仅对输入数据长度为2的指数的情况有效。

int Log2(int x)
{//求最大可分解尺度,不要随便用math.h中的函数,因为各种重载过于复杂,极可能出错
 int k=1;
 while((1<<k)<=x) k++;
 k--;
 return k;
}

BOOL DWTStep_1D(double* data,int nCurLevel,int nInv,int nStep,int nSupp)
{
 //double s=sqrt((double)2);
 //获得小波基的指针
 double* h=(double*)hCoef[nSupp-1];//系数为Lo_R
 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];
 if(!ptemp) return FALSE;
 double s1,s2;
 int Index1,Index2;
 //判断是进行DWT还是进行IDWT
 if(!nInv)
 {//DWT
  //对称延拓
  int ExtN=2*nSupp+CurN;//延拓后的长度
  double* pdata=new double[ExtN];
  for(int i=0;i<nSupp;i++)
  {
   pdata[i]=data[nSupp-1-i];
   pdata[ExtN-nSupp+i]=data[CurN-1-i];
  }
  for(int i=nSupp;i<ExtN-nSupp;i++)
   pdata[i]=data[i-nSupp];

  //分解及系数提取
  Index1=0;
  Index2=2*nSupp-1;
  for(int i=0;i<CurN/2;i++)
  {
   s1=s2=0;
   double t=-1;
   for(int j=0;j<2*nSupp;j++,t=-t)
   {
    s1+=h[j]*pdata[(Index1)*nStep];
    s2+=t*h[j]*pdata[(Index2)*nStep];
    Index1++;
    Index2--;
   }
   ptemp[i]=s1;
   ptemp[i+CurN/2]=s2;
   Index1-=2*nSupp;
   Index2+=2*nSupp;
   Index1+=2;//downsample,隔一个采样一次
   Index2+=2;
  }
  delete[] pdata;
 }
 else
 {//IDWT
  //卷积零延拓
  double* pdatal=new double[nSupp+CurN/2+1];
  double* pdatah=new double[nSupp+CurN/2+1];
  int bn=nSupp/2;
  for(int i=0;i<bn;i++)
  {//零延拓数据前端
   pdatal[i]=0;
   pdatah[i]=0;
  }
  for(int i=CurN/2+bn;i<nSupp+CurN/2+1;i++)
  {//零延拓数据后端
   pdatal[i]=0;
   pdatah[i]=0;
  }
  for(int i=0;i<CurN/2;i++)
  {//拷贝中间数据
   pdatal[bn+i]=data[i];
   pdatah[bn+i]=data[CurN/2+i];
  }

  //重构并提取系数
  Index1=nSupp;//逆序乘积(正序卷积)
  for(int i=0;i<CurN/2;i++)
  {
   s1=s2=0;
   int Index3=0;
   int Index4=2*nSupp-2;
   
   if(nSupp%2==0)
   {
    for(int j=0;j<nSupp;j++)
    {
     s1+=h[Index3]*pdatal[Index1*nStep]+h[Index4+1]*pdatah[Index1*nStep];
     s2+=h[Index3+1]*pdatal[Index1*nStep]-h[Index4]*pdatah[Index1*nStep];
     Index3+=2;
     Index4-=2;
     Index1--;
    }
    ptemp[2*i]=s1;
    ptemp[2*i+1]=s2;
   }
   if(nSupp%2==1)
   {
    for(int j=0;j<nSupp;j++)
    {
     s1+=h[Index3]*pdatal[Index1*nStep]+h[Index4+1]*pdatah[Index1*nStep];
     s2+=h[Index3+1]*pdatal[(Index1-1)*nStep]-h[Index4]*pdatah[(Index1-1)*nStep];
     Index3+=2;
     Index4-=2;
     Index1--;
    }
    ptemp[2*i]=s2;
    ptemp[2*i+1]=s1;
   }
   Index1+=nSupp;
   Index1++;
  }
  delete[] pdatal;
  delete[] pdatah;
 }
 for(int i=0;i<CurN;i++)
  data[i*nStep]=ptemp[i];
 //删除分配的临时内存
 delete[] ptemp;
 return TRUE;
}
BOOL DWT_1D(double* data,int nMaxLevel,int nDWTSteps,int nInv,int nStep,int nSupp)
{
 //计算最小可分解的层数
 int MinLevel=nMaxLevel-nDWTSteps;
 //判断是否为DWT
 if(!nInv)
 {//DWT
  int n=nMaxLevel;
  while(n>MinLevel)
   if(!DWTStep_1D(data,n--,nInv,nStep,nSupp))
    return FALSE;
 }
 else
 {//IDWT
  int n=MinLevel;
  while(n<nMaxLevel)
   if(!DWTStep_1D(data,n++,nInv,nStep,nSupp))
    return FALSE;
 }
 return TRUE;
}




本文来源:http://blog.csdn.net/antheazhang/archive/2007/08/24/1757428.aspx
站内文章搜索 高级搜索
文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
     directx 图形接口指南(…
     win2k下的api函数的拦截
     用crypto  api  实现公钥…
     根据别人的md5源码封装的…
     vc中使用gdi+合并jpg图片
     document/view的交互 --…
     windows下的函数hook技术
     windows api函数大全一
     用vc 6.0实现串行通信的…
     vc++技术内幕(第四版)…
  • Ajax - javascript之实现…

  • 基于栈的对象

  • 基于Xfire自带示例的安全校验

  • 分页技巧(基于自定义标签+JS…

  • 基于web的java应用开发的备用…

  • 基于JSP实现图片的数据库存储…

  • 【转】基于C#的接口基础教程…

  • 基于J2EE的Blog平台开发

  • 基于Java Web的文件上传进度…

  • 基于J2EE的Ajax宝典------ A…

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    网络学院©2007 www.23book.net
    为您提供web编程,vb编程,vc编程,服务器架设管理,数据库设计等方面的知识 站长:David