AnyMath 文档
Notebook

心电信号的建模

该示例显示了基于非对称高斯函数的心电信号的建模,包括正常信号的形成和一些病理变化。

工作区准备和可视化设置

功能 engee.clear() 清理工作区:

In [ ]:
engee.clear()
Warning: detected a stack overflow; program state may be corrupted, so further execution might be unreliable.

两种图形渲染模式可用于可视化结果。:

*对于静态,快速渲染,使用 gr().
*对于交互式,具有缩放和查看值的能力的动态可视化,使用 plotlyjs().

通过注释掉第二个命令来选择其中一个命令。 两个后端是互斥的,最后一个被调用的后端将被激活。

In [ ]:
gr()
# plotlyjs()
Out[0]:
Plots.GRBackend()

心电图信号

下图显示了两个连续的心动周期和正常心电图的基本要素。

image.png

该图显示了正常心电图的主要元素及其在单个心动周期内的位置。 P波反映了唤醒通过心房的传播。 之后是段PQ,其对应于脉冲通过房室结的传导,并且间隔PQ复盖从心房激发开始到心室激发开始的整个路径。 QRS复合体反映心室去极化:Q波对应于室间隔的初始激发,R波对应于激发通过心室心肌的大部分的扩散,S波对应于基底心室中去极化的最后阶段。 在QRS复合物之后,位于ST段,其对应于通过激发完全复盖心室心肌的时期,并且通常位于靠近异线的位置。 随后是T波,反映了心室复极化。 QT间期复盖从QRS复合物开始到T波结束的区域,并表征心室去极化和复极化的总时间,包括去极化和随后的复极化。

心电图的这种表示便于进一步的数学建模,因为它允许我们将心循环视为单独的信息片段的序列,每个片段都可以独立地描述和参数化。

模型描述

在本例中,我们考虑基于非对称高斯函数之和的心电信号建模。 这种方法允许我们将单个心动周期表示为单个片段的集合。 在所使用的实现中,信号由部件形成 , , ​, ​, 此外,有两个组件 它们用于更灵活地描述复合体。 . 该模型基于将信号表示为单个波的总和。:

参数在哪里 确定振幅 -th组件,参数 设置其时间极值的位置,以及函数 它负责极值点左右波的宽度。 为了使相同的函数同时描述对称和非对称信号片段,宽度被分段地设置。:

如果 ,相应的波是对称的,并且如果 ​ 然后它变得不对称。 正是这种属性允许您灵活地设置单个ECG切片的形状,并获得更真实的信号形态。

该模型的实现基于两个功能。 第一函数形成信号的一个非对称高斯分量。 如果我们通过以下方式表示这样的组件 ,则写成:

在代码中,这个想法是由一个函数实现的 asym_gauss,它检查时间轴上的每个点是向左还是向右的点 ,并根据这一点,使用左宽度 ,或正确的宽度 . 因此,相同的函数可以描述正波和负波,以及心电信号的对称和不对称片段。

第二个功能旨在 ecg_complex 以形成整个心动周期。 它总结了几个组件,每个组件都由相同的函数计算。 asym_gauss,但有自己的一组参数。 在其扩展形式中,该公式具有形式:

In [ ]:
function asym_gauss(t, A, mu, b1, b2)
    y = zeros(length(t))

    for i in 1:length(t)
        if t[i] <= mu
            y[i] = A * exp(-((t[i] - mu)^2) / (2 * b1^2))
        else
            y[i] = A * exp(-((t[i] - mu)^2) / (2 * b2^2))
        end
    end

    return y
end

function ecg_complex(t, A, mu, b1, b2)
    y = zeros(length(t))

    for k in 1:length(A)
        y += asym_gauss(t, A[k], mu[k], b1[k], b2[k])
    end

    return y
end
Out[0]:
ecg_complex (generic function with 1 method)

正常心电信号的模拟

为了模拟信号,我们将设置1kHz的采样频率。 接下来,形成持续时间为1秒的一个心动周期的时间轴。

In [ ]:
fs = 1e3
Ts = 1/fs
t = 0:Ts:1-Ts
Out[0]:
0.0:0.001:0.999

在示例的这一部分中,设置正常心电信号的参数并执行其形成。 数组 , , 分量的振幅、它们的时间极值的位置以及左右的宽度决定了单个波的形状和不对称性。 之后,使用函数 ecg_complex 形成一个正常的心脏周期,然后显示在图表上。 接收到的信号用作随后与病理形式的ECS进行比较的基本选项。

