파이썬: 소파 변환의 실현: ② CWT 편

19377 단어 소파 변환PythonCWT

개시하다


목표


이 기고문에서는 컨틴루어스 Wavelet Transform(CWT)을 이해하기 위해 scpy를 사용하지 않고 CWT 변환하는 함수를 제작했다.
참조: wiki: Continuous Wavelet Transform(CWT)

참고 자료


먼저 CWT가 어떤 것인지 참고하여 scpy의 cwt와 그 변환 예를 소개한다.참조: scipy.signal.cwt
다음은 위의 샘플 코드에 원파형 {$x(t)} 달러를 추가한 Mother Waveret 시각화입니다.
Mother Waveret에 대한 설명은 맛있게 드세요.
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

t = np.linspace(-1, 1, 200, endpoint=False)
sig  = np.cos(2 * np.pi * 7 * t) + np.sin(np.pi * 6 * t)
widths = np.arange(1, 31)
cwtmatr = signal.cwt(sig, signal.ricker, widths)
print('x(t)')
plt.plot(sig)
plt.show()
print('Mother Wavelet')
plt.plot(signal.ricker(200, 10))
plt.show()
print('Xw(a, b)')
plt.imshow(cwtmatr, extent=[-1, 1, 1, 31], cmap='PRGn', aspect='auto',
           vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max())
plt.show()
다음 샘플 코드의 실행 예제 첫 번째는 원본 파형이고 두 번째는 모더 웨이브릿이며 세 번째는 CWT 변환 후입니다.

CWT의 구현 및 테스트


Mther Wavelet


CWT에는 Mther Wavele가 필요하지만 이전소파 변환의 실현: ① Riker Wavelet의 실현편에 구현된 다음과 같은 내용을 사용합니다(자세한 내용은 링크에 있음).
def ricker(t, s=1.0):
    a = 2 * np.sqrt(3 * s) * np.pi**0.25
    b = 1 - (t / s)**2
    c = np.e**(-1 * t**2 / (2 * s**2))
    return a * b * c


def s_ricker(wid, a):
    x = (np.arange(wid) - int(wid / 2)) / a
    return ricker(x)

CWT의 실현


CWT의 소파에 따라 변환('·'ω・ ´) 허장성세하면 대단한 느낌이 든다.
이번에 실시된 CWT 전환은 다음과 같이 간단하다.
def cwt(x, mw, A):
    y = []
    for a in A:
        wave = mw(min(10 * a, len(x)), a)
        y.append(np.convolve(x, wave, mode='same'))
    return np.array(y)
구체적으로 모더 웨이브에서 아래 부분까지 사이즈감a에 따라 웨이브를 제작한다
wave = mw(min(10 * a, len(x)), a)
아래쪽은 파형의 위치를 엇갈리게 하면서 볼륨을 넣는다.
이때 순서대로 y를 추가하여 사이즈i의 파와 비교한 결과는 y[i]에 저장한다.
y.append(np.convolve(x, wave, mode='same'))
분위기를 전달하기 위해 for문의 a=5시의 예로 간단한 이미지를 제작하였으니 참고하시기 바랍니다.
(참고: 이미지는 항상 이미지)

첫 번째 샘플 코드와 같은 변환이 실제로 이루어질 수 있는지 확인해 보세요.
import matplotlib.pyplot as plt
import numpy as np


def ricker(t, s=1.0):
    a = 2 * np.sqrt(3 * s) * np.pi**0.25
    b = 1 - (t / s)**2
    c = np.e**(-1 * t**2 / (2 * s**2))
    return a * b * c


def s_ricker(wid, a):
    x = (np.arange(wid) - int(wid / 2)) / a
    return ricker(x)


def cwt(x, mw, A):
    y = []
    for a in A:
        wave = mw(min(10 * a, len(x)), a)
        y.append(np.convolve(x, wave, mode='same'))
    return np.array(y)


t = np.linspace(-1, 1, 200, endpoint=False)
sig  = np.cos(2 * np.pi * 7 * t) + np.sin(np.pi * 6 * t)
widths = np.arange(1, 31)
# cwtmatr = signal.cwt(sig, signal.ricker, widths)
cwtmatr = cwt(sig, s_ricker, widths)
print('x(t)')
plt.plot(sig)
plt.show()
print('Mother Wavelet')
# plt.plot(signal.ricker(200, 10))
plt.plot(s_ricker(200, 10))
plt.show()
print('Xw(a, b)')
plt.imshow(cwtmatr, extent=[-1, 1, 1, 31], cmap='PRGn', aspect='auto',
           vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max())
plt.show()

총결산


scpy의 cwt와 기본적으로 동일한 CWT를 구현했습니다.

감상


잘 이해가 안 되는 것도 아니고요.

좋은 웹페이지 즐겨찾기