基于自适应滤波器去除PPG信号呼吸伪影的技术求助
使用LMS与频域自适应滤波器无法去除PPG信号中的呼吸伪影
我正在开发一个Python项目,目标是去除PPG信号中的呼吸伪影。尝试采用LMS时域自适应滤波器与频域自适应滤波器,但均未达到预期效果。
相关参数
- 参考呼吸信号采样率:25Hz
- PPG信号采样率:50Hz
- 期望输出:橙色曲线所示的目标信号
遇到的问题
- LMS算法输出仍含噪声,呼吸伪影未被有效去除
- 频域自适应滤波器的输出不符合预期
相关代码
import numpy as np from numpy.fft import fft, ifft def lms(self, x, d, N, mu): nIters = min(len(x), len(d)) - N u = np.zeros(N) w = np.zeros(N) e = np.zeros(nIters) for n in range(nIters): u[1:] = u[:-1] u[0] = x[n] e_n = d[n] - np.dot(u, w) w = w + mu * e_n * u e[n] = e_n return e def freq_adap_filter(self, x, d, M, mu): num_block = min(len(x), len(d)) // M w_k = 0 n_zeros = np.zeros(M) e = np.zeros(num_block * M) for n in range(num_block): # 计算滤波器输出 x_n = np.concatenate([n_zeros, x[n * M:(n + 1) * M]]) # 尺寸2M x_k = fft(x_n) # 尺寸2M y_k = x_k * w_k # 尺寸2M的滤波器输出 d_n = d[n * M:(n + 1) * M] # 尺寸M y_n = ifft(y_k) # 尺寸2M y_n = y_n[M:2 * M] # 取后半段,尺寸M e_n = d_n - y_n # 尺寸M e[n * M:(n + 1) * M] = e_n # 更新滤波器系数 e_n = np.concatenate([n_zeros, e_n]) # 尺寸2M e_k = fft(e_n) # 尺寸2M x_k_conj = x_k.conj() # 尺寸2M g_k = x_k_conj * e_k # 尺寸2M g_n = ifft(g_k) # 尺寸2M g_n = g_n[0:M] # 保留前M个,删除后半段 g_n = np.concatenate([g_n, n_zeros]) # 尺寸2M w_k = w_k + mu * fft(g_n) # 尺寸2M return e
恳请各位提供排查思路或改进方案,谢谢!
内容的提问来源于stack exchange,提问作者Baili.As
相关产品推荐
相关产品推荐

