我正在测试this code
protected final double sqrt_3 = Math.sqrt( 3 );
protected final double denom = 4 * Math.sqrt( 2 );
//
// forward transform scaling (smoothing) coefficients
//
protected final double h0 = (1 + sqrt_3)/denom;
protected final double h1 = (3 + sqrt_3)/denom;
protected final double h2 = (3 - sqrt_3)/denom;
protected final double h3 = (1 - sqrt_3)/denom;
//
// forward transform wavelet coefficients
//
protected final double g0 = h3;
protected final double g1 = -h2;
protected final double g2 = h1;
protected final double g3 = -h0;
protected void transform( double a[], int n )
{
if (n >= 4) {
int i, j;
int half = n >> 1;
double tmp[] = new double[n];
i = 0;
for (j = 0; j < n-3; j = j + 2) {
tmp[i] = a[j]*h0 + a[j+1]*h1 + a[j+2]*h2 + a[j+3]*h3;
tmp[i+half] = a[j]*g0 + a[j+1]*g1 + a[j+2]*g2 + a[j+3]*g3;
i++;
}
tmp[i] = a[n-2]*h0 + a[n-1]*h1 + a[0]*h2 + a[1]*h3;
tmp[i+half] = a[n-2]*g0 + a[n-1]*g1 + a[0]*g2 + a[1]*g3;
for (i = 0; i < n; i++) {
a[i] = tmp[i];
}
}
} // transform
在此离散数组上执行Daubechies D4小波变换:
[1,2,0,4,5,6,8,10]
结果是
- 0 : 1.638357430415108
- 1 : 3.6903274198537357
- 2 : -2.6439375651698196
- 3 : 79.01146993331695
- 4 : 7.399237211089009
- 5 : 0.3882285676537802
- 6 : -39.6029588778518
- 7 : -19.794010741818195
- 8 : -2.1213203435596424
- 9 : 0.0
但是当我在同一数组上使用python
pywt.dwt
时,我得到了:import pywt
[cA, cD] = pywt.dwt([1,2,0,4,5,6,8,10], 'db4')
>>> >>> cA
array([ 7.14848277, 1.98754736, 1.9747116 , 0.95510018, 4.90207373,
8.72887094, 14.23995582])
>>> cD
array([-0.5373913 , -2.00492859, 0.01927609, 0.1615668 , -0.0823509 ,
-0.32289939, 0.92816281])
除了不同的值外,一个包含10个项目,另一个包含7个项目。
我想念什么?
最佳答案
我也从未使用过这些代码,也不确定您的问题!但是,也许这些信息可以帮助您更接近问题的答案:
Daubechies 4 Wiki
道贝契斯系数Wiki
1x128
大小的东西。 码
/**
Forward Daubechies D4 transform
*/
public void daubTrans( double s[] )
{
final int N = s.length;
int n;
for (n = N; n >= 4; n >>= 1) {
transform( s, n );
}
}
/**
Inverse Daubechies D4 transform
*/
public void invDaubTrans( double coef[])
{
final int N = coef.length;
int n;
for (n = 4; n <= N; n <<= 1) {
invTransform( coef, n );
}
}
基于上述方法,看来这将是“快速小波变换”,对此我也不太确定,您可以查看link。
小波变换上有太多所谓的类似“术语”,可能最好通过数学来查看事物,并找出确切的方法是什么(例如,离散小波变换,连续小波变换,离散与数据包分解)。每个库都有一些术语和假设,并进行不同的计算。首先,您可能会使用
print
来查看是否接近DB4的D4 Wavelet = {−0.1830127, −0.3169873, 1.1830127, −0.6830127};
。或者,您可以进行其他测试以查看计算是否正确。小波分解方法
看来
cA
和cD
是由离散小波变换分解的“ A 近似”和“ D 尾部”信号的 c 系数。但是,我不确定输入 vector 可能分解了多少层。在Wavelet中有两种众所周知的分解信号的方法,一种是"packet"(它分解“近似”和“细节”信号,因此您将获得
2^4=16
子信号将原始信号分解为4层)。另一种分解方法分解信号的低频部分。因此,您可能需要了解 vector 正在分解的分解程度。
另外,如果您编写自己的代码,则可以根据需要将其分解。
了解小波的简单按键
转换(时间)与小数位(频率)
如果您了解一件事,那么Wavelet变得容易得多。首先,您可能知道,小波是一种时频方法。但是,不是绘制时间与频率的关系,而是绘制时间与比例的关系,其中比例是频率的“倒数”。
小波函数的子级,例如DB4
Wavelet变换将Wavelet函数(例如DB4)映射到整个原始信号中,这就是它可能如何计算您已打印出的那些数字的方式。要考虑的一件事是找到一个基本功能DB4,它看起来像原始信号。你是怎样做的?
基本上,选择一个基本函数DB4,然后Wavelet变换创建该基本函数的多种形式(例如,假设您将它们命名为DB4-0,DB4-2,DB4-3,DB4-4,...,DB4-15 )。这些子项是基于以下条件创建的:
(a)移位(在
for
循环中,通过增加时间,滑动子函数然后计算系数),移位与时间有关。(b)缩放(表示“垂直”或“水平”“拉伸(stretch)”小波函数,这将改变基本函数的频率特性,然后在时间上再次滑动它),它与频率成反比关系,表示比例更高,较低的频率,反之亦然。
因此,这取决于分解(子信号),您可能需要多少子功能。如果您有16个子信号(使用数据包方法进行4级分解),则将有16个这些“子”函数映射到整个信号中。这就是系数 vector 的计算方式。然后,您可能会抛弃那些不必要的子信号,并继续关注您可能感兴趣的子信号(频率)。事情是Wavelet保留(维护)时间信息,而不是Fourier。
正常分解
另外,由于您是一名优秀的程序员,所以我很确定,您可以快速破解代码,并且我认为您可能不会在这里遗漏任何东西。您可以浏览他们的方法,阅读几页维基百科,如果愿意的话,您可能会在那儿。
如果您可能确实有令人兴奋的细节问题,则可以尝试DSP SE。那里有很多信号专家。对于那个很抱歉!写得太快了,也不是一个好的作家/解释者,以后希望其他人会编辑并提供正确的答案。不是真正的专家。
简而言之,您不会错过任何东西,好方法,好运和最良好的祝愿!