Два разных значения для вейвлет-преобразования (Daubechies D4) - PullRequest
1 голос
/ 17 марта 2019

Я тестирую этот код

   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 Ответ

3 голосов
/ 18 марта 2019

Я никогда не использовал ни один из этих кодов, также не совсем уверен в вашем вопросе!Но, может быть, эта информация поможет вам приблизиться к ответу на ваш вопрос:

Смазки 4 Wiki

Daubechies 4

Коэффициенты Добеши Wiki

Daubechies Coefs

  • До этого,Я думаю, что ваш входной вектор (сигнал) может быть слишком мал, чтобы сделать вычисления вейвлетов, верно?Не уверен, хотя!Возможно, попробуйте что-нибудь в 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 );
      }
   }

Исходя из вышеописанных методов, кажется, что это будет "Быстрое вейвлет-преобразование", которое я такжеНе очень уверены в своих расчетах, вы можете заглянуть в эту ссылку .

В вейвлет-преобразованиях существует так много так называемых «терминов», что лучше всего изучить их математику и выяснить, каким может быть точный метод (например, дискретное вейвлет-преобразование).Непрерывное вейвлет-преобразование, дискретное с пакетной декомпозицией.Каждая библиотека имеет некоторые термины и допущения и производит различные вычисления.Вы могли бы print посмотреть, если бы вы сначала получили что-нибудь близкое к D4 Wavelet = {−0.1830127, −0.3169873, 1.1830127, −0.6830127}; для DB4.Или вы можете провести другое тестирование, чтобы проверить правильность расчетов.

Методы разложения в вейвлетах

Похоже, cA и cD являются c коэффициентами " A pproximated" и " D соответствует "сигналам, разложенным дискретным вейвлет-преобразованием.Однако я не уверен, до скольких слоев вы могли разложить ваш входной вектор.

Существует два хорошо известных способа разложения сигнала в вейвлете, один из которых «пакет» (который разбивает сигналы как «приближения», так и «детализации», поэтому вы получите * 1059).* вспомогательные сигналы для разложения вашего исходного сигнала на 4 слоя).

Packet

Другой метод разложения разделяет низкочастотную часть сигналов.Итак, вам может потребоваться узнать о вашем уровне разложения, что ваш вектор разлагается.

Кроме того, если вы пишете свой собственный код, вы можете разложить его по своему желанию.

Простые ключи для понимания вейвлета

Сдвиг (время) и масштаб (частота)

Есть одна простая вещь, если вы понимаете, то вейвлетстановится намного проще.Во-первых, как вы знаете, вейвлет - это частотно-временной метод.Однако вместо отображения времени в зависимости от частоты вы делаете время в зависимости от масштаба, где масштаб является «обратным» по отношению к частоте.

Дочерние функции вейвлета, такие как DB4

Преобразование вейвлета отображает функцию вейвлета - такую ​​как DB4 - на весь ваш исходный сигнал, и таким образом он будет вычислять эти числачто вы распечатали, возможно.Одна вещь, которую стоит рассмотреть, - это найти базовую функцию DB4, которая бы «выглядела» как ваш оригинальный сигнал.Как вы это делаете?

По сути, вы выбираете базовую функцию DB4, а затем вейвлет-преобразование создает несколько форм этой базовой функции (например, представьте, что вы называете их DB4-0, DB4-2, DB4-3)., DB4-4, ..., DB4-15).Эти дочерние элементы создаются на основе:

(a) Сдвиг (в цикле for путем увеличения времени, перемещения дочерней функции, а затем вычисления коэффициентов), смещения очевидно имеет отношение к времени .

(b) Масштабирование (означает «растяжение» вейвлет-функции по вертикали или по горизонтали, которое изменит частотный характер базовой функции, а затем снова сдвинет ее во времени), чтообратная связь с частотой, что означает, что более высокая шкала, более низкие частоты, и наоборот.

Следовательно, это зависит от того, сколько дочерних функций вам может понадобиться, основываясь на разложениях (под-сигналах).Если у вас есть 16 суб-сигналов (4 уровня декомпозиции с пакетным методом), то у вас будет 16 из этих «дочерних» функций, отображающих весь ваш сигнал.И вот как вычисляются векторы коэффициентов.Затем вы можете выбросить эти ненужные суб-сигналы и продолжать фокусироваться на тех суб-сигналах (частотах), которые могут вас заинтересовать. Дело в том, что вейвлет резервирует (поддерживает) информацию о времени, в отличие от Фурье .

Wavelet Function

Нормальное разложение

Discrete Wavelet Transform (Normal Decomposition) 1

Discrete Wavelet Transform (Normal Decomposition) 2

Кроме того, так как вы хороший программист, я уверен, что вы можете быстро взломать код, и я не думаю, что вы здесь ничего не упустили.Вы можете просто пройтись по их методам и прочитать несколько страниц википедии, и вы, вероятно, были бы там, если хотите.

Если у вас могут быть действительно интересные вопросы о деталях, вы можете попробовать DSP SE.Там так много экспертов по сигналам.Извини за это!Написал это слишком быстро, тоже не очень хороший писатель / объяснитель, позже, надеюсь, другие отредактируют и предоставят правильный ответ.Не совсем эксперт.

Короче говоря, вы ни в чем не упускаете, хорошего метода, удачи и наилучших пожеланий!

...