一份标准心电图由按顺序出现的P波、QRS波群、T波,有时还有U波 组成。各波形的幅值(即高度,代表电压)差异显著,其中QRS波群的R波幅值最高 ,而U波幅值最低。
表1 心电图幅值差异总结
| 波形 | 正常幅值范围 (mV) | 相对幅值大小 |
|---|---|---|
| R波 (QRS波群) | 0.4 ~ 2.4 | 最高 |
| T波 | 0.1 ~ 0.8 | 中等 |
| P波 | 肢导<0.25, 胸导<0.20 | 较低 |
| U波 | < 0.05 | 最低 |

图1 心电图实例
幅值的差异在本领域会导致一个问题,即模型容易钻漏洞,让重构的心电图均接近"0",因为只有短暂的波形具有高幅度,比如R峰,其在整个心电周期占比很小,而幅值极高,模型在这几个采样点偷懒,并不会造成大量的损失。基于此多数研究聚焦于损失函数的调整,赋予高权重增强惩罚,今天阅读一篇会议论文时1,发现其对金标准(参考心电)预处理上进行了相关的尝试,其在归一化上使用等频分箱(Equal-Frequency Binning),其原文的具体描述为:将心电序列按幅值排序,并将其分成256个采样数相等的bin,从而使低幅值区域的分辨率更小,而高幅值区域的分辨率更大。这种自适应再平衡使模型能够更均匀地关注所有心电分量。
在此基础上,我了解到这是数据离散化的一种手段,除此之外还有等宽分箱、信息熵分箱、基于决策树分箱、卡方分箱等2。
****本文分析文献1的内容****
****数据由BIOPAC MP160采集(已脱敏)****
****平台为Matlab R2021b****
等频分箱(文献1复现)
等频分箱就是每个箱内得到数据量大小一致,但我发现这种处理导致形态学出现了极大的变化,但其幅值确实分布极为均匀,作为标签使用,模型预测的同样是如此的信号,但这不是真实信号,所以必须有一种逆变换这种方案才有效,这一点文章并未提到,是我个人的分析,同样的,我也实现了这个逆变换。
Matlab
% ============================================================
% 完整复现:Min-Max 归一化 vs 论文等频分箱(EFB)归一化
% 包含:训练标签(等级) + 逆变换重建(还原物理波形)
% ============================================================
clear; clc; close all;
% 1. 读取数据
filePath = 'D:\ECG-Tran\Untitled1.csv';
data = readmatrix(filePath);
ecg = data(:,1);
N = length(ecg);
fs = 200;
t = (0:N-1) / fs;
% 2. 普通 Min-Max 归一化(线性映射到 [0,1],作为基准参考)
ecg_mm = (ecg - min(ecg)) / (max(ecg) - min(ecg));
% ========== 3. 论文核心:等频分箱 (EFB) 归一化 ==========
numBins = 256;
% 3.1 计算等频边界(保证每个箱子包含相同数量的样本点)
p = linspace(0, 1, numBins+1);
edges = quantile(ecg, p);
% 3.2 将原始幅值映射为箱子序号 (1 ~ 256)
binIdx = discretize(ecg, edges);
binIdx(isnan(binIdx)) = numBins; % 处理极右边界溢出
binIdx(binIdx == numBins+1) = numBins;% 稳健性兜底
% 3.3 ★ 训练标签(Label):输出为 0~1 的均匀等级(横轴被拉伸/压缩)
ecg_efb_rank = (binIdx - 1) / (numBins - 1);
% 3.4 ★ 逆变换重建(推理时使用):用箱中位数还原物理幅值(mV)
binValues = zeros(1, numBins);
for i = 1:numBins
binValues(i) = median(ecg(binIdx == i));
end
ecg_efb_reconstructed = binValues(binIdx); % 此时单位为 mV
% 为了方便和 Min-Max 画在一张图上,将重建信号也线性映射到 [0,1]
% (注意:这只是为了可视化重合度,实际评估 RMSE 时需用 mV 单位)
ecg_efb_rec_norm = (ecg_efb_reconstructed - min(ecg_efb_reconstructed)) / (max(ecg_efb_reconstructed) - min(ecg_efb_reconstructed));
% ========== 4. 可视化(3个子图,去掉映射曲线) ==========
figure('Position', [100, 100, 1000, 900]);
% ---- 子图1:宏观对比(Min-Max vs EFB 等级,展示训练标签的差异) ----
subplot(3,1,1);
plot(t, ecg_mm, 'b--', 'LineWidth', 1.2); hold on;
plot(t, ecg_efb_rank, 'r-', 'LineWidth', 0.8);
hold off;
title('图1:训练标签对比(Min-Max 线性 vs EFB 均匀等级)');
xlabel('时间 (s)'); ylabel('归一化幅值');
legend('Min-Max (线性标签)', 'EFB (均匀等级训练标签)', 'Location', 'best');
grid on; xlim([0, 10]);
text(0.5, 0.1, '★ 差异巨大是正常的,这是为了平衡P/Q/T波权重', ...
'Units', 'normalized', 'Color', 'k', 'FontSize', 10);
% ---- 子图2:逆变换重建(展示推理时还原的波形,与原始高度重合) ----
subplot(3,1,2);
plot(t, ecg_mm, 'b--', 'LineWidth', 1.2); hold on;
plot(t, ecg_efb_rec_norm, 'r-', 'LineWidth', 0.8);
hold off;
title('图2:推理结果对比(Min-Max 线性 vs EFB 逆变换重建)');
xlabel('时间 (s)'); ylabel('归一化幅值');
legend('Min-Max (基准)', 'EFB 逆变换还原 (箱中位数)', 'Location', 'best');
grid on; xlim([0, 10]);
text(0.5, 0.1, '★ 经过逆变换,波形与原始ECG高度重合(评估RMSE时使用mV)', ...
'Units', 'normalized', 'Color', 'k', 'FontSize', 10);
% ---- 子图3:幅值分布直方图(展示EFB如何将分布"拍平") ----
subplot(3,1,3);
histogram(ecg, 50, 'FaceColor', 'b', 'FaceAlpha', 0.4, 'EdgeColor', 'none'); hold on;
histogram(ecg_efb_rank, 50, 'FaceColor', 'r', 'FaceAlpha', 0.6, 'EdgeColor', 'none');
hold off;
title('图3:幅值分布直方图对比(验证EFB的均匀化效果)');
xlabel('幅值'); ylabel('样本计数');
legend('原始ECG(非均匀分布)', 'EFB 等级(绝对均匀分布)', 'Location', 'best');
grid on;
% 额外:输出客观数值,验证"等频"特性
fprintf('原始ECG标准差: %.4f\n', std(ecg));
fprintf('EFB等级标准差: %.4f (接近均匀分布的理论值 1/sqrt(12)=0.2887)\n', std(ecg_efb_rank));
直接看输出(直观感受就是幅度较低的波被抬高):

