Biến đổi Wavelet rời rạc - Trực quan hóa mối quan hệ giữa các hệ số và tín hiệu chi tiết bị phân tách


12

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'])

Tín hiệu gốc

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'])

Tín hiệu tái tạo

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'])

Hệ số chi tiết cấp 1 Hệ số chi tiết cấp 2 Hệ số chi tiết cấp 3 Hệ số chi tiết cấp 4 Hệ số chi tiết cấp 5 Hệ số chi tiết cấp 6

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:

  1. 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?
  2. 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
    
  3. 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'])
    

Mối liên quan giữa các hệ số chi tiết lvl1 và tín hiệu Mối liên quan giữa các hệ số chi tiết lvl2 và tín hiệu Mối liên quan giữa các hệ số chi tiết lvl3 và tín hiệu Mối liên quan giữa các hệ số chi tiết lvl4 và tín hiệu Mối liên quan giữa các hệ số chi tiết lvl5 và tín hiệu Mối liên quan giữa các hệ số chi tiết lvl6 và tín hiệu

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!


Bạn đã không nhận được câu trả lời, nhưng chính câu hỏi của bạn là một hướng dẫn tốt để thực hiện phân tích sóng con trong Python. Cảm ơn bạn!
Farzad

Câu trả lời:


1

Cần phân biệt rõ ràng giữa các hệ số gần đúng và chi tiết ở mỗi cấp độ phân tách và các mức Chi tiết và xấp xỉ liên quan không chỉ liên quan đến các hệ số mà còn cả các bộ lọc nghịch đảo ở cấp đó


0

Bây giờ tôi chỉ bắt đầu học hỏi về sóng con, và vẫn đang vật lộn ngay cả với những câu hỏi rất cơ bản như "làm thế nào để người ta chọn từ nhóm các sóng con có sẵn" (có lẽ phải làm với số cấp độ bạn cần để đạt được "đủ tốt" đại diện) và "tất cả những gì là hoopla về việc khử nhiễu với sóng con", bởi vì tôi dường như có thể đạt được kết quả tốt hơn cho loại dữ liệu của mình với các bộ lọc khử nhiễu hoặc trung bình gaussian thẳng. Nhưng tôi lạc đề....

Một điều tôi lưu ý ở trên là việc đánh số cấp độ của bạn có vẻ không phù hợp với những gì tôi tin rằng tôi là các quy ước sóng con thông thường. Cụ thể các coeffs [0] là biên độ gần đúng ở cấp độ cuối cùng, trong trường hợp của bạn 6 coeffs [1] là biên độ chi tiết ở cấp độ 6 coeffs [2] là biên độ chi tiết ở cấp độ 5 ... coeffs [6] là biên độ chi tiết ở cấp 1

Vì vậy, bản dựng lại của bạn chỉ từ cấp 5 và 6, không phải cấp 1 và 2 như được chỉ ra trong lô của bạn.

=========

Cập nhật: Tôi nhầm với mã của bạn nhiều hơn và tôi nghĩ ý tưởng của bạn về việc minh họa mối tương quan giữa các hệ số và tính năng tín hiệu là âm thanh, nhưng không hoàn hảo. Tôi đã tìm hiểu kỹ về mã của bạn một chút để minh họa điều này tốt hơn, xem bên dưới. Lưu ý rằng ở mỗi bước tôi thay đổi các hệ số theo độ lớn của tín hiệu. Điều này cho phép một người nói về khái niệm ngưỡng.

import pywt
import pywt.data
import numpy as np
import matplotlib.pyplot as plt

plt.close('all')

def reconstruction_plot(yyy, **kwargs):
    """Plot signal vector on x [0,1] independently of amount of values it contains."""
    #plt.figure()
    #plt.plot(np.linspace(0, 1, len(yyy)), yyy, **kwargs)
    ym = np.median(yyy)
    plt.plot(np.linspace(0, 1., num=len(yyy)), yyy-ym, **kwargs)


def reconstruction_stem(yyy, xmax, **kwargs):
    """Plot coefficient vector on x [0,1] independently of amount of values it contains."""
    ymax = yyy.max()
    plt.stem(np.linspace(0, 1., num=len(yyy)), yyy*(xmax/ymax), **kwargs)


x = pywt.data.ecg()
w = pywt.Wavelet('sym5')
nl = 6
coeffs = pywt.wavedec(x, w, level=nl)


'''
plt.figure()
plt.stem(coeffs[1]); plt.legend(['Lvl 6 detail coefficients'])
plt.figure()
plt.stem(coeffs[2]); plt.legend(['Lvl 5 detail coefficients'])
plt.figure()
plt.stem(coeffs[3]); plt.legend(['Lvl 4 detail coefficients'])
plt.figure()
plt.stem(coeffs[4]); plt.legend(['Lvl 3 detail coefficients'])
plt.figure()
plt.stem(coeffs[5]); plt.legend(['Lvl 2 detail coefficients'])
plt.figure()
plt.stem(coeffs[6]); plt.legend(['Lvl 1 detail coefficients'])
'''


xmax = x.max()
for i in range(nl):
    plt.figure()
    reconstruction_plot(x) # original signal 
    #reconstruction_plot(pywt.waverec(coeffs, w)) # full reconstruction 
    reconstruction_plot(pywt.waverec(coeffs[:i+2] + [None] * (nl-i-1), w)) # partial reconstruction 
    reconstruction_stem(coeffs[i+1], xmax, markerfmt ='none', linefmt='r-')
    #plt.legend(['Original', 'Full reconstruction', ('Rec to lvl %d')%(nl-i), ('Details for lvl %d')%(nl-i)])
    plt.legend(['Original', ('Rec to lvl %d')%(nl-i), ('Details for lvl %d')%(nl-i)])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.