2. 生理信号基础:脉搏波的形成与特征、柯氏音法原理、示波法原理

好,咱们正式开始第二讲。这一章是后面所有算法的基础,说白了就是搞清楚血压计到底在测什么。我当年刚入行时,觉得不就是测个压力嘛,有什么难的?结果第一次做出来的样机,数据飘得连我自己都不敢信。后来才明白,不懂生理信号特征,算法做得再花哨也是白搭。

2.1 脉搏波的形成与特征

先聊聊脉搏波。你想想看,心脏每收缩一次,就把血液泵进主动脉。这股压力波沿着动脉血管一路传播,就形成了我们摸到的脉搏。嗯,这里要注意,脉搏波不是血液在流动,而是压力波在传播。这个区别很重要。

脉搏波有几个关键特征,我习惯把它们分成三块来讲:

  • 上升支:心脏快速射血,压力陡升。斜率越陡,说明心脏收缩力越强。
  • 下降支:射血后期,压力开始回落。这里有个小凹陷叫「重搏波切迹」,是主动脉瓣关闭瞬间造成的。
  • 重搏波:切迹之后的一个小波峰,代表主动脉瓣关闭后血液回流撞击瓣膜产生的反弹波。

我在项目中遇到过一个问题:有些患者的脉搏波重搏波特别不明显,尤其是老年人动脉硬化后,这个特征几乎消失。如果你用重搏波做特征点检测,那算法就很容易翻车。所以后来我设计算法时,都会加一个「特征可信度」的判断,宁可漏检也不误检。

核心要点:脉搏波的形态直接反映了心血管系统的状态。上升支斜率、重搏波切迹位置、波峰幅度,这三个参数是后续算法提取血压值的基础。

2.2 柯氏音法原理

柯氏音法,老一辈工程师都叫它「听诊法」。说白了就是用水银血压计加听诊器,人工听声音测血压。这个方法的发明者叫柯洛特科夫,1905年提出的,到现在一百多年了,依然是临床金标准。

原理其实很简单:

  1. 袖带充气,压力超过收缩压,动脉被完全压闭,血流中断。
  2. 缓慢放气,当袖带压力降到略低于收缩压时,血流开始断续通过,产生湍流和血管壁振动,这就是我们听到的「柯氏音」。
  3. 继续放气,声音会经历五个阶段(柯氏音五相):
时相 声音特征 对应血压
第I相 突然出现的清脆敲击声 收缩压
第II相 声音变柔和,伴有杂音
第III相 声音再次增强,更清晰
第IV相 声音突然变钝、低沉
第V相 声音完全消失 舒张压

我曾经在开发一款动态血压计时,用麦克风采集柯氏音。结果发现环境噪声干扰特别大,尤其是患者手臂稍微动一下,信号就全乱了。后来我加了一个自适应滤波,把心跳同步的噪声和运动伪迹分开处理,才算勉强能用。说实话,柯氏音法做自动化,难度比想象中大得多。

避坑指南:柯氏音第IV相和第V相之间的过渡有时很模糊,尤其是儿童和孕妇。我曾经因为没处理好这个边界,导致舒张压测量偏差超过10mmHg。后来我改用「声音幅度下降80%」作为舒张压判据,效果稳定很多。

2.3 示波法原理

示波法,现在家用电子血压计几乎都用它。为什么?因为它不需要麦克风,只需要一个压力传感器就够了,成本低、抗干扰能力强。

原理是这样的:

  • 袖带充气到高于收缩压,然后匀速放气。
  • 在放气过程中,压力传感器会检测到袖带内的压力波动。这些波动就是脉搏波叠加在袖带压力上的小信号。
  • 把这些波动提取出来,会得到一个「振荡波包络」。这个包络的峰值对应的袖带压力,就是平均压(MAP)。
  • 然后根据经验公式,从平均压推算出收缩压和舒张压。

我习惯用一段伪代码来描述这个流程:

// 示波法血压计算核心流程
// 输入:袖带压力数组 cuff_pressure[],振荡波幅值数组 oscillation[]
// 输出:收缩压 SBP,舒张压 DBP,平均压 MAP

// 1. 找到振荡波包络的峰值
peak_index = argmax(oscillation)
MAP = cuff_pressure[peak_index]

// 2. 计算收缩压对应的幅值比例(通常取0.45~0.55)
sbp_ratio = 0.50
sbp_threshold = oscillation[peak_index] * sbp_ratio

// 3. 从峰值往前找,找到第一个超过阈值的点
for i = peak_index downto 0:
    if oscillation[i] >= sbp_threshold:
        SBP = cuff_pressure[i]
        break

// 4. 计算舒张压对应的幅值比例(通常取0.70~0.85)
dbp_ratio = 0.75
dbp_threshold = oscillation[peak_index] * dbp_ratio

// 5. 从峰值往后找,找到第一个低于阈值的点
for i = peak_index to len(oscillation)-1:
    if oscillation[i] <= dbp_threshold:
        DBP = cuff_pressure[i]
        break

这里有个坑,我当年踩过。示波法的比例系数不是固定的,不同人群差异很大。比如高血压患者和年轻人,这个比例可能差0.1以上。所以我后来做产品时,加了一个「人群自适应」模块,根据脉搏波形态动态调整比例系数。效果嘛,至少通过了YY 0670标准的临床验证。

个人经验:示波法虽然简单,但振荡波提取的质量直接决定算法成败。我建议在硬件上做两件事:一是用高精度ADC(至少16位),二是加一个硬件高通滤波器(0.5Hz左右),把直流分量滤掉,只保留脉搏波交流成分。这样软件处理会轻松很多。

2.4 两种方法的对比

最后做个简单对比,方便你理解什么时候该用哪种方法:

对比项 柯氏音法 示波法
传感器需求 麦克风 + 压力传感器 仅压力传感器
抗运动干扰 中等
算法复杂度 高(需要声音识别) 低(峰值检测即可)
临床准确性 金标准 需校准,偏差±5mmHg以内
适用场景 医院、科研 家用、动态监测

嗯,这一章的内容就到这里。脉搏波是基础,柯氏音法是经典,示波法是主流。搞懂了这些,后面讲算法实现时你就能理解为什么代码要那么写了。下一章我们聊聊信号预处理,说白了就是怎么把脏数据洗干净。