In [ ]:
A_norm  = [ 0.11, -0.11, 0.95, 0.02, -0.18, 0.00, 0.20 ]
mu_norm = [ 0.18,  0.476, 0.500, 0.510, 0.523, 0.60, 0.74 ]
b1_norm = [ 0.03,  0.010, 0.010, 0.006, 0.012, 0.040, 0.045 ]
b2_norm = [ 0.05,  0.010, 0.010, 0.007, 0.014, 0.040, 0.065 ]

y_norm = ecg_complex(t, A_norm, mu_norm, b1_norm, b2_norm)

p1 = plot(t, y_norm,
    xlabel = "时间,从",
    ylabel = "的振幅",
    title = "正常周期",
    label = "标准"
)
Out[0]:
No description has been provided for this image

在形成正常信号后,该模型用于模拟ECS中的病理变化。 在这个例子中,考虑了病理性牙齿。 ,平,负,高和不对称的尖头 ,以及凹陷和节段高程 . 每个选项都是通过改变相应部件的参数而不改变模型的整体结构来获得的。

心电图病理建模

这部分研究了基于心动周期参数模型的心电信号病理变化的建模。 通过改变单个信号分量的振幅、时间位置和宽度,能够在不改变模型的整体结构的情况下再现ECG形状的特征偏差。

作为示例的一部分,考虑了病理变化的以下变体:

  1. 病理Q波;

  2. 平T型叉;

  3. 负T型叉;

  4. 高T型尖头;

  5. 不对称T型尖;

  6. ST段抑郁症;

  7. St段的高程。

病理Q波

In [ ]:
A_q  = [ 0.11, -0.32, 0.82, 0.03, -0.16, 0.00, 0.22 ]
mu_q = [ 0.18,  0.468, 0.500, 0.512, 0.532, 0.60, 0.74 ]
b1_q = [ 0.03,  0.016, 0.010, 0.006, 0.012, 0.040, 0.045 ]
b2_q = [ 0.05,  0.018, 0.010, 0.007, 0.014, 0.040, 0.070 ]

y_q = ecg_complex(t, A_q, mu_q, b1_q, b2_q)

p2 = plot(t, y_q,
    xlabel = "时间,从",
    ylabel = "的振幅",
    title = "病理Q波",
    label = "Q的病理学"
)
Out[0]:
No description has been provided for this image

平齿T

In [ ]:
A_flatT  = [ 0.11, -0.10, 0.95, 0.03, -0.18, 0.00, 0.06 ]
mu_flatT = [ 0.18,  0.470, 0.500, 0.515, 0.535, 0.60, 0.75 ]
b1_flatT = [ 0.03,  0.010, 0.010, 0.006, 0.012, 0.040, 0.040 ]
b2_flatT = [ 0.05,  0.010, 0.010, 0.007, 0.014, 0.040, 0.060 ]

y_flatT = ecg_complex(t, A_flatT, mu_flatT, b1_flatT, b2_flatT)

p3 = plot(t, y_flatT,
    xlabel = "时间,从",
    ylabel = "的振幅",
    title = "平齿T",
    label = "平T"
)
Out[0]:
No description has been provided for this image

负T波

In [ ]:
A_negT  = [ 0.11, -0.10, 0.95, 0.03, -0.18, 0.00, -0.18 ]
mu_negT = [ 0.18,  0.470, 0.500, 0.515, 0.535, 0.60, 0.75 ]
b1_negT = [ 0.03,  0.010, 0.010, 0.006, 0.012, 0.040, 0.042 ]
b2_negT = [ 0.05,  0.010, 0.010, 0.007, 0.014, 0.040, 0.065 ]

y_negT = ecg_complex(t, A_negT, mu_negT, b1_negT, b2_negT)

p4 = plot(t, y_negT,
    xlabel = "时间,从",
    ylabel = "的振幅",
    title = "负T波",
    label = "负T"
)
Out[0]:
No description has been provided for this image

高T型尖头

In [ ]:
A_highT  = [ 0.11, -0.10, 0.95, 0.03, -0.18, 0.00, 0.42 ]
mu_highT = [ 0.18,  0.470, 0.500, 0.515, 0.535, 0.60, 0.75 ]
b1_highT = [ 0.03,  0.010, 0.010, 0.006, 0.012, 0.040, 0.040 ]
b2_highT = [ 0.05,  0.010, 0.010, 0.007, 0.014, 0.040, 0.060 ]

y_highT = ecg_complex(t, A_highT, mu_highT, b1_highT, b2_highT)

p5 = plot(t, y_highT,
    xlabel = "时间,从",
    ylabel = "的振幅",
    title = "高T型尖头",
    label = "高T"
)
Out[0]:
No description has been provided for this image

不对称的T形尖

