无接触母胎心电信号R峰打标代码(matlab)

无接触母胎心电信号R峰打标代码(matlab)

母亲R峰标注操作示例

在这里插入图片描述

胎儿R峰标注操作示例

在这里插入图片描述

打标效果

在这里插入图片描述

其实任务目标只是打母亲的R峰,但由于数据质量非常拉跨,母亲和胎儿的R峰区分度不高,把胎儿的R峰也一道儿打了
实践证明,标注胎儿R峰可以很好的辅助母亲R峰的识别。

代码

clc;clear;close all;
% 计时器
tic;
% %% 数据预处理
% data_folder = 'E:\data';
% denoise_and_save(data_folder)

%% 加载数据
% 去噪数据路径 及 文件列表 (这里时因为我有多个subject,)
data_folder = 'E:\data\Denoised_Data';
file_list = dir(fullfile(data_folder, '*.mat'));
num_files = numel(file_list); % 数据列表 

% 加载指定数据(num= 1~9) 
num = 1;  % 加载数据的序号 
floder_path = [data_folder,'\',file_list(num).name ];
data = load(floder_path);
ecg_data = data.denoised_ecg;

% label_pro = load('label_SEG4.mat');
% label_SEG1 =label_pro.label; %训练集标签

% 参数
th = 40000; %length(ecg_data) 数据过长,只截取部分数据显示图形, th为显示图像的终点
start =28000;% 显示的起点
y = ecg_data(start:th);
fs = 500; % 采样频率
plot(start:th,y,'b')

%改变画图游标显示数据的精度和内容
dcm_obj = datacursormode(gcf); % 显示10000以上的数据坐标就会变科学计数法了,
set(dcm_obj,'UpdateFcn',@NewCallback)
hold on

%% 官方提供的坐标绘图 
label_floder =load( 'E:\label_SEG1.mat');% 这里是手动设置的,官方给的母亲参考坐标只有5个 T-T
label = label_floder.label;
num = length(label);
m_loc =[];
f_loc = [];
for i = 1:num
    locs = label(1,i);
    x = [locs,locs];
    y = [-200,200];
    %plot(locs(1:num),y(locs(1:num)),'r*');
    lab = label(2,i);
    if lab == 1
        %plot(x, y, 'r-', 'LineWidth', 0.35)  %胎儿红色
        f_loc = [f_loc,label(1,i)];
    elseif lab == 2
        m_loc = [m_loc,label(1,i)];
        %plot(x, y, 'g-', 'LineWidth', 0.35) % 母亲绿色
    elseif lab == 3
        % plot(x, y, 'b-', 'LineWidth', 0.35) % 母胎合一 蓝色
    end
end
hold on;

%% 加载之前打好的标 (打了很久...)
maaa = load('handm1_81.mat'); 
maa = maaa.hand_m;
for km = 1:length(maa)
    label_i = maa(km);
    if label_i > start
        xm = [label_i,label_i]; % 母亲打标
        ym = [-200,200];
        plot(xm, ym, 'g--', 'LineWidth', 0.35) % 穆青绿色虚线
    end
end
m_loc =[m_loc,maa];

faaa = load('handf1_117.mat');
faa = faaa.hand_f;
for kf = 1:length(faa)
        label_i = faa(kf);
        if label_i > start
            xf = [label_i,label_i]; % 胎儿打标
            yf = [-200,200];
            plot(xf, yf, 'r--', 'LineWidth', 0.35) % 胎儿红色虚线
        end
end
f_loc =[f_loc,faa];

%% 打标
% 母亲
m_loc_i = m_loc((end-3):end);
mRR_i = diff(m_loc_i);     % 计算相邻两个母亲峰之间的距离
mean_RR_i = mean(mRR_i);   % 平均间距
%hand_m =[];
hand_m =maa;

% 胎儿
f_loc_i = f_loc((end-3):end);
fRR_i = diff(f_loc_i);     % 计算相邻两个母亲峰之间的距离
mean_RR_f = mean(fRR_i); % 平均间距
%hand_f =[];
hand_f = faa;

for k = 82:200
    locs_i = m_loc(end) + mean_RR_i;
    x = [locs_i,locs_i];
    y = [-200,200];
    plot(x, y, 'k-', 'LineWidth', 0.35) % 绘制母亲参考R峰黑色
    % paues; % 暂停
    
    % 母亲
    mlabel = input('输入新的母亲R峰坐标');
    % 更新母亲参数
    m_loc = [m_loc,mlabel];
    hand_m = [hand_m,mlabel];
    m_loc_i = m_loc((end-3):end);
    mRR_i = diff(m_loc_i);     % 计算相邻两个母亲峰之间的距离
    mean_RR_i = mean(mRR_i); % 平均间距
    % 绘制母亲
    x1 = [mlabel,mlabel]; % 手动打标母亲
    y1 = [-200,200];
    plot(x1, y1, 'g-', 'LineWidth', 0.35) % 母亲蓝色的新线
    
    % 胎儿
    flabel = input('输入新的胎儿R峰坐标');% 可以输入数组
    % 更新胎儿参数
    f_loc = [f_loc,flabel];
    hand_f = [hand_f,flabel];
    f_loc_i = f_loc((end-3):end);
    fRR_i = diff(m_loc_i);     % 计算相邻两个母亲峰之间的距离
    mean_RR_f = mean(fRR_i); % 平均间距
    for fi = 1:length(flabel)
        flabel_i = flabel(fi);
        x2 = [flabel_i,flabel_i]; % 胎儿打标母亲
        y2 = [-200,200];
        plot(x2, y2, 'r--', 'LineWidth', 0.35) % 胎儿玫红色的新线
    end
    disp(['母亲手动打标已完成',num2str(k),'个']);
end

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值