和常规的归一化有明显差异,经过反变换后可以复原:

- 原始ECG中,R波(峰值) 幅值很高但采样点稀少;P波、Q波、T波基底幅值很低但采样点密集。
我们的目标是让幅值更均匀,基于上述条件,也就是拉近各个波之间的差距,通俗讲就是,R作为做高峰,其幅度假设为1,T、P作为相对基线较高的峰值,其幅值可能也就仅略高于基线,远低于R峰,中间如此大的空间,需要尽量抹平,这样深度学习模型才不会"偷懒"。
首先,把一整段心电信号里所有采样点,按幅值大小从低到高排成一队。然后,把这支队伍平均切成若干个箱子(论文里是 256 个),关键在于:每个箱子里装的点数必须一样多。比如你录了 10 秒信号,采样率 200Hz,总共 2000 个点,那平均每个箱子就要装大约 7.8 个点(具体边界由程序自动处理,不用纠结小数)。当然,箱子数量不是固定的,你可以根据自己信号的长度和采样率灵活调整。
最容易被误解的地方 :
这些箱子在"编号"上确实是等差递增的------第一个箱子叫 0,最后一个叫 1,步长就是 1/256。但这只是给神经网络看的"等级编号",并不代表真实幅度的物理刻度。
举个例子:心电图的单位是 mV。第一个箱子对应的是电压最低的那 7.8 个点,它在编号上占据了 0 ~ 1/256 这一格,但它在物理世界里的电压跨度不一定 就是 1/256 mV。它可能极小(几个点全是 0.01mV),也可能大得离谱(因为低幅值信号本来就密集)。总之,箱子的物理宽度完全不等距,只有编号是等距的------这正是等频分箱"拉伸微弱信号、压缩尖峰信号"的秘密所在。
记住,这是等级编号,而非真实物理信号!
模型训练完后,它同样会输出一串预测好的"等级编号"(0~1之间的浮点数),此时我们需要将其逆变换,我的逆变换设计很简单,就是查中位数表。在训练前分箱的时候,记录一下:每个箱子里所有原始采样点的中位数(或平均值)。根据模型输出的等级,查询其箱索引,而箱索引对应的中位数,就是重建波形的幅值,看图效果还是可以的。
评估时需要注意的点:
我觉得这个变换是有意义的,但是论文中并未阐述这个逆变换的问题,也许是我理解错误,一切以原文为准,但我仍需阐述一下我的思路必须考虑的问题--数据泄露(查表法所引起)。
直接用整个数据集计算边界和中位数,然后再把训练集和测试集分开,这是严重数据泄露 !因为你在计算"这256个箱子该怎么切"的时候,偷看了测试集的幅值分布。你用来划分箱子的边界(比如最小值、最大值、分位点)已经包含了未来未知数据的信息。这就好比你在考试前,先把标准答案(测试集)的分布摸清了再去划重点。
正确的流程是:
首先按受试者(同一人的生理信号是相似的,最好不要按时间分,而是按人分,避免数据泄露)划分训练集和验证集。
第二步,基于训练集的幅值分布计算边界和每个箱子的中位数,生成中位数表。
第三步,把训练集的原始ECG映射成等级(0~1),喂给模型。
第四步,拿着训练集生成的同一个中位数表,去映射测试集的原始ECG。即使测试集的最大值超过了训练集的最大值,也要强制归到第256箱(代码里做截断处理)。
第五步,拿着第二步生成的中位数表),把预测的等级还原成 mV,计算 RMSE评估模型。
*************本节完*************
******这一节探索一下其它方法2******
等宽分箱(Equal Width Binning)
等宽分箱指的是每个分隔点或者划分点的距离一样,即等宽。
Matlab
% ============================================================
% 等宽分箱(Equal-Width Binning)归一化效果演示
% 包含:训练标签(等级) + 逆变换重建(还原物理波形)
% ============================================================
clear; clc; close all;
% 1. 读取数据
filePath = 'D:\ECG-Tran\Untitled1.csv';
data = readmatrix(filePath);
ecg = data(:,1);
N = length(ecg);
fs = 200;
t = (0:N-1) / fs;
% 2. 普通 Min-Max 归一化(线性映射到 [0,1],作为基准参考)
ecg_mm = (ecg - min(ecg)) / (max(ecg) - min(ecg));
% ========== 3. 等宽分箱 (EWB) 归一化 ==========
numBins = 256;
% 3.1 计算等宽边界(幅值范围均匀划分)
edges = linspace(min(ecg), max(ecg), numBins+1);
% 3.2 将原始幅值映射为箱子序号 (1 ~ 256)
binIdx = discretize(ecg, edges);
binIdx(isnan(binIdx)) = numBins; % 处理极右边界溢出
binIdx(binIdx == numBins+1) = numBins;% 稳健性兜底
% 3.3 ★ 训练标签(Label):输出为 0~1 的均匀等级(横轴被拉伸/压缩)
ecg_ewb_rank = (binIdx - 1) / (numBins - 1);
% 3.4 ★ 逆变换重建(推理时使用):用箱中位数还原物理幅值(mV)
binValues = zeros(1, numBins);
for i = 1:numBins
binValues(i) = median(ecg(binIdx == i));
end
ecg_ewb_reconstructed = binValues(binIdx); % 此时单位为 mV
% 为了方便和 Min-Max 画在一张图上,将重建信号也线性映射到 [0,1]
ecg_ewb_rec_norm = (ecg_ewb_reconstructed - min(ecg_ewb_reconstructed)) / ...
(max(ecg_ewb_reconstructed) - min(ecg_ewb_reconstructed));
% ========== 4. 可视化(3个子图) ==========
figure('Position', [100, 100, 1000, 900]);
% ---- 子图1:宏观对比(Min-Max vs EWB 等级) ----
subplot(3,1,1);
plot(t, ecg_mm, 'b--', 'LineWidth', 1.2); hold on;
plot(t, ecg_ewb_rank, 'r-', 'LineWidth', 0.8);
hold off;
title('图1:训练标签对比(Min-Max 线性 vs 等宽分箱等级)');
xlabel('时间 (s)'); ylabel('归一化幅值');
legend('Min-Max (线性标签)', 'EWB (等宽等级训练标签)', 'Location', 'best');
grid on; xlim([0, 10]);
% ---- 子图2:逆变换重建(推理结果) ----
subplot(3,1,2);
plot(t, ecg_mm, 'b--', 'LineWidth', 1.2); hold on;
plot(t, ecg_ewb_rec_norm, 'r-', 'LineWidth', 0.8);
hold off;
title('图2:推理结果对比(Min-Max 线性 vs 等宽分箱逆变换重建)');
xlabel('时间 (s)'); ylabel('归一化幅值');
legend('Min-Max (基准)', 'EWB 逆变换还原 (箱中位数)', 'Location', 'best');
grid on; xlim([0, 10]);
% ---- 子图3:幅值分布直方图(展示等宽分箱的分布情况) ----
subplot(3,1,3);
histogram(ecg, 50, 'FaceColor', 'b', 'FaceAlpha', 0.4, 'EdgeColor', 'none'); hold on;
histogram(ecg_ewb_rank, 50, 'FaceColor', 'r', 'FaceAlpha', 0.6, 'EdgeColor', 'none');
hold off;
title('图3:幅值分布直方图对比');
xlabel('幅值'); ylabel('样本计数');
legend('原始ECG(非均匀分布)', 'EWB 等级(仍保持原始分布形状)', 'Location', 'best');
grid on;

