Tôi đang cố gắng trực quan hóa mối quan hệ giữa các hệ số chi tiết biến đổi sóng con (DWT) rời rạc và tín hiệu ban đầu / sự tái tạo của nó. Mục tiêu là thể hiện mối quan hệ của họ một cách trực quan. Tôi muốn hỏi (xem các câu hỏi dưới đây): nếu ý tưởng và quy trình tôi đưa ra là chính xác cho đến nay, và nếu tôi đúng thì có thể trừ đi xấp xỉ mức 1 từ tín hiệu ban đầu trước khi hình dung ra mối quan hệ của chúng .
Ví dụ tối thiểu
Đây là ví dụ tối thiểu tôi dựa trên lời giải thích của mình, sử dụng dữ liệu ví dụ ECG của Pythonpywavelets
, có 1024 giá trị, như một tín hiệu 1D đơn giản:
import pywt
import pywt.data
import numpy as np
import matplotlib.pyplot as plt
x = pywt.data.ecg()
plt.plot(x)
plt.legend(['Original signal'])
Quá trình phân tách được thực hiện bằng Symmlet 5 với tổng cộng 6 cấp độ:
w = pywt.Wavelet('sym5')
plt.plot(w.dec_lo)
coeffs = pywt.wavedec(x, w, level=6)
(Mất) việc tái tạo tín hiệu hoạt động như mong đợi khi cố tình bỏ qua các hệ số chi tiết của các mức cao hơn (tín hiệu được vẽ trên thang đo x thống nhất [0,1] để thuận tiện):
def reconstruction_plot(yyy, **kwargs):
"""Plot signal vector on x [0,1] independently of amount of values it contains."""
plt.plot(np.linspace(0, 1, len(yyy)), yyy, **kwargs)
reconstruction_plot(pywt.waverec(coeffs, w)) # full reconstruction
#reconstruction_plot(pywt.waverec(coeffs[:-1] + [None] * 1, w)) # leaving out detail coefficients up to lvl 5
#reconstruction_plot(pywt.waverec(coeffs[:-2] + [None] * 2, w)) # leaving out detail coefficients up to lvl 4
#reconstruction_plot(pywt.waverec(coeffs[:-3] + [None] * 3, w)) # leaving out detail coefficients up to lvl 3
reconstruction_plot(pywt.waverec(coeffs[:-4] + [None] * 4, w)) # leaving out detail coefficients up to lvl 2
#reconstruction_plot(pywt.waverec(coeffs[:-5] + [None] * 5, w)) # leaving out detail coefficients up to lvl 1
reconstruction_plot(pywt.waverec(coeffs[:-6] + [None] * 6, w)) # leaving out all detail coefficients = reconstruction using lvl1 approximation only
plt.legend(['Full reconstruction', 'Reconstruction using detail coefficients lvl 1+2', 'Reconstruction using lvl 1 approximation only'])
DWT ở trên mang lại một vectơ xấp xỉ cấp 1 gồm 24 giá trị, vectơ hệ số chi tiết cấp 1 gồm 24 giá trị, vectơ chi tiết cấp 2 gồm 40 giá trị, cấp 3 của 72 giá trị, cấp 4 của 135 giá trị, cấp 5 của 262 giá trị và cấp 6 trong 516 giá trị:
plt.stem(coeffs[1]); plt.legend(['Lvl 1 detail coefficients'])
plt.stem(coeffs[2]); plt.legend(['Lvl 2 detail coefficients'])
plt.stem(coeffs[3]); plt.legend(['Lvl 3 detail coefficients'])
plt.stem(coeffs[4]); plt.legend(['Lvl 4 detail coefficients'])
plt.stem(coeffs[5]); plt.legend(['Lvl 5 detail coefficients'])
plt.stem(coeffs[6]); plt.legend(['Lvl 6 detail coefficients'])
Dường như chúng ta thấy các mô hình rõ ràng xung quanh các gai trong các tín hiệu ban đầu (cũng chú ý đến thang đo y của các ô trên).
Bây giờ cho câu hỏi của tôi:
- Có đúng là chúng ta có thể liên hệ trực tiếp các hệ số đó với tín hiệu không? Biên độ của hệ số tương ứng với biên độ mà sóng con xảy ra trong tín hiệu (trục y) và vị trí của hệ số tương ứng với thời gian (trục x). Hoặc có một cái gì đó ở giữa chúng ta cần xem xét?
Sau DWT, xấp xỉ lvl1 cuối cùng vẫn còn. Liệu có ý nghĩa gì khi không hình dung được mối quan hệ của các hệ số chi tiết với tín hiệu gốc, mà thay vào đó là tín hiệu gốc trừ đi xấp xỉ lvl1? (Tôi biết rằng rất có thể tôi cũng sẽ thấy mối quan hệ giữa các hệ số và tín hiệu mà không làm điều này, xem ví dụ các ô bên dưới. Điều này chỉ có ý nghĩa hay không. Nó có ý nghĩa đối với các hệ số chi tiết lvl1 hay không hệ số chi tiết lvl2 được so sánh với tín hiệu ban đầu trừ đi xấp xỉ lvl2, phải không?). Một ví dụ:
# Reconstruction of signal using just lvl1 approximation approx_lvl1 = pywt.waverec(coeffs[:-6] + [None] * 6, w) # interpolate to original amount of samples (necessary due to numeric solution of transformation not yielding same amount of values) approx_lvl1_interp = np.interp(x=np.arange(0, 1024), xp=np.linspace(0, 1024, len(approx_lvl1)), fp=approx_lvl1) x_without_lvl1approx = x - approx_lvl1_interp
Hình dung trực tiếp về mối quan hệ giữa các hệ số chi tiết và tín hiệu tôi sử dụng chỉ vẽ cả tín hiệu và hệ số trên một trục x là [0,1]. Điều này về mặt khái niệm là hợp lệ, nhưng tôi không chắc liệu tôi có thực sự cần một phần bù cho lề hay không (ví dụ: hệ số đầu tiên và cuối cùng của vectơ không được định vị ở đầu hoặc cuối tín hiệu):
def reconstruction_stem(yyy, **kwargs): """Plot coefficient vector on x [0,1] independently of amount of values it contains.""" plt.stem(np.linspace(0, 1, len(yyy)), yyy, **kwargs) reconstruction_plot(x, color='orange') reconstruction_plot(x_without_lvl1approx, color='red') reconstruction_stem(coeffs[1]) plt.legend(['Original signal', 'Original signal - lvl1 approximation', 'Detail coefficients'])
Có một lời giải thích trực quan cho các hệ số mạnh không trực tiếp tại các vị trí của các đỉnh trong dữ liệu gốc (ví dụ ở mức 1, mức thấp nhất (âm mạnh nhất) ở khoảng 0,25, cũng như mức cao nhất (dương mạnh nhất) khoảng 0,75 )? Mặc dù có một mô hình rõ ràng (độ trễ dương + biên độ âm, độ trễ âm + biên độ dương) đối với tôi có vẻ hơi "xa vời". Nhưng có lẽ có một lời giải thích tốt cho điều đó.
Cảm ơn đã trả lời!