我正在尝试在C中实现小波变换,我以前从未这样做过。我已经阅读了一些关于Wavelets的内容,并了解了不断增长的子空间。想法,以及Mallat的单面滤波器组基本上是一样的想法。
然而,我仍然坚持如何实际实现Mallat的快速小波变换。这是我到目前为止所理解的:
高通滤波器h(t)为您提供细节系数。对于给定的标度j,它是母小波W(t)的反射,扩张和标准化版本。
g(t)是组成差异的低通滤波器。它应该是h(t)
要获得细节系数或第j级的近似系数,您需要分别将信号块与h(t)或g(t)进行卷积,并将信号下采样2 ^ {j} (即取每2 ^ {j}值)
然而,这些是我的问题:
当我知道h(t)时如何找到g(t)?
如何计算此变换的倒数?
你有可以参考的任何C代码吗? (是的,我在维基上发现了一个,但它没有帮助)
我想要一些代码说:
一个。这是过滤器
B中。这是变换(非常明确) C.)这是逆变换(再次为假人)
感谢您的耐心等待,但似乎并不是一个Step1 - Step2 - Step3 - 等指导那里有明确的例子(因为所有的系数都是1而且没有令人困惑的事情。)
答案 0 :(得分:3)
fwt的Mallat配方非常简单。如果您查看matlab代码,例如Jeffrey Kantor的script,所有步骤都很明显。
在C中它的工作量稍微多一些,但主要是因为你需要处理自己的声明和分配。
首先,关于你的总结:
关于您的问题:
使用此信息,并给出x
len
个double
类型点的信号h
,缩放g
和小波f
过滤器{{1}系数(也是类型double
)和分解级别lev
,这段代码实现了Mallat fwt:
double *t=calloc(len+f-1, sizeof(double));
memcpy(t, x, len*sizeof(double));
for (int i=0; i<lev; i++) {
memset(y, 0, len*sizeof(double));
int len2=len/2;
for (int j=0; j<len2; j++)
for (int k=0; k<f; k++) {
y[j] +=t[2*j+k]*h[k];
y[j+len2]+=t[2*j+k]*g[k];
}
len=len2;
memcpy(t, y, len*sizeof(double));
}
free(t);
它使用了一个额外的阵列:工作区&#39; t
要复制近似值c
(输入信号x
开始),以便进行下一次迭代。
请参阅此示例C program,您可以使用gcc -std=c99 -fpermissive main.cpp
进行编译并使用./a.out
运行。
倒数也应该是这些方面的东西。祝你好运!
答案 1 :(得分:0)
唯一缺少的是过滤操作的一些填充。 行
y[j] +=t[2*j+k]*h[k];
y[j+len2]+=t[2*j+k]*g[k];
在第一次迭代期间超过t阵列的边界,并且在随后的迭代期间超过阵列的近似部分。必须在t阵列的开头添加(f-1)个元素。
double *t=calloc(len+f-1, sizeof(double));
memcpy(&t[f], x, len*sizeof(double));
for (int i=0; i<lev; i++) {
memset(t, 0, (f-1)*sizeof(double));
memset(y, 0, len*sizeof(double));
int len2=len/2;
for (int j=0; j<len2; j++)
for (int k=0; k<f; k++) {
y[j] +=t[2*j+k]*h[k];
y[j+len2]+=t[2*j+k]*g[k];
}
len=len2;
memcpy(&t[f], y, len*sizeof(double));
}