Основа сплайнового вейвлета Battle-Lemarié любого порядка в Python

Я пытаюсь проанализировать некоторые данные с помощью дискретного вейвлет-преобразования (DWT), используя сплайновые вейвлеты Battle-Lemarié любого порядка. Анализ будет использоваться в двумерных изображениях для устранения шума, для вычисления первых и вторых производных и для извлечения соответствующей информации из каждого масштаба вейвлета. Поскольку я не математик, я также должен быть уверен, что эти вейвлеты ортогональны.

Мне было интересно, пытался ли кто-нибудь использовать это семейство вейвлетов, особенно в Python.


person regeirk    schedule 18.09.2013    source источник


Ответы (1)


До сих пор я просмотрел пару ссылок и нашел в «Вейвлет-туре по обработке сигналов» Маллата (2008, таблица 7.1) коэффициенты фильтра реконструкции нижних частот для линейных сплайнов (m=1) и кубических сплайнов (m=3).

Используя библиотеку pywt Python Василевского, я создал пару сопряженных зеркальных фильтров для использования в аппроксимациях с несколькими разрешениями. На следующем рисунке показаны мои результаты для функции масштабирования кубического сплайна ϕ и вейвлета ψ:

Масштабирующая функция ϕ и вейвлет ψ

Ниже приведен код, который генерирует эту фигуру.

import numpy
import pywt
from matplotlib import pyplot as plt

class wavelet_BattleLamarie(object):
    _filter_bank = None

    def __init__(self, m=1):
        # Sets the conjugate low pass reconstruction filter h[n] for linear 
        # splines (m=1) and cubic splines (m=3) as in Mallat (2008, table 7.1).
        #
        # REFERENCES:
        # Mallat, S. A wavelet tour of signal processing: The sparse way 
        # Academic Press, 2008, 805.
        #
        if m == 1:
            rec_lo = numpy.array([-0.000122686, -0.000224296, 0.000511636, 
                0.000923371, -0.002201945, -0.003883261, 0.009990599, 
                0.016974805, -0.051945337, -0.06910102, 0.39729643, 
                0.817645956, 0.39729643, -0.06910102, -0.051945337, 
                0.016974805, 0.009990599, -0.003883261, -0.002201945,
                0.000923371, 0.000511636, -0.000224296, -0.000122686])
        elif m == 3:
            rec_lo = numpy.array([0.000146098, -0.000232304, -0.000285414, 
                0.000462093, 0.000559952, -0.000927187, -0.001103748, 
                0.00188212, 0.002186714, -0.003882426, -0.00435384, 
                0.008201477, 0.008685294, -0.017982291, -0.017176331, 
                0.042068328, 0.032080869, -0.110036987, -0.050201753, 
                0.433923147, 0.766130398, 0.433923147, -0.050201753, 
                -0.110036987, 0.032080869, 0.042068328, -0.017176331, 
                -0.017982291, 0.008685294, 0.008201477, -0.00435384, 
                -0.003882426, 0.002186714, 0.00188212, -0.001103748, 
                -0.000927187, 0.000559952, 0.000462093, -0.000285414, 
                -0.000232304, 0.000146098])
        else:
            raise ValueError('Order %d not implemented yet.' % (n))

        # Determines the remaining conjugate mirror filters from the low pass
        # reconstruction filter h[n]
        dec_lo = rec_lo[::-1]
        rec_hi = pywt.functions.qmf(rec_lo)
        dec_hi = rec_hi[::-1]
        #
        self._filter_bank = (dec_lo, dec_hi, rec_lo, rec_hi)
        return

    @property
    def filter_bank(self):
        return self._filter_bank

w = pywt.Wavelet('bspline3', filter_bank=wavelet_BattleLamarie(m=3))
#w.name = 'Battle-Lamarie of order 1'
#w.short_family_name = 'B-spline'
#w.family_name = 'Battle-Lamarie'
w.orthogonal = True
w.biorthogonal = False
#w.symmetry = 'symmetric'


###############################################################################
# NICE PLOTS
###############################################################################
plt.close('all')
plt.ion()

phi, psi, x = w.wavefun()

fig = plt.figure(figsize=[8, 4])
ax = fig.add_subplot(1, 2, 1)
ax.plot(x, phi, 'k-')
ax.set_title(r'$\phi$')
bx = fig.add_subplot(1, 2, 2)
bx.plot(x, psi, 'k-')
bx.set_title(r'$\psi$')
plt.tight_layout()

Тем не менее, я все еще заинтересован в реализации сплайновых вейвлетов Баттла-Лемари в любом порядке, т.е. m={1, 2, 3, ...}. Есть ли более элегантный способ создания этих вейвлетов? Может быть, с меньшим банком фильтров?

person regeirk    schedule 18.09.2013