Matlab中时间序列归零平移及ECG数据时段对比自动化实现
Matlab实现ECG时间序列对齐与多组时段自动化对比方案
我来帮你搞定这两个ECG数据处理的核心需求,下面分步骤给出可直接复用的代码和思路:
一、把时间序列平移至起始时间00:00:00.000
首先解决时间戳对齐问题,核心思路是把每个受试者的所有时间戳,减去该受试者数据的最早时间点,得到相对起始时间的时长数据,这样所有受试者的起始点就统一为0了。
实现步骤&代码
function aligned_data = align_time_to_zero(file_path) % 读取Excel文件,假设时间戳列的表头是'Timestamp' raw_data = readtable(file_path); % 先把时间戳转成Matlab的datetime类型(如果Excel里存的是文本,必须做这一步) if ~isdatetime(raw_data.Timestamp) % 这里的InputFormat要和你Excel里的时间格式匹配,比如示例的11:22:03:00对应HH:mm:ss:SSS raw_data.Timestamp = datetime(raw_data.Timestamp, 'InputFormat', 'HH:mm:ss:SSS'); end % 找到该受试者数据的最早时间作为基准 start_time = min(raw_data.Timestamp); % 计算相对时间,用duration类型存储,方便后续筛选时段 raw_data.RelativeTime = raw_data.Timestamp - start_time; % 返回对齐后的数据表 aligned_data = raw_data; end
二、自动化多组时段对比流程
接下来构建一个灵活的自动化脚本,支持批量处理所有受试者数据,并且可以自定义任意对比规则(比如条件1前3分钟vs条件2同时段,或者条件1的4-8分钟vs自身前3分钟)。
实现思路
- 先把不同条件的受试者文件分文件夹存放(比如
Condition1/和Condition2/),方便批量读取; - 循环读取所有Excel文件,调用上面的时间对齐函数,把所有数据整理好;
- 定义对比规则,然后自动筛选指定时段的数据,完成统计或可视化对比。
完整自动化脚本
%% 1. 配置参数(根据你的实际情况修改) condition_folders = {'./Condition1/', './Condition2/'}; % 不同条件的文件夹路径 % 定义对比规则:可以添加任意多组对比 compare_rules = [ % 规则1:条件1前3分钟 vs 条件2前3分钟 struct('group1', 1, 'time1_start', duration([0 0 0 0]), 'time1_end', duration([0 3 0 0]), ... 'group2', 2, 'time2_start', duration([0 0 0 0]), 'time2_end', duration([0 3 0 0])), ... % 规则2:条件1的4-8分钟 vs 条件1的前3分钟 struct('group1', 1, 'time1_start', duration([0 4 0 0]), 'time1_end', duration([0 8 0 0]), ... 'group2', 1, 'time2_start', duration([0 0 0 0]), 'time2_end', duration([0 3 0 0])) ]; %% 2. 批量读取并对齐所有受试者数据 all_subjects = struct(); for cond_idx = 1:length(condition_folders) folder = condition_folders{cond_idx}; file_list = dir(fullfile(folder, '*.xlsx')); % 获取文件夹下所有Excel文件 for file_idx = 1:length(file_list) file_path = fullfile(folder, file_list(file_idx).name); aligned_data = align_time_to_zero(file_path); % 给每个受试者数据命名,格式:CondX_受试者文件名(去掉后缀) subject_name = regexprep(file_list(file_idx).name, '.xlsx', ''); all_subjects.(['Cond', num2str(cond_idx), '_', subject_name]) = aligned_data; end end %% 3. 执行对比分析 for rule_idx = 1:length(compare_rules) rule = compare_rules(rule_idx); fprintf('\n=== 对比规则 %d 结果 ===\n', rule_idx); % 提取组1的指定时段数据 group1_subjects = fieldnames(all_subjects); group1_subjects = group1_subjects(contains(group1_subjects, ['Cond', num2str(rule.group1)])); group1_hr = []; for subj_idx = 1:length(group1_subjects) subj_data = all_subjects.(group1_subjects{subj_idx}); % 筛选出在指定时段内的数据 time_mask = subj_data.RelativeTime >= rule.time1_start & subj_data.RelativeTime <= rule.time1_end; group1_hr = [group1_hr; subj_data.HeartRate(time_mask)]; end % 提取组2的指定时段数据 group2_subjects = fieldnames(all_subjects); group2_subjects = group2_subjects(contains(group2_subjects, ['Cond', num2str(rule.group2)])); group2_hr = []; for subj_idx = 1:length(group2_subjects) subj_data = all_subjects.(group2_subjects{subj_idx}); time_mask = subj_data.RelativeTime >= rule.time2_start & subj_data.RelativeTime <= rule.time2_end; group2_hr = [group2_hr; subj_data.HeartRate(time_mask)]; end % 输出统计结果(这里以心率为例,你可以换成RR interval或其他指标) fprintf('组1 心率均值: %.2f bpm, 标准差: %.2f\n', mean(group1_hr), std(group1_hr)); fprintf('组2 心率均值: %.2f bpm, 标准差: %.2f\n', mean(group2_hr), std(group2_hr)); % 可选:绘制箱线图直观对比 figure('Position', [100 100 800 500]); boxplot([group1_hr; group2_hr], ... {'Group1', 'Group2'}, 'Title', sprintf('心率对比 (规则%d)', rule_idx)); ylabel('心率 (bpm)'); grid on; end
注意事项
- 如果你的Excel时间戳格式不是
HH:mm:ss:SSS,一定要修改datetime转换时的InputFormat参数(比如带日期的话用yyyy-MM-dd HH:mm:ss.SSS); compare_rules可以无限扩展,比如添加条件1的10-15分钟vs条件2的10-15分钟,只需按照现有格式新增一个struct即可;- 如果数据量很大,建议把对齐后的数据保存成
.mat文件,下次直接读取,不用重复处理Excel,提升效率。
内容的提问来源于stack exchange,提问作者Glu
相关产品推荐
相关产品推荐