In [ ]:
A_asymT  = [ 0.11, -0.10, 0.95, 0.03, -0.18, 0.00, 0.24 ]
mu_asymT = [ 0.18,  0.470, 0.500, 0.515, 0.535, 0.60, 0.74 ]
b1_asymT = [ 0.03,  0.010, 0.010, 0.006, 0.012, 0.040, 0.028 ]
b2_asymT = [ 0.05,  0.010, 0.010, 0.007, 0.014, 0.040, 0.085 ]

y_asymT = ecg_complex(t, A_asymT, mu_asymT, b1_asymT, b2_asymT)

p6 = plot(t, y_asymT,
    xlabel = "时间,从",
    ylabel = "的振幅",
    title = "不对称的T形尖",
    label = "不对称的T"
)
Out[0]:
No description has been provided for this image

ST段抑郁症

In [ ]:
A_depST  = [ 0.11, -0.10, 0.95, 0.03, -0.22, -0.07, 0.18 ]
mu_depST = [ 0.18,  0.47, 0.50, 0.515, 0.535, 0.62, 0.76 ]
b1_depST = [ 0.03,  0.010, 0.010, 0.006, 0.012, 0.055, 0.045 ]
b2_depST = [ 0.05,  0.010, 0.010, 0.007, 0.014, 0.080, 0.070 ]

y_depST = ecg_complex(t, A_depST, mu_depST, b1_depST, b2_depST)

p7 = plot(t, y_depST,
    xlabel = "时间,从",
    ylabel = "的振幅",
    title = "ST段抑郁症",
    label = "ST抑郁症"
)
Out[0]:
No description has been provided for this image

ST段高程

In [ ]:
A_eleST  = [ 0.11, -0.10, 0.95, 0.03, -0.16, 0.10, 0.20 ]
mu_eleST = [ 0.18,  0.47, 0.50, 0.515, 0.535, 0.62, 0.75 ]
b1_eleST = [ 0.03,  0.010, 0.010, 0.006, 0.012, 0.055, 0.045 ]
b2_eleST = [ 0.05,  0.010, 0.010, 0.007, 0.014, 0.090, 0.070 ]

y_eleST = ecg_complex(t, A_eleST, mu_eleST, b1_eleST, b2_eleST)

p8 = plot(t, y_eleST,
    xlabel = "时间,从",
    ylabel = "的振幅",
    title = "ST段高程",
    label = "ST电梯"
)
Out[0]:
No description has been provided for this image

正常和病理EX的比较

在这一部分中,进行正常和病理ECS变体的比较。 为了清楚起见,结果以两种版本呈现:在第一种情况下,所有信号都显示在一个公共图形上,这允许您评估形状的差异和各个部分的相互位移;在第二种情 layout = (4, 2),这使得详细检查每种病理更加方便。

In [ ]:
plot(t, y_norm, 
    xlabel="时间,从", 
    ylabel="的振幅", 
    title="心电信号的比较", 
    label="标准",
    legend_position = :outertopright
)

plot!(t, y_q, label="病理Q")
plot!(t, y_flatT, label="平T")
plot!(t, y_negT, label="负T")
plot!(t, y_highT, label="高T")
plot!(t, y_asymT, label="不对称的T")
plot!(t, y_depST, label="ST抑郁症")
plot!(t, y_eleST, label="ST电梯")
Out[0]:
No description has been provided for this image

让我们使用单独显示所有信号 layout = (4, 2).

In [ ]:
plot(    p1, p2, p3, p4, p5, p6, p7, p8,
    layout = (4, 2),
    size = (1200, 1400)
)
Out[0]:
No description has been provided for this image

分裂叉R

早些时候,在描述模型时引入了两个prong组件 - ​. 然而,在前面讨论的例子中,没有单独分析这样的情况。 在这方面,我们将进一步单独考虑,并模拟具有分裂牙齿的心电信号。 .

In [ ]:
A_splitR  = [ 0.11, -0.10, 0.70, 0.62, -0.16, 0.00, 0.22 ]
mu_splitR = [ 0.18,  0.47, 0.495, 0.520, 0.538, 0.61, 0.74 ]
b1_splitR = [ 0.03,  0.010, 0.008, 0.008, 0.012, 0.045, 0.045 ]
b2_splitR = [ 0.05,  0.010, 0.009, 0.009, 0.014, 0.045, 0.070 ]

y_splitR = ecg_complex(t, A_splitR, mu_splitR, b1_splitR, b2_splitR)

p9 = plot(t, y_splitR,
    xlabel = "时间,从",
    ylabel = "的振幅",
    title = "分裂叉R",
    label = "分裂R"
)
Out[0]:
No description has been provided for this image

结论

在本例中,考虑了基于非对称高斯函数之和的心电信号的参数建模。 结果表明,这种方法可以将心电信号的一个周期形成为一组单独的信息分量,并通过改变相应波的振幅、时间位置和宽度来灵活地控制其形状。