
做多模态感知脉诊仪这个项目之前我的第一版原型其实特别寒酸只有一路薄膜压力传感器加一个单片机压在桡动脉上方能采出一条带起伏的波形。当时我觉得已经挺像回事了直到拿给一位有经验的临床大夫看对方扫了一眼波形直接摇头“频率是病人的心率但这不能叫脉象。”那个反馈让我意识到脉诊仪真正难的点不在采集而在“感知”的完整性——手指触诊时感受到的血管张力、脉管深浅、血流滑涩从来不是一路压力信号能表达清楚的。这个项目后来演变成一套以压力通道、光电容积通道、心电通道为核心的感知系统也就是标题里说的“多模态感知脉诊仪”。它解决的不是“能不能测到脉搏”的问题而是“测到的信息能不能还原中医脉诊里的位、数、形、势”。这篇内容我会按项目推进的先后顺序展开先讲为什么单模态不够用再讲三个通道各自的选型逻辑然后是定位机构、加压控制、信号同步、特征建模一直到验证阶段踩过的坑。适合正在做脉诊设备、可穿戴健康监测或者想把中医指标量化的人参考哪怕是刚入门的也能顺着链路把整套系统搭起来。1. 单模态的边界为什么脉诊仪必须走多模态路线1.1 手指触诊真正读取的信息组合中医脉诊不是单纯“摸一下血管跳得多快”而是同时感知多个物理维度。手指按下去的过程里首先得到的是动脉搏动的压力幅度和节律继续加压能体会到血管壁的张力有人叫“如按琴弦”有人叫“如珠走盘”再配合手指对局部组织温度、皮肤湿度、脉管周围肌肉质地的感受才能形成完整的脉象判断。这些信息如果翻译成工程语言至少包括静态压力探头贴合的力度、动态脉动压力血管搏动产生的力和波形、血流灌注信息血管内血液量的变化、心脏电活动时间基准每一拍的准确起点。这里面任何一路单独拿出来都只能描述脉搏的某一个侧面。我第一版原型只有动态脉动压力这一路相当于用一条音频轨道去还原整场交响乐。能听出节奏但乐器层次、音色细节全丢了。多模态感知脉诊仪的设计思路本质上是把人手指同时工作的几种感受拆成独立物理量分别用对应原理的传感器去采集再用算法融合还原。1.2 一路波形里到底“失真”了什么用单路压力传感器去测桡动脉波形看起来有主波、有重搏波甚至能算出心率变异性好像信息量很足。但真正的问题在于不同脉象在某一层压力下的压力波形可能高度相似。弦脉和滑脉是个典型例子。弦脉的深压波形往往表现为上升支陡峭、重搏波前移变浅滑脉在类似压力下则表现为上升下降平滑、重搏波圆钝。但在轻压档这两种脉象的波形容貌可能都呈现“幅度偏大、周期整齐”的样子单靠一路波形很容易混淆。只有把压力通道施加到不同深度的响应曲线、结合血流灌注波形一起看才能把“张力高”和“流利度高”这两个变量区分开。另外还有静压信息的问题。手指诊断里非常重要的“浮沉”指的是脉象在浅层还是深层可感这必须知道当前按压到组织的绝对压力值以及在该压力下脉动能量的大小。普通脉搏传感器往往只输出交流耦合后的脉动成分等于把“按多深”这个维度的信息直接丢了。而多模态系统里的压力通道必须保留直流分量把这个变量补回来。1.3 多模态系统的整体框架最终采用的结构是三个核心感知通道加上一个机制控制模块。通道物理量主要还原的脉诊信息压力通道静态压力脉动压力位的深浅、脉形、血管壁张力光电容积通道组织血容量变化血流灌注、滑涩趋势心电通道心脏电活动每一拍的时间锚点、心率基准除这三路之外温度和超声在我的设计里属于可选扩展温度探头贴敷在寸口附近反映末梢循环状态超声探头能测血管壁运动对“动脉硬化”相关指标有直接价值但成本和数据处理复杂度明显更高第一版不建议纳入。整体流程是定位机构先把三路探头压在寸关尺对应位置上加压模块按浮中沉三档施加并稳定压力多路信号同步采集后进入预处理链路按心电R波切出每个心跳周期再从压力、光电容积、传导时间三类特征中提取指标最后映射到脉象属性标签上。下面我按这条流水线逐段拆开讲。2. 压力、血流与心电三路通道的选型逻辑2.1 压力通道静压加脉动的耦合测量压力通道承担的任务最重因为它既要测静态压力又要测叠加在上面的微小脉动。绝大多数普通薄膜压力传感器能测静态力但动态响应偏慢噪声偏大压电传感器动态响应极好却几乎不能测持续恒定的压力电荷会在几毫秒内泄放。单独选哪个都不对。我们的做法是用压阻式薄膜压力传感器作为敏感元件再通过一个柔性空气囊把探头的压力传导给传感器。气囊的作用不是传感而是把接触面的点压力均匀化避免探头边缘在皮肤上形成应力集中。这个细节对数据质量影响很大没有气囊缓冲时稍微偏离桡动脉中心波形幅度就会暴跌而且受个体腕部弧度影响重复性极差。加了气囊后有效接触面积变大对位置偏差的容忍度明显提升。指标上量程选0到20N就够用正常人寸口部加压到明显不适也就10N上下留出余量防止个别受试者按压时用力过猛损坏传感器采样率建议不低于200Hz脉搏基频通常在1到2Hz但上升支的斜率变化需要更高的时间分辨率ADC精度至少16位因为脉动分量相比静压分量往往只有几十分之一位数不够叠加在静态压力上的小信号会被量化噪声淹没。2.2 光电容积通道补上血流灌注视角光电容积脉搏波也就是PPG原理是发射特定波长的光到皮下组织再用光电二极管接收未被吸收、反射回来的光。血液容积随心脏搏动周期性变化时组织的吸收和反射特性跟着变化从而得到光学脉搏波。两个关键选择是波长和探头位置。波长上绿光对浅表血流敏感、信号幅值大但容易受环境光透过皮肤影响对探头遮光要求高红外光穿透更深对深层血流更敏感且受肤色和表皮干扰小。我最后在绿光和红外之间选了红外作为主光源理由是脉诊场景里探头要压在皮肤上遮光条件本来就容易做红外的组织穿透能力与脉诊关注“深部血管搏动”的目标更匹配。探头位置不能和压力探头重叠。PPG探头如果直接压在受压区域局部缺血会让信号衰减到无法使用必须放在压力探头旁边10到20毫米的邻近区域。这个距离既要避免相互干扰又要在同一动脉供血区内否则光电容积和压力波形会失去相关性。2.3 心电通道给每一拍一个可靠的时间锚点心电通道不需要节律识别以外的高精度诊断能力它的主要价值是给每次心跳提供绝对时间基准。直接用压力波形找峰切周期不是不行问题是脉搏波传到手腕有一定延迟且这个延迟会随心率、血压变化用错误周期边界切出的波形会把相邻两个心跳的特征混叠。心电采用标准的三导联简化配置三个银氯化银电极片贴在左右手腕内侧和右上臂即可。采样率要做到500Hz到1000HzR波是一个很陡的尖峰采样率不足会导致R波检测点偏移几个毫秒对后续脉搏波传导时间计算来说是灾难。这里想特别提一个工程细节心电通道的模拟前端要带右腿驱动电路否则在手腕这种电极间距很近的配置下共模干扰会让R波完全淹没在工频噪声里。第一版我没加这个电路波形出来全是50Hz的毛刺后来补上才稳定。3. 寸关尺定位与加压机构数据质量的前端决定因素3.1 定位基准与三探头结构很多入门者会把精力放在传感器和算法上我却发现整个系统里最难的不是这些而是把探头放对位置。中医脉诊的寸关尺是以桡骨茎突为体表标志茎突内侧对应“关”关前为“寸”关后为“尺”。问题是这个距离因人而异手腕粗细、桡骨形态都会影响三个位置的相对间隔。第一版我用固定间距的三探头结果很多人测出来寸关尺信号质量差异巨大后来改成可调结构中间关脉探头对准桡骨茎突内侧寸和尺两端通过滑动导轨调节位置调节范围留出15毫米左右的余量并用毫米刻度指示实际间距以便记录个体参数。定位时还有一个很容易忽略的点手腕要固定在托架上但固定力不能太大。我们用柔性腕托加尼龙搭扣以不能自由移动但按压时不会发白为准过紧会把浅表静脉压迫阻断导致远端PPG信号消失。3.2 浮中沉三档压力怎么给定“浮中沉”在传统脉诊里是医生手指施加的不同压力档位多模态系统里必须把它转化成可执行的物理量。我的做法是设三档目标压力档位目标压力范围对应脉诊含义浮1到3N轻触皮肤即可感到搏动中4到6N中等压力下搏动最强沉7到10N重压至血管被部分压闭这里必须强调这些数值不是绝对准的只是一个初始范围。不同人的血管深度、皮下脂肪厚度差异很大同样的5N压力对某个体可能已经压到骨面对另一个体只是刚碰到动脉。实际采集流程采用闭环方式加压模块先缓慢增压到目标档位利用压力通道自身的静压反馈做PID稳定等示数稳定后再采集30秒到60秒。这样才能保证三档数据来自同一位置、同一状态而不是“看起来按了三档实际每档位置都跑了”。3.3 加压机构的选型气囊方案与电机方案对比我同时尝试过两种加压机构结论是气囊方案更适合脉诊这个场景。步进电机加丝杠的方案响应快、定位精确可以直接数字控制位移但它的压力集中在小面积探头上受试者很容易疼痛而且每次电机走到同一位置因为皮肤软组织蠕变实际压力还会慢慢变化需要额外压力闭环。气囊方案的做法是给每个探头配一个独立小气囊通过微型气泵加气用电磁阀泄压压力传感器反馈控制。优点是压力分布均匀、受试者舒适度好每秒几牛的压力变化对脉诊完全够用缺点是小容积气囊的充放气有滞后PID参数要调得软一些否则会出现持续震荡。在可以接受的响应速度前提下我并不建议为了“看起来更先进”而选择电机方案。脉诊过程中人在动、血管在搏动机械位置再精确也不如一个能柔和贴合组织的柔性结构来得稳定。4. 同步采集、噪声处理与模态对齐算法上限由数据质量决定4.1 多路信号如何做到严格同步多模态系统最忌讳的事情是各通道各自定时、最后在电脑端用软件时间戳拼合。时间戳方法在毫秒级延迟下问题不大但脉搏波传导时间的计算需要几毫秒精度软件拼合完全满足不了。我们的采集架构是这样的主控板使用一个晶体振荡器作为统一时基所有通道由同一个硬件触发信号启动采集每路ADC在采样完成后打上统一的采样序号而不是绝对时间。数据落盘以后用采样序号做索引任何通道的同一序号都对应同一物理瞬间。实际联调时验证过如果各通道使用独立时钟即使都标称200Hz采样实际采样率会差出几个ppm几分钟内累计的时间漂移就能让R波和压力波的对应关系偏移几十毫秒。改用统一触发加统一时钟之后这个问题彻底消失。4.2 噪声源梳理与滤波策略脉诊仪工作在真实人体上噪声比实验室里想象的要多得多。我梳理了四个最主要的噪声源一是50Hz工频干扰主要影响心电和压力通道。解决办法是硬件屏蔽加软件陷波但要注意陷波器不能无脑套在全部通道上心电的QRS波形本身含有一定高频分量强力陷波会让R波变形。我的策略是压力通道和PPG通道加50Hz陷波心电通道保留完整带宽依靠模拟前端和右腿驱动去抑制工频。二是运动伪影。受试者的呼吸会造成整体基线起伏手指微动、腕带滑移也会叠加宽频噪声。压力通道里的静压分量恰恰能作为运动参考——当静压发生明显漂移时大概率是探头和皮肤之间发生位移利用这段静压变化做自适应滤波可以部分扣除PPG通道的基线漂移。三是呼吸引起的低频波动频率大约在0.2到0.4Hz。分析脉动波时用0.5到30Hz的带通滤波器直接滤除但注意做带通之前必须先记录静压均值不然会把绝对压力信息丢掉。四是传感器自身的摩擦噪声尤其是气囊与皮肤接触面的粘滑效应。这无法完全靠算法消除主要在探头表面材料上解决在气囊外包裹一层医用级硅胶膜能明显降低这种低频毛刺。4.3 以R波为锚点的拍周期切分与特征对齐预处理链路里最关键的一步是周期切分。我们先用经典算法检出心电R波位置然后以每个R波为锚点向前向后各取一段固定时长的信号作为该心跳周期的压力波和PPG波段。这里有个容易犯的错直接用压力波峰值去切分。因为脉搏波从心脏传到手腕存在延迟而且延迟在每个拍里不是常数用峰值切分会让不同周期的起始点参差不齐后续的特征计算全部失真。R波锚点不受外周传导影响是最可靠的参考。切出的每个周期还要做时间归一化。心率快的人心跳周期只有600毫秒慢的人超过1秒直接比较波形幅度是没问题的但计算斜率、面积等特征时必须先把每个周期插值到统一长度。我们统一采用线性插值到256点压力波形和PPG波形同步重采样保持在同一个时间轴上。import numpy as np from scipy.signal import butter, filtfilt, find_peaks def bandpass(sig, fs, hp0.5, lp30.0): b, a butter(3, [hp, lp], btypebandpass, fsfs) return filtfilt(b, a, sig) def cut_by_r_peak(pressure, ppg, r_peaks, before0.2, after0.4, fs200): segments [] for r in r_peaks: start max(0, int((r - before) * fs)) end min(len(pressure), int((r after) * fs)) p_seg pressure[start:end] o_seg ppg[start:end] # 重采样到统一长度 x_old np.linspace(0, 1, len(p_seg)) x_new np.linspace(0, 1, 256) p_res np.interp(x_new, x_old, p_seg) o_res np.interp(x_new, x_old, o_seg) segments.append((p_res, o_res, r)) return segments5. 从波形到脉象特征设计、标签体系与模型路线5.1 先拆属性再谈28种脉象脉象分类的终极目标是识别传统28种脉象但直接做28分类是给自己挖坑。原因很现实样本量不够专家标签的一致性也不够。不同医者对同为“弦滑脉”的个体可能给出不同倾向直接把28类做成互斥标签训练集里的噪声会大得离谱。更稳妥的做法是把分类问题拆成多标签属性预测位浮、中、沉、数迟、数、形弦、滑、细、洪、势有力、无力。每个属性的标注比完整脉象简单一致性更高模型学习难度也更低。最后再通过属性组合规则推导出脉象结论例如“脉位浮脉形洪脉势有力”指向典型的洪脉。5.2 三路信号里能挖出哪些特征特征设计是整个模型链路里信息密度最高的环节。我从三路信号里分别提取特征再组合成融合特征向量。来源特征对应临床意义压力波形主波幅度、上升支最大斜率、重搏波深度、降中峡位置血管张力、脉压大小压力三档响应静压-振幅曲线斜率、峰值所在档位脉位深浅、血管顺应性光电容积波形灌注指数、上升时间、衰减时间血流灌注水平心电与压力组合脉搏波传导时间动脉僵硬度心电与光电容积组合心率、心率变异性节律与自主神经状态光看表格可能不够直观举两个例子说明特征与脉象属性的映射关系。弦脉在压力波形上典型表现为上升支陡峭、主波幅值高、重搏波明显前移且幅度变小对应血管壁张力增大同时脉搏波传导时间会比同年龄正常值缩短因为动脉弹性下降后波在血管中传播更快。滑脉的特征则主要体现在波形的“圆润度”上主波到降中峡的过渡平滑、没有明显的快速回落PPG衰减时间也相对延长对应血流粘滞度偏低、灌注阻力小。提取三分档压力曲线时要特别注意有些人的“最强搏动点”不在中压档而在浮压或沉压档这本身就是重要的辨证特征比单档波形特征更值得关注。5.3 标签几乎是最难的一环模型训练离不开标签而脉诊数据集的标签问题是所有环节里最费劲的。我们当时的标注方案是请三位有经验的临床大夫各自独立对同一段多模态信号采样记录对应的脉象属性只对至少两位意见一致的样本进入训练集争议样本单独保留不强行合并。即便如此属性级别的一致性也只能到七成左右。为了解决这个问题我们引入了多任务学习模型同时预测中医脉象属性和西医客观指标例如心率、血压分级、动脉硬化指数。客观指标有标准仪器测量值作为强标签可以帮助模型学到对血管物理状态更稳健的表征再把这些表征作为条件去约束脉象属性的预测。实测下来多任务框架比单纯用脉象标签训练的准确率提升了约8个百分点。这件事背后有个很容易被忽略的认知脉象属性本质上是物理状态的投影先学好物理状态再学投影关系比直接学投影更合理。5.4 模型选型与评估模型层面我们对比过随机森林、XGBoost、1D-CNN和简单Transformer。在样本量不足两千例的情况下树类模型的综合表现反而最稳定准确率与1D-CNN相当但训练成本低、特征重要性可解释。深度模型真正发挥优势是数据量达到万级以后所以我们把深度学习放在第二阶段第一阶段先用树模型把特征筛选、数据迭代跑通。特征选择后发现压力三档响应曲线的斜率、脉搏波传导时间、上升支斜率这三项对分类贡献最大几乎占了总特征重要性的60%。评估协议要格外小心个体泄露问题。同一个人在不同时间、不同体位的多次测量高度相关如果随机划分训练集和测试集同一人的数据可能同时出现在两边测试结果会虚高。正确做法是按个体分组交叉验证确保一个人的所有样本只出现在训练集或只出现在测试集。这样评估出的性能才接近真实场景。6. 验证阶段绕不开的坑与后续可能的扩展6.1 可重复性实验怎么做才不算自欺欺人设备开发最怕的是“今天测得准明天测不准”。可重复性实验如果只测同一时刻同一位置连着采五遍那是自欺欺人。真正有意义的实验是同一受试者拆掉设备重新佩戴换个操作者重新定位隔几天再采一轮记录同一指标在不同条件下的变异系数。我们当时做了一组30人的小规模测试结果发现最大的变异来源不是传感器噪声而是定位偏差。定位偏移一到两毫米压力波形的主波幅值可以相差30%甚至更多。这个结果促使我们在系统里加入自动寻位流程每次佩戴后控制加压机构在关脉周围做小范围二维扫描找到脉动振幅最大的触点再开始正式采集。这一步加入后重复佩戴之间的特征变异系数从25%左右降到10%以内。另外传感器温漂也是不能忽视的问题。压阻式传感器开机后前五分钟输出会持续漂移所以正式采集前至少要预热五分钟并且每次采集前都要做一次零点校准。6.2 临床使用的信任问题解释比分类更重要模型输出一个“弦脉”的概率对临床医生来说远远不够。对方真正想看到的是为什么判定为弦脉哪些特征支持这个结论波形和既往病例有什么可比性。我们因此在报告里不只给结论还给出支撑特征的数值对比比如“该样本上升支斜率位于同年龄组第87百分位脉搏波传导时间位于第72百分位”。这种解释性输出带来的信任感远比一个黑箱模型给出的准确率数字更有效。这里也要泼一盆冷水多模态感知脉诊仪目前还不能作为诊断工具使用它的价值更接近“把传统脉诊信息客观化、记录化、可追溯化”。我们内部一直把它叫做“脉象数字化记录仪”而不是“脉象诊断仪”。这个定位调整之后很多不切实际的期望反而消失了项目推进也顺畅了许多。6.3 后续扩展方向从技术路线看最值得做的扩展是加入超声模态直接测量血管壁运动速度和管径变化这对动脉硬化、血管张力评估是压力通道补不上的信息。其次是建立纵向跟踪队列让设备在健康管理场景下长期使用积累个人脉象随体质、作息、季节变化的曲线这种动态数据比单次采集信息量高出几个数量级。如果产品化还要考虑采样时长与人机交互的平衡。目前单次完整采集包括定位、三档加压、信号记录全程大约三分钟对研究来说可以接受但对日常健康管理偏长。后续可以把三档加压缩短为自动连续变压力扫描模式在几十秒内完成一个压力梯度。这个方向我们已经做过原型验证效果不错只是还需要在压力稳定算法上再打磨一轮。回看整个项目我觉得最值得分享的体会是做多模态感知脉诊仪真正的难点从来不在“多模态”三个字本身而在于每一路信号都要较真、每一个定位细节都要抠、每一份标签都要反复确认以及最后如何把工程指标翻译回医生能理解的语言。技术的尽头是需求这句话在这个项目里体现得再真实不过了。