您想去除心跳信号并保留“噪音”。我们可以通过使用去噪算法,并从原始信号中减去去噪信号来解决这个问题。
为频域滤波器设置频率截止可能会变得很棘手,并且会变成一场打地鼠游戏,因为在心跳信号(由于突然上升和下降)中存在“高频”分量,并且在心跳的T波和下一次心跳的P波。
粗略地说,这个去噪问题的要求如下:
- 去除小摆动
- 保持心跳 PQRST 波形中出现的较大跳跃
这听起来像是应用去噪或总变差去噪的好地方。这个想法是用信号来近似给定信号的导数是“稀疏的”,即它不会太频繁地变化,但是当它变化时,变化很大。去噪估计由下式给出:
ℓ1yxxx^
x^=minx||y−x||22+λ∑|xi−xi−1|
我在 Python 中使用 proxTV 工具箱来解决这个优化问题。
import scipy.io as sio
import numpy as np
import matplotlib.pyplot as plt
import prox_tv as ptv
mat_struct = sio.loadmat('Signal1.mat')
noisy_signal = mat_struct['x'].T[0]
filtered_signal = ptv.tv1_1d(noisy_signal, 50)
time_vec = np.linspace(0, len(noisy_signal)/1500., len(noisy_signal))
plt.close('all')
fig, ax = plt.subplots(3,1,sharex=True)
ax[0].plot(time_vec,noisy_signal)
ax[0].set_title('noisy signal')
ax[1].plot(time_vec,filtered_signal)
ax[1].set_title('filtered signal')
ax[2].plot(time_vec,noisy_signal - filtered_signal)
ax[2].set_title('noise')
ax[2].set_xlabel('time (s)')
plt.tight_layout()
plt.show(block=False)
这是结果图:
当然,您必须使用这种技术来玩另一种“打地鼠”:参数设置为。λ50