从信号中去除低频

信息处理 matlab 低通滤波器 自适应滤波器
2022-02-14 09:05:21

我试图从信号中去除低频,直觉上我选择了高通滤波器,更具体地说 - 巴特沃斯滤波器,4 阶(因为我不确定如何正确选择阶,4 似乎是一个不错的选择)和截止频率为 50 Hz。问题是,滤波器去除了低频,但是,仍然可以看到由这些低频引起的峰值。

我还阅读了有关自适应滤波的信息,但根据文献,我需要一个参考信号,它将用作所需信号。我尝试实现一个自适应 RLS/LMS 滤波器并作为参考信号,我使用低通滤波器处理我的数据 - 巴特沃斯,四阶,截止频率为 50 Hz。这种方法也没有让我走远。

我提供了一份我的数据副本,它的采样频率为 1500 Hz。 在此处输入图像描述

1个回答

您想去除心跳信号并保留“噪音”。我们可以通过使用去噪算法,并从原始信号中减去去噪信号来解决这个问题。

为频域滤波器设置频率截止可能会变得很棘手,并且会变成一场打地鼠游戏,因为在心跳信号(由于突然上升和下降)中存在“高频”分量,并且在心跳的T波和下一次心跳的P波。

粗略地说,这个去噪问题的要求如下:

  • 去除小摆动
  • 保持心跳 PQRST 波形中出现的较大跳跃

这听起来像是应用去噪或总变差去噪的好地方。这个想法是用信号来近似给定信号的导数是“稀疏的”,即它不会太频繁地变化,但是当它变化时,变化很大。去噪估计由下式给出: 1yxxx^

x^=minx||yx||22+λ|xixi1|

在 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