如何结合小波变换和频率滤波
How to combine Wavelet Transform and Frequency Filtering
我需要对 ECG 信号进行以下去噪处理:
- 使用 'db6' 小波
将离散小波变换为 9 级
- 在0-0.35Hz范围内过滤第9级的频率(不是细节系数)
- 仅使用级别 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' )
我之前(现已删除)的回答有点混乱。
在这里,我将尝试为您提供一个实际示例,表明仅使用 'db6' 近似系数重建以 360Hz 采样的 ECG 数据(大致)等同于使用 0.35 的截止频率对这些数据进行低通滤波赫兹.
在下面的代码示例中,我从 scipy (from scipy.misc import electrocardiogram
) 导入了一个 ECG 时间序列;它们以 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)')
因此,为了使用 0.35Hz 的截止频率对原始数据进行低通滤波,您可以使用 DWT 分解的近似系数(即使用'db6'小波)。
希望这对您有所帮助!
我需要对 ECG 信号进行以下去噪处理:
- 使用 'db6' 小波 将离散小波变换为 9 级
- 在0-0.35Hz范围内过滤第9级的频率(不是细节系数)
- 仅使用级别 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' )
我之前(现已删除)的回答有点混乱。 在这里,我将尝试为您提供一个实际示例,表明仅使用 'db6' 近似系数重建以 360Hz 采样的 ECG 数据(大致)等同于使用 0.35 的截止频率对这些数据进行低通滤波赫兹.
在下面的代码示例中,我从 scipy (from scipy.misc import electrocardiogram
) 导入了一个 ECG 时间序列;它们以 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)')
因此,为了使用 0.35Hz 的截止频率对原始数据进行低通滤波,您可以使用 DWT 分解的近似系数(即使用'db6'小波)。 希望这对您有所帮助!