算法要求:输入序列是大于滤波器长度的偶数列
确实可以通过编程的手段使算法适合所有的情况,但本文章的目的是展示mallat算法的过程,所以就一切从简了
// Mallat.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
/*mallat算法 分解
* dSIn 输入的序列s,dH0尺度函数展开系数,dH1小波函数展开系数,dSOut输出低频部分,dDOut输出高频部分,
* nSIn_Len 输入序列的长度,nH_Len 滤波器的长度。
*/
int DwtFun(double *pdSIn,double *pdH0,double *pdH1,double *pdSOut,double *pdDOut,int nSIn_Len,int nH_Len)
{
int i,j,k;
//延拓后的Len是一个本体长度加一个滤波器长度
int nLen=nSIn_Len+2*nH_Len;
//建立滤波前的序列pdSArray,滤波后的序列pdSAOut低频部分,pdDAOut高频部分
double *pdSArray=new double[nLen];
double *pdSAOut=new double[nLen];
double *pdDAOut=new double[nLen];
//对称延拓
for(i=0;i<nLen;i++)
{
if(i<nH_Len)
{
pdSArray[i]=pdSIn[nH_Len-i-1];
}
else if(i>=nH_Len+nSIn_Len)
{
pdSArray[i]=pdSIn[nH_Len+2*nSIn_Len-1-i];
}
else
{
pdSArray[i]=pdSIn[i-nH_Len];
}
}
//求输出序列低频部分dSOut,高频部分dDOut.i->nLen,k->nH_Len
double dSTemp,dDTemp;
for(i=0;i<nLen;i++)
{