如何将小波变换和频率滤波相结合

4
我需要对ECG信号进行以下去噪处理:
  • 使用'db6'小波将离散小波变换到9个级别
  • 在第9个级别上过滤频率(而不是详细系数),范围为0-0.35Hz
  • 仅使用3到9级重构信号
我不知道如何在Python(PyWavelets)中执行第二步,因为我只能修改详细和近似系数,而不知道如何将它们与频率相关联。
我该如何操作?
这是我的代码:
    import pywt

    #DWT
    coeff = pywt.wavedec(data,'db6',level=9)

    #filter the 0-0.35Hz frequencies in the 9-th level?


    #reconstruct the signal
    y = pywt.waverec( coeff[:8]+ [None] * 2, 'db6' )
1个回答

9

我之前的回答有点混乱。在这里,我会尝试通过一个实际例子来展示仅使用“db6”近似系数重建以360Hz采样的ECG数据(大致上)等价于使用截止频率为0.35Hz的低通滤波器对这些数据进行低通滤波。

在下面的代码示例中,我从scipy中导入了一个ECG时间序列(from scipy.misc import electrocardiogram)。它们以与您相同的360Hz采样。我将使用以下方法过滤这些数据:

  • 一种DWT方法,即仅使用近似系数重建数据(filtered_data_dwt)
  • 一个巴特沃斯滤波器(filtered_data_butterworth)

以下是代码示例:

import pywt
import numpy as np
from scipy.misc import electrocardiogram
import scipy.signal as signal
import matplotlib.pyplot as plt

wavelet_type='db6'
data = electrocardiogram()

DWTcoeffs = pywt.wavedec(data,wavelet_type,mode='symmetric', level=9, axis=-1)

DWTcoeffs[-1] = np.zeros_like(DWTcoeffs[-1])
DWTcoeffs[-2] = np.zeros_like(DWTcoeffs[-2])
DWTcoeffs[-3] = np.zeros_like(DWTcoeffs[-3])
DWTcoeffs[-4] = np.zeros_like(DWTcoeffs[-4])
DWTcoeffs[-5] = np.zeros_like(DWTcoeffs[-5])
DWTcoeffs[-6] = np.zeros_like(DWTcoeffs[-6])
DWTcoeffs[-7] = np.zeros_like(DWTcoeffs[-7])
DWTcoeffs[-8] = np.zeros_like(DWTcoeffs[-8])
DWTcoeffs[-9] = np.zeros_like(DWTcoeffs[-9])

filtered_data_dwt=pywt.waverec(DWTcoeffs,wavelet_type,mode='symmetric',axis=-1) 


fc = 0.35  # Cut-off frequency of the butterworth filter
w = fc / (360 / 2) # Normalize the frequency
b, a = signal.butter(5, w, 'low')
filtered_data_butterworth = signal.filtfilt(b, a, data)

让我们使用两种方法绘制原始数据和过滤后数据的功率谱密度图:

plt.figure(1)
plt.psd(data, NFFT=512, Fs=360, label='original data', color='blue')
plt.psd(filtered_data_dwt, NFFT=512, Fs=360, color='red', label='filtered data (DWT)')
plt.psd(filtered_data_butterworth, NFFT=512, Fs=360, color='black', label='filtered data (Butterworth)')
plt.legend()

结果如下:

得到以下结果:

在此输入图片描述

在原始数据中,你可以清晰地看到60Hz和它的第一个倍频(120Hz)。让我们来仔细观察低频部分:

在此输入图片描述

现在让我们来看一下时域数据:

plt.figure(2)
plt.subplot(311)
plt.plot(data,label='original data', color='blue')
plt.title('original')
plt.subplot(312)
plt.plot(filtered_data_dwt, color='red', label='filtered data (DWT)')
plt.title('filtered (DWT)')
plt.subplot(313)
plt.plot(filtered_data_butterworth, color='black', label='filtered data (Butterworth)')
plt.title('filtered (Butterworth)')

enter image description here

所以,为了使用0.35Hz的截止频率低通滤波您可以简单地使用DWT分解的近似系数(即使用'db6'小波)来重构原始数据。 希望这能有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接