3. 压力波形生成:方波、正弦波、三角波的压力曲线生成算法
好,咱们进入第三章。这一章我打算聊聊呼吸机里最基础、也最直观的东西——压力波形。
你想想看,呼吸机给病人送气,压力不是随便给的。它得按照一定的形状、一定的节奏来。这个形状,就是我们常说的「波形」。临床上最常用的三种波形:方波、正弦波、三角波。说白了,就是压力随时间变化的曲线长什么样。
我个人习惯把波形生成看作是呼吸算法的「门面」。波形好不好看,直接决定了病人的舒适度和治疗效果。我在项目里见过不少因为波形生成太粗糙,导致病人触发误报、甚至人机对抗的情况。嗯,这里面的坑,咱们一个一个填。
3.1 波形生成的核心思路
不管什么波形,核心思路就一句话:给定时间,算出压力。
呼吸机里,我们通常用一个呼吸周期(比如吸气时间 Ti + 呼气时间 Te)来循环。在每个控制周期(比如 2ms 或 5ms)里,我们根据当前时间在这个周期里的位置,代入对应的波形函数,算出目标压力。
伪代码大概长这样:
// 每个控制周期执行一次
float t_cycle = fmod(current_time, Ti + Te); // 当前在周期内的位置
float pressure = 0.0;
if (t_cycle < Ti) {
// 吸气相
pressure = Waveform_Generator(t_cycle, Ti, target_pressure, waveform_type);
} else {
// 呼气相,通常为 PEEP 或 0
pressure = peep;
}
这里 Waveform_Generator 就是咱们要实现的三种波形算法。
3.2 方波压力曲线
方波,也叫阶跃波。吸气一开始,压力瞬间跳到目标值,然后维持不变,直到吸气结束。说白了就是「一步到位,保持住」。
方波在临床上常用于压力控制通气(PCV)。它的优点是压力上升快,能快速打开塌陷的肺泡。但缺点也很明显——太「硬」了,病人可能会觉得不舒服。
算法实现非常简单:
float SquareWave(float t, float Ti, float target_pressure) {
if (t < Ti) {
return target_pressure; // 吸气相,直接给目标压力
} else {
return 0.0; // 呼气相,回到基线
}
}
等等,这里有个坑。你想想看,如果压力从 0 瞬间跳到 30 cmH₂O,那上升沿的斜率是无穷大。实际物理系统做不到。我在项目中遇到过,直接用这个算法去驱动比例阀,结果压力超调严重,甚至震荡。
rise_time 参数,用线性插值做过渡。
改进后的方波:
float SquareWave_Smooth(float t, float Ti, float target_pressure, float rise_time) {
if (t < Ti) {
if (t < rise_time) {
// 上升段:线性爬升
return target_pressure * (t / rise_time);
} else {
return target_pressure; // 平台段
}
} else {
return 0.0;
}
}
3.3 正弦波压力曲线
正弦波,顾名思义,压力按正弦函数变化。吸气相从 PEEP 开始,平滑上升到峰值,再平滑下降回到 PEEP。这个波形最接近人体自主呼吸的形态,所以病人舒适度最高。
正弦波常用于压力支持通气(PSV)或某些比例辅助通气模式。说白了,就是让呼吸机「顺着」病人的呼吸节奏来。
算法实现:
float SineWave(float t, float Ti, float target_pressure, float peep) {
if (t < Ti) {
// 正弦波:从 0 到 π,对应压力从 peep 到 target_pressure 再回到 peep
float phase = (t / Ti) * M_PI; // 0 ~ π
float amplitude = target_pressure - peep;
return peep + amplitude * sin(phase);
} else {
return peep;
}
}
这里要注意,正弦波在吸气开始和结束时的斜率是 0,所以压力变化非常平滑。但这也意味着压力上升速度慢,对于需要快速升压的场景(比如 ARDS 病人),可能不太够用。
3.4 三角波压力曲线
三角波,压力线性上升,再线性下降。形状像个等腰三角形。它介于方波和正弦波之间——比正弦波「硬」一点,但比方波「软」很多。
三角波常用于压力控制通气的变体,或者某些气道压力释放通气(APRV)模式。它的特点是压力变化均匀,没有方波那种「冲击感」,也没有正弦波那种「拖尾感」。
算法实现:
float TriangleWave(float t, float Ti, float target_pressure, float peep) {
if (t < Ti) {
float half_Ti = Ti / 2.0;
float amplitude = target_pressure - peep;
if (t <= half_Ti) {
// 上升段:线性上升
return peep + amplitude * (t / half_Ti);
} else {
// 下降段:线性下降
return peep + amplitude * (1.0 - (t - half_Ti) / half_Ti);
}
} else {
return peep;
}
}
嗯,这里有个细节。三角波的峰值在吸气相的中点。但临床上,有时候我们希望峰值偏左(快速升压)或偏右(缓慢升压)。这时候可以引入一个「峰值偏移」参数,让三角波变成「不对称三角波」。
peak_position 参数(0~1),表示峰值在吸气相中的位置。0.5 就是标准三角波,0.3 就是快速上升、缓慢下降。这样能覆盖更多临床需求。
3.5 三种波形的对比与选择
咱们用一张表总结一下:
| 波形类型 | 压力变化特点 | 舒适度 | 压力上升速度 | 适用场景 |
|---|---|---|---|---|
| 方波 | 瞬间跳变,平台维持 | 低 | 最快 | PCV、ARDS、需要快速升压 |
| 正弦波 | 平滑起落,类自然呼吸 | 高 | 较慢 | PSV、自主呼吸、康复期 |
| 三角波 | 线性升降,均匀变化 | 中 | 中等 | PCV 变体、APRV、过渡模式 |
你想想看,实际呼吸机里,波形不是一成不变的。有时候同一个病人,不同阶段要用不同波形。我见过一个项目,把三种波形做成可配置的,医生在界面上选,算法底层自动切换。这个设计思路值得借鉴。
3.6 代码整合:一个通用的波形生成器
最后,我把三种波形整合成一个函数。这样主循环里调用起来就清爽多了。
typedef enum {
WAVEFORM_SQUARE,
WAVEFORM_SINE,
WAVEFORM_TRIANGLE
} WaveformType;
float GeneratePressure(float t, float Ti, float target_pressure, float peep, WaveformType type) {
switch (type) {
case WAVEFORM_SQUARE:
return SquareWave_Smooth(t, Ti, target_pressure, 0.1); // 0.1s 上升时间
case WAVEFORM_SINE:
return SineWave(t, Ti, target_pressure, peep);
case WAVEFORM_TRIANGLE:
return TriangleWave(t, Ti, target_pressure, peep);
default:
return peep;
}
}
好了,这一章就到这里。下一章咱们聊聊流量波形,那又是另一番天地了。