파이썬: 소파 변환의 실현: ② CWT 편
개시하다
목표
이 기고문에서는 컨틴루어스 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를 구현했습니다.
감상
잘 이해가 안 되는 것도 아니고요.
Reference
이 문제에 관하여(파이썬: 소파 변환의 실현: ② CWT 편), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sai-sui/items/7707b1d96483e1e25b6c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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()
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를 구현했습니다.
감상
잘 이해가 안 되는 것도 아니고요.
Reference
이 문제에 관하여(파이썬: 소파 변환의 실현: ② CWT 편), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sai-sui/items/7707b1d96483e1e25b6c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
잘 이해가 안 되는 것도 아니고요.
Reference
이 문제에 관하여(파이썬: 소파 변환의 실현: ② CWT 편), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sai-sui/items/7707b1d96483e1e25b6c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)