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

时间:2019-03-16 22:28:38

标签: python c++ wavelet daubechies-wavelet

我正在测试mock functions

   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个项目。

我想念什么?

1 个答案:

答案 0 :(得分:3)

我也从未使用过任何这些代码,也不太确定您的问题!但是,也许这些信息可以帮助您更接近问题的答案:

Daubechies 4 Wiki

Daubechies 4

道贝契斯系数Wiki

Daubechies Coefs

  • 在此之前,我认为您的输入矢量(信号)可能太小而无法进行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 效率由离散小波变换分解的信号。但是,我不确定您可以分解多少层输入向量。

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

Packet

另一种分解方法分解信号的低频部分。因此,您可能需要了解向量正在分解的分解程度。

此外,如果您编写自己的代码,则可以根据需要将其分解。

了解小波的简单键

班次(时间)与规模(频率)

有一件简单的事情,如果您理解的话,Wavelet变得容易得多。首先,您可能知道,小波是一种时频方法。但是,不是绘制时间与频率的关系,而是绘制时间与比例的关系,其中比例是频率的“倒数”。

小波函数的子级,例如DB4

Wavelet变换将Wavelet函数(例如DB4)映射到整个原始信号中,这就是它可能如何计算您已经打印出的那些数字的方式。要考虑的一件事是找到一个基本功能DB4,它看起来像原始信号。你怎么做到的?

基本上,您选择一个基本函数DB4,然后Wavelet转换创建该基本函数的多种形式(例如,假设您将它们命名为DB4-0,DB4-2,DB4-3,DB4-4,..., DB4-15)。这些子项是基于以下条件创建的:

(a)移位(在for循环中,通过增加时间,滑动子函数然后计算系数),移位与<时间很明显。

(b)缩放(是指垂直或水平“拉伸”小波函数,这将改变基本函数的频率特性,然后在时间上再次滑动它),这是相反的关系带有频率,这意味着更高的规模,更低的频率,反之亦然。

因此,这取决于分解(子信号),您可能需要多少子功能。如果您有16个子信号(使用数据包方法进行4级分解),则将有16个这些“子”函数映射到整个信号中。这就是系数向量的计算方式。然后,您可能会抛弃那些不必要的子信号,并继续关注您可能感兴趣的子信号(频率)。问题是Wavelet保留(维护)时间信息,而不是Fourier

Wavelet Function

常规分解

Discrete Wavelet Transform (Normal Decomposition) 1

Discrete Wavelet Transform (Normal Decomposition) 2

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

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

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