我正在测试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

python - 小波变换的两个不同值(Daubechies D4)-LMLPHP

道贝契斯系数Wiki

python - 小波变换的两个不同值(Daubechies D4)-LMLPHP

  • 在此之前,我认为您的输入 vector (信号)可能太小而无法进行Wavelet计算,对吗?虽然不确定!也许尝试使用1x128大小的东西。
  • 也许,Java代码是快速小波变换。根据以下方法进行猜测:


  •    /**
         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};。或者,您可以进行其他测试以查看计算是否正确。

    小波分解方法

    看来cAcD是由离散小波变换分解的“ A 近似”和“ D 尾部”信号的 c 系数。但是,我不确定输入 vector 可能分解了多少层。

    在Wavelet中有两种众所周知的分解信号的方法,一种是"packet"(它分解“近似”和“细节”信号,因此您将获得2^4=16子信号将原始信号分解为4层)。

    python - 小波变换的两个不同值(Daubechies D4)-LMLPHP

    另一种分解方法分解信号的低频部分。因此,您可能需要了解 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

    python - 小波变换的两个不同值(Daubechies D4)-LMLPHP

    正常分解

    python - 小波变换的两个不同值(Daubechies D4)-LMLPHP

    python - 小波变换的两个不同值(Daubechies D4)-LMLPHP

    另外,由于您是一名优秀的程序员,所以我很确定,您可以快速破解代码,并且我认为您可能不会在这里遗漏任何东西。您可以浏览他们的方法,阅读几页维基百科,如果愿意的话,您可能会在那儿。

    如果您可能确实有令人兴奋的细节问题,则可以尝试DSP SE。那里有很多信号专家。对于那个很抱歉!写得太快了,也不是一个好的作家/解释者,以后希望其他人会编辑并提供正确的答案。不是真正的专家。

    简而言之,您不会错过任何东西,好方法,好运和最良好的祝愿!

    10-08 00:59