无接触母胎心电信号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