多维离散小波变换
多维小波变换的实现
介绍
我提供了一个多维离散小波变换的类。这个类可以分析多维输入信号并在处理后合成它。输入信号可以是单维信号(如波形),二维信号(如图像)或多维信号。
背景
在使用这个类之前,您需要了解离散小波变换(DWT)。下图显示了DWT的基本思想。
经过DWT后,输入信号被分解为小波系数。这些小波系数可以被处理并合成成输出信号。整个过程中有四个滤波器:高通滤波器H和H';低通滤波器L和L'。
经过DWT后,输入信号被分解为小波系数。这些小波系数可以被处理并合成成输出信号。整个过程中有四个滤波器:高通滤波器H和H';低通滤波器L和L'。
使用代码
该类如下所示。
//
// The wavelet transform class
//
class WaveletAnalysis{
public:
// the construction
WaveletAnalysis(vector<double> input,vector<unsigned int> dim,unsigned int level,
vector<double> h0,vector<double> h1,vector<double> h2,vector<double> h3);
~WaveletAnalysis(void);
private:
// The four filters: L(H0),H(H1),L'(H2),H'(H3)
CFilterFunc funcH0,funcH1,funcH2,funcH3;
// The decomposition levels
unsigned int level;
// The buffer which save the signal and the wavelet coefficients
vector<double> scalevalues;
vector<double> waveletvalues;
vector<double> *inputvalues;
vector<double> *outputvalues;
vector<unsigned int> offsets;
vector<unsigned int> lens;
// The multidimensional lengths
vector<unsigned int> dimensions;
public:
void resetlevel(unsigned int level);
void resetinput(vector<double> input,vector<unsigned int> ds);
//DWT
void transform();
//iDWT
void itransform();
double getOutputValue(vector<unsigned int> ord){
offsets = ord;
unsigned int offset = getOffset();
return (*outputvalues)[offset];}
//The process between the DWT and iDWT
void process();
private:
typedef void (WaveletAnalysis::*FuncInWhile)(void *);
void whileProcess(FuncInWhile func,void* parameter);
void initOffsetsAndLens(unsigned int level);
void initOutput(void *v);
void reconstructOneDimension(void * d);
void analyzeOneDimension(void * d);
inline void copyInput2Output(void *);
inline void copyInput2OuputOnDim(void *dim);
inline void swapVectorPointer();
unsigned int getOffset();
};
// The main process of the DWT and iDWT
void WaveletAnalysis::transform(){
inputvalues = &scalevalues;
outputvalues = &waveletvalues;
for(unsigned int l = 0; l < level; ++l){
for(unsigned int d = 0; d < dimensions.size(); d++){
initOffsetsAndLens(l);
lens[d] = lens[d] >> 1;
whileProcess(&WaveletAnalysis::analyzeOneDimension,&d);
swapVectorPointer();
}
initOffsetsAndLens(l);
whileProcess(&WaveletAnalysis::copyInput2Output,NULL);
swapVectorPointer();
initOffsetsAndLens(l+1);
whileProcess(&WaveletAnalysis::copyInput2Output,NULL);
swapVectorPointer();
}
}
void WaveletAnalysis::itransform(){
swapVectorPointer();
for(unsigned int l = level; l > 0; --l){
for(int d = dimensions.size() - 1; d >=0 ; d--){
initOffsetsAndLens(l-1);
whileProcess(&WaveletAnalysis::initOutput,0);
initOffsetsAndLens(l-1);
lens[d] = lens[d] >> 1;
whileProcess(&WaveletAnalysis::reconstructOneDimension,&d);
swapVectorPointer();
initOffsetsAndLens(l-1);
whileProcess(&WaveletAnalysis::copyInput2Output,NULL);
swapVectorPointer();
}
}
}
该类的输入是四种类型的参数
1. 输入信号。
2. 多维信号的维数长度。
3. 分解层级。
4. 四个滤波器。
以二维图像为例
输入信号是:
维数长度是:
// the multidimensional lengths
vector<unsigned int> dimensions;
dimensions.push_back(512);
dimensions.push_bask(512);
分解层级是 5。
四个滤波器是 Haar 滤波器
// Haar wavelet
vector<double> h0, h1,h2,h3;
double sqr = sqrtf(2.0);
h0.push_back(0.5*sqr);
h0.push_back(0.5*sqr);
h1.push_back(-0.5*sqr );
h1.push_back(0.5*sqr );
h2.push_back(0.5*sqr);
h2.push_back(0.5*sqr);
h3.push_back(-0.5*sqr );
h3.push_back(0.5*sqr );
DWT 的结果是
我删除了高频系数并进行了 iDWT,信号的输出如下所示
关注点
这个类可以分析任何维度的信号。第二个参数定义了每个维度的长度。输入信号(输入信号)的长度应与第二个参数定义的长度相同。
历史
版本 1.0