通过可视化发现,其非常接近min-max归一化,等级标签的分布与原始幅值分布一致,高幅值区域(如R波)仍占主导,低幅值区域(P、T波)分辨率不足。
信息熵分箱
这是一个有监督的分箱方法,本研究的输入是雷达的机械信号,输出连续的ECG电压值,是回归任务,如果把ECG的真实值(mV)当作"标签"来指导分箱,那么在训练模型时,就提前让模型"看见"了它需要预测的东西,这会导致对模型性能的评估完全失效。
此类任务可使用这个分箱技术:
- 医学诊断:根据雷达信号预测ECG,然后判断心脏是否"健康"或"有疾病风险"。
卡方分箱
卡方分箱的前提 :拥有一个离散的类别标签,对于本任务同样不适用,如果强行使用:必须先把ECG的真实电压值人为切成几个类别(比如"高压、中压、低压")。这会丢失精确的数值细节。
卡方分析的核心是将相似的部分合并,使用卡方统计量评估相似程度:
首先进行初始化:将每个样本值作为一个单独的箱子。
第二步:对于相邻的箱子,计算他们关于类别标签的卡方统计量。
对于相邻的两个箱子A和B,其卡方统计量可按照如下公式计算:
代表行,这里是两个箱子(=1对应A箱子,=2对应B箱子)
代表列,值类别标签的个数(比如二分类就是2列)。
是观测频数,表示第
个箱子中,属于
类的实际样本数。
是期望频数,表示当两个箱子无差别时,第
个箱子中理论上应属于
类的样本数。
其中表示第
行的合计样本数,
表示第
列的合计样本数,
为总样本数。

1J. Qiu, M. Jiang, K. Chi, J. Liu and G. Dai, "RaECG: mmWave Radar-based Electrocardiogram Monitoring Using Chest Vibration and Carotid Pulse," IEEE INFOCOM 2026 - IEEE Conference on Computer Communications, Tokyo, Japan, 2026, pp. 1-10, doi: 10.1109/INFOCOM59046.2026.11571601.