绘制的 ECG 信号不在幅度 0 线附近

信息处理 matlab 心电图
2022-02-17 19:42:42

对于我的项目,我必须有几个 ECG 信号数据集,而且我确实从 Physionet 网站获得了它们。

我得到了什么

所以我下载了一些心电图信号并在 Matlab 中绘制。下面显示了我得到的一个情节(我领导)。

心电图图像 如您所见,此信号不在幅度 0 行中。但是我在研究论文中看到和看到的所有心电图记录都是水平的。如下图所示。

研究论文中的心电图

我的问题

我是 ECG 信号处理的新手。所以我很想知道,

1)有这种ECG异常行为的数据集是否错误?

2)是否有任何Matlab函数可以将这些数据转换为我附加的第二张图片中的视图?

更新

要下载数据集,

https://www.physionet.org/cgi-bin/atm/ATM

转到上面的链接并选择“PTB 诊断心电图数据库”作为数据库并选择患者记录(例如:s0010_re)。

2个回答

我已经尝试过我们开发的 BEADS 技术,用于分离

  • 稀疏信号,可能是正的,具有稀疏导数,
  • 趋势(低频),
  • 随机噪声。

我用一个信号玩了大约两分钟,这是一个结果:

BEADS 基线分离和噪声过滤

它被称为 BEADS,表示“具有稀疏性的基线估计和去噪”。Matlab BEADS 代码在 MatlabCentral论文是Chromatogram baseline estimation and denoising using sparseity (BEADS)它最初用于色谱信号,但也用于 EEG/ECG 和其他几种光谱信号,请参阅BEADS 页面

一个不错的功能是您可以直接看到噪声(以及它的不相关程度)和趋势的形状,然后调整参数。我的(可能不是最佳的)是:

addpath('C:\Users\duvall\Documents\MATLAB\toolbox\2014_BEADS_Baseline\');
% load('s0010_rem.mat')
 data = val(1,:)';
% Filter parameters
fc = 0.004;     % fc : cut-off frequency (cycles/sample)
d = 1;          % d : filter order parameter (d = 1 or 2)
% Positivity bias (peaks are mostly symmetric)
r = 1;          % r : asymmetry parameter
% Regularization parameters
amp = 0.8;
lam0 = 0.5*amp;
lam1 = 5*amp;
lam2 = 4*amp;

[x1, f1, cost] = beads(data, d, fc, r, lam0, lam1, lam2);
figure(2);
subplot(4,1,1)
h=plot([data]);axis tight;grid on;set(h,'LineWidth',2);
subplot(4,1,2)
h=plot([x1]);axis tight;grid on;set(h,'LineWidth',2);
subplot(4,1,3)
h=plot([f1]);axis tight;grid on;set(h,'LineWidth',2);
subplot(4,1,4)
h=plot([data-x1-f1]);axis tight;grid on;set(h,'LineWidth',2);

基本上,我下载和加载信号的时间比调整参数(大约 90 秒)多 10 倍,但我知道代码 :)

添加评论:正如人们已经说过的,这是一种称为基线漂移的现象,可以根据信号的外观以不同的方式进行处理。

对于您已知频谱的正弦信号,可以只应用带通滤波器来消除不需要的漂移。

对于您的示例,我可能只是减去信号的包络(从峰值生成)。这也适用于非线性移位。下面附上一个 matlab 示例来说明该技术。注意:我故意选择了一个不好的例子,以强调在 RR 间隔之间获得完美信号结构的限制。

load('nonuniformdata.mat','ecgsig','t2')

[yupper,ylower] = envelope(ecgsig,700,'peak'); %% use the findpeak function to find suitable peak distance

figure; plot(t2,ecgsig)
hold on; plot(t2,ylower,'Linewidth',2)
hold on; plot(t2,yupper,'Linewidth',2)
title('ECG signal with non linear baseline variation')
xlabel('time [s]')
ylabel('Amplitude [A.U]')

figure; plot(t2,ecgsig-ylower)

figure; plot(t2,ecgsig-yupper)
title('ECG signal with upper envelope subtracted')
xlabel('time [s]')
ylabel('Amplitude [A.U]')

在此处输入图像描述 在此处输入图像描述