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,那上升沿的斜率是无穷大。实际物理系统做不到。我在项目中遇到过,直接用这个算法去驱动比例阀,结果压力超调严重,甚至震荡。

避坑指南: 我曾经在方波生成里直接用了阶跃函数,结果实测波形像「心电图」一样抖。后来加了一个上升斜率限制(比如 100 cmH₂O/s),让压力平滑爬升到目标值,问题就解决了。代码里可以加一个 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 病人),可能不太够用。

经验之谈: 我做过一个对比测试,同样的目标压力 20 cmH₂O,方波能在 0.1 秒内达到,正弦波需要 0.3 秒。对于呼吸频率快的病人(比如 30 次/分),正弦波可能还没升到目标值就开始呼气相了。所以波形选择要结合临床场景,不能一概而论。

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;
    }
}
核心要点: 波形生成算法虽然简单,但它是呼吸机控制的基础。波形选对了,病人就舒服;波形选错了,人机对抗、误触发、甚至气压伤都可能出现。我建议你在做算法测试时,先用仿真工具把三种波形画出来,看看压力曲线是否平滑、有无毛刺。这一步做好了,后面控制算法的调试会省很多事。

好了,这一章就到这里。下一章咱们聊聊流量波形,那又是另一番天地了。