Community Engee

Спектральный анализ аритмий сердца

Author
avatar-akmalovmakmalovm
Co-authors
avatar-dimabalakindimabalakin
Notebook

Спектральный анализ аритмий сердца

В данном примере демонстрируется применение спектрального анализа к электрокардиографическим сигналам с различными типами сердечного ритма. Рассматриваются записи ЭКГ с нормальным синусовым ритмом, экстрасистолией и фибрилляцией предсердий, полученные из открытых баз данных PhysioNet. Для частотного анализа используются функции библиотеки EngeeDSP.

Функция engee.clear() выполняет очистку рабочего пространств:

In [ ]:
engee.clear()

Для визуализации результатов доступны два режима отрисовки графиков:

  • Для статической, быстрой отрисовки - используйте gr().

  • Для интерактивной, динамической визуализации с возможностью масштабирования и просмотра значений - используйте plotlyjs().

Выберите одну из команд, закомментировав вторую. Оба бэкенда являются взаимоисключающими, и активирован будет последний вызванный.

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

Подключим с помощью функции include файл "read.jl" для чтения файлов:

In [ ]:
include("$(@__DIR__)/read.jl")
Out[0]:
safe_read_ann (generic function with 1 method)

Спектральный анализ ЭКГ в норме

В качестве исходных данных для анализа используется электрокардиографический сигнал, соответствующий нормальному синусовому ритму сердца. Данная запись получена из базы данных MIT-BIH Normal Sinus Rhythm Database (NSRDB) и отражает работу сердца здорового человека без выраженных нарушений ритма.

Укажем путь к файлу с выбранной записью ЭКГ:

In [ ]:
data = ("$(@__DIR__)/mit-bih-normal-sinus-rhythm/16272")
Out[0]:
"/user/DemoPublic/biomedical/spectral_analysis_arrhythmia/mit-bih-normal-sinus-rhythm/16272"

После задания пути к файлу выполняется чтение заголовка записи ЭКГ. Из заголовка извлекается служебная информация, описывающая параметры сигнала: имя записи, частота дискретизации, количество каналов и общее число отсчётов. Также выводятся сведения о формате данных, коэффициенте усиления и текстовом описании записи.

In [ ]:
hdr = read_header(data)

println("Наименование записи:   ", hdr.record)
println("Частота дискретизации: ", hdr.fs, " Гц")
println("Количество сигналов:   ", hdr.nsig)
println("Количество отсчётов:   ", hdr.nsamp)
println("Формат данных:         ", hdr.fmt)
println("Усиление:              ", hdr.gain)
println("Описание:              ", hdr.desc)
Наименование записи:   16272
Частота дискретизации: 128.0 Гц
Количество сигналов:   2
Количество отсчётов:   11520000
Формат данных:         212
Усиление:              0.0
Описание:              ECG1

Для демонстрации временного представления ЭКГ выберем 10-секундный фрагмент записи.

In [ ]:
t_start = 0.0
t_dur   = 10.0

sampl_start = Int(round(t_start * hdr.fs))
sampl_end   = sampl_start + Int(round(t_dur * hdr.fs))

_, raw, phys = read_dat_212(data; sampfrom=sampl_start, sampto=sampl_end)
y1 = phys === nothing ? float.(raw[:,1])/200 : phys[:,1]

t1 = (0:length(y1)-1)./ hdr.fs.+ t_start

plot(t1, y1,
        xlabel="Время, с", 
        ylabel="Амплитуда", 
        title="Запись $(hdr.record) NSRDB",
        legend=false)
Out[0]:

Также продемонстрируем минутный фрагмент ЭКГ-записи. Для этого увеличим длительность анализируемого интервала до 60 секунд, считаем соответствующий участок сигнала и построим его временное представление.

In [ ]:
t_start = 0.0
t_dur = 60.0

sampl_start = Int(round(t_start * hdr.fs))
sampl_end = sampl_start + Int(round(t_dur * hdr.fs))

_, raw, phys = read_dat_212(data; sampfrom=sampl_start, sampto=sampl_end)
y1 = phys === nothing ? float.(raw[:,1])/200 : phys[:,1]

t1 = (0:length(y1)-1) ./ hdr.fs .+ t_start

plot(t1, y1,
        xlabel="Время, с", 
        ylabel="Амплитуда", 
        title="Запись $(hdr.record) NSRDB",
        legend=false)
Out[0]:

Для перехода к частотному представлению сигнала используем функции библиотеки EngeeDSP. Функция EngeeDSP.Functions.fft выполняет быстрое преобразование Фурье временного сигнала, преобразуя его во множество комплексных частотных коэффициентов. Далее применяется EngeeDSP.Functions.fftshift для центрирование спектра.

In [ ]:
nsampl = length(y1)
fs = hdr.fs
df = hdr.fs / nsampl

freq_vec1 = -fs/2 : df : fs/2 - df

fft_y1 = EngeeDSP.Functions.fft(y1)     # БПФ

fft_Y1 = EngeeDSP.Functions.fftshift(fft_y1)    # Центрированный спектр
Out[0]:
7680-element Vector{ComplexF64}:
   0.4299999999999784 + 0.0im
    1.420074436857042 - 1.259402987504321im
  0.43216868301268896 + 2.18561269828764im
   1.4631953485700109 - 1.264690852185021im
  -0.6108928341574078 + 2.0868506337778356im
   -1.718166119515935 - 0.5277964184678581im
   -1.268020722866865 + 1.0992614404769583im
 -0.11131950936055546 + 0.48566398997173366im
  -1.3889234887099207 + 0.9665944738563965im
   0.8718361075312409 + 3.2228018323602328im
 -0.03253517186771049 + 0.3818156520900047im
  0.31213973318596056 + 1.7696508718261263im
  -0.9692764209245297 - 1.6720509877093566im
                      ⋮
  -0.9692764209245297 + 1.6720509877093566im
  0.31213973318596056 - 1.7696508718261263im
 -0.03253517186771049 - 0.3818156520900047im
   0.8718361075312409 - 3.2228018323602328im
  -1.3889234887099207 - 0.9665944738563965im
 -0.11131950936055546 - 0.48566398997173366im
   -1.268020722866865 - 1.0992614404769583im
   -1.718166119515935 + 0.5277964184678581im
  -0.6108928341574078 - 2.0868506337778356im
   1.4631953485700109 + 1.264690852185021im
  0.43216868301268896 - 2.18561269828764im
    1.420074436857042 + 1.259402987504321im

Рассчитаем амплитудный спектр анализируемого сигнала и построим его в диапазоне частот от 0 до 10 Гц.

In [ ]:
Amp1 = (2*abs.(fft_Y1))/nsampl

 plot(
    freq_vec1, Amp1,
    xlabel="Частота, Гц",
    ylabel="Амплитуда",
    title="Амплитудный спектр сигнала $(hdr.record) NSRDB",
    grid=true,
    legend=false,
    xlim=(0, 10),
)
Out[0]:

Полученный амплитудный спектр ЭКГ-сигнала с нормальным синусовым ритмом имеет упорядоченную структуру. В спектре отчётливо выражена основная частотная компонента в области около 1 Гц, соответствующая частоте сердечных сокращений, а также наблюдаются гармоники на кратных частотах. Энергия сигнала сосредоточена преимущественно в низкочастотной области до 10 Гц.

Отдельно можно отметить наличие компоненты в области около 0,1 Гц, которая не связана напрямую с сердечной деятельностью и обусловлена низкочастотными помехами, возникающими при записи сигнала.

Спектральный анализ ЭКГ при желудочковой экстрасистолии

Желудочковая экстрасистолия - это разновидность нарушения сердечного ритма, при которой внеочередные сокращения возникают не из синусового узла, а из дополнительных очагов возбуждения в желудочках сердца. Такие преждевременные сокращения проявляются на ЭКГ как отдельные, более ранние, деформированные комплексы QRS по сравнению с нормальными сердечными циклам.

Экстрасистолы могут быть одиночными или повторяющимися, а в зависимости от частоты и характера появлений выявляются как частые или редкие. Часто желудочковые экстрасистолы не сопровождаются выраженными симптомами у пациента, но могут ощущаться как перебои или «пропущенные» удары сердца.

Используем запись ЭКГ с желудочковой экстрасистолией из базы данных CU Ventricular Tachyarrhythmia Database (CU VTADB).

In [ ]:
data = ("$(@__DIR__)/cu-ventricular-tachyarrhythmia/cu05")
Out[0]:
"/user/DemoPublic/biomedical/spectral_analysis_arrhythmia/cu-ventricular-tachyarrhythmia/cu05"

Выведем основные параметры анализируемой записи ЭКГ.

In [ ]:
hdr = read_header(data)

println("Наименование записи:   ", hdr.record)
println("Частота дискретизации: ", hdr.fs, " Гц")
println("Количество сигналов:   ", hdr.nsig)
println("Количество отсчётов:   ", hdr.nsamp)
println("Формат данных:         ", hdr.fmt)
println("Усиление:              ", hdr.gain)
println("Описание:              ", hdr.desc)
Наименование записи:   cu05
Частота дискретизации: 250.0 Гц
Количество сигналов:   1
Количество отсчётов:   127232
Формат данных:         212
Усиление:              400.0
Описание:              ECG

Продемонстрируем желудочковую экстрасистолу. Для этого выделим на записи двухсекундный фрагмент в интервале 126 -128 с и отметим участок, соответствующий экстрасистолическому комплексу, цветной областью на графике.

In [ ]:
t_start = 126.0
t_dur = 2.0

sampl_start = Int(round(t_start * hdr.fs))
sampl_end = sampl_start + Int(round(t_dur * hdr.fs))

_, raw, phys = read_dat_212(data; sampfrom=sampl_start, sampto=sampl_end)
y2 = phys === nothing ? float.(raw[:,1]) : phys[:,1]
t2 = (0:length(y2)-1) ./ hdr.fs .+ t_start

p =plot(t2, y2,
        xlabel="Время, с", 
        ylabel="Амлитуда", 
        title="Запись $(hdr.record) CU VTADB ",
        legend=false
        )

vline!(p, [127.1, 127.3], color=:red, alpha=0.3)

display(p)

Продемонстрируем минутный фрагмент ЭКГ при желудочковой экстрасистолии, выбрав участок записи без выраженных артефактов.

In [ ]:
t_start = 115.0
t_dur = 60.0

sampl_start = Int(round(t_start * hdr.fs))
sampl_end = sampl_start + Int(round(t_dur * hdr.fs))

_, raw, phys = read_dat_212(data; sampfrom=sampl_start, sampto=sampl_end)
y2 = phys === nothing ? float.(raw[:,1]) : phys[:,1]
t2 = (0:length(y2)-1) ./ hdr.fs .+ t_start

plot(t2, y2,
        xlabel="Время, с", 
        ylabel="Амплитуда", 
        title="Запись $(hdr.record) CU VTADB ",
        legend=false)
Out[0]:

Аналогично, для частотного анализа используем функции библиотеки EngeeDSP.

In [ ]:
nsampl = length(y2)
fs = hdr.fs
df = hdr.fs / nsampl

freq_vec2 = -fs/2 : df : fs/2 - df

fft_y2 = EngeeDSP.Functions.fft(y2)     # БПФ

fft_Y2 = EngeeDSP.Functions.fftshift(fft_y2)    # Центрированный спектр
Out[0]:
15000-element Vector{ComplexF64}:
  0.24250000000006366 + 0.0im
   -0.617390662779087 - 0.9645818287347332im
  -0.5170981782064956 + 0.47210546222461947im
   0.3042996579577628 - 0.5017138577633im
  -0.6114165019779407 + 0.17445736541545964im
    0.518487255266888 + 0.8184288482754183im
  0.47517928893948813 + 0.5832875878615109im
   0.2709135407918337 - 0.0490081731987142im
   0.7785997524270325 + 0.8367519488401889im
   -0.621085745416029 - 0.12505334037132454im
 0.006377498767134782 + 0.0835351710709844im
   -0.814160502367459 + 0.584528873438301im
   -0.408193073323317 + 0.24900364154655996im
                      ⋮
   -0.408193073323317 - 0.24900364154655996im
   -0.814160502367459 - 0.584528873438301im
 0.006377498767134782 - 0.0835351710709844im
   -0.621085745416029 + 0.12505334037132454im
   0.7785997524270325 - 0.8367519488401889im
   0.2709135407918337 + 0.0490081731987142im
  0.47517928893948813 - 0.5832875878615109im
    0.518487255266888 - 0.8184288482754183im
  -0.6114165019779407 - 0.17445736541545964im
   0.3042996579577628 + 0.5017138577633im
  -0.5170981782064956 - 0.47210546222461947im
   -0.617390662779087 + 0.9645818287347332im

Построим амплитудный спектр минутного фрагмента ЭКГ с желудочковой экстрасистолией в диапазоне частот до 10 Гц.

In [ ]:
Amp2 = (2*abs.(fft_Y2))/nsampl

 plot(
    freq_vec2, Amp2,
    xlabel="Частота, Гц",
    ylabel="Амплитуда",
    title="Амплитудный спектр сигнала $(hdr.record) CU VTADB",
    grid=true,
    legend=false,
    xlim=(0, 10),
)
Out[0]:

Полученный амплитудный спектр ЭКГ при желудочковой экстрасистолии имеет менее упорядоченную структуру по сравнению с нормальным синусовым ритмом. Характер распределения спектральной энергии указывает на нарушение периодичности сердечных сокращений, обусловленное наличием экстрасистолических комплексов, что согласуется с особенностями ЭКГ при желудочковой экстрасистолии.

Спектральный анализ ЭКГ при предсердной экстрасистолии

Используем запись ЭКГ из базы данных MIT-BIH Arrhythmia Database, содержащую нарушения сердечного ритма. Запись 101 в целом характеризуется преимущественно нормальным синусовым ритмом, на фоне которого периодически присутствуют единичные и повторяющиеся предсердные экстрасистолы.

Единичные и повторяющиеся предсердные экстрасистолы представляют собой преждевременные сердечные сокращения, возникающие в предсердиях вне нормального синусового ритма. При единичных экстрасистолах такие сокращения появляются эпизодически и не оказывают существенного влияния на общий ритм сердца. Повторяющиеся предсердные экстрасистолы характеризуются более частым возникновением преждевременных импульсов, что приводит к периодическому нарушению регулярности сердечных циклов.

In [ ]:
data = ("$(@__DIR__)/mit-bih-arrhythmia/101")
Out[0]:
"/user/DemoPublic/biomedical/spectral_analysis_arrhythmia/mit-bih-arrhythmia/101"

Выведем основную информацию о выбранной записи ЭКГ, включая параметры дискретизации, структуру сигнала и описание записи.

In [ ]:
hdr = read_header(data)

println("Наименование записи:   ", hdr.record)
println("Частота дискретизации: ", hdr.fs, " Гц")
println("Количество сигналов:   ", hdr.nsig)
println("Количество отсчётов:   ", hdr.nsamp)
println("Формат данных:         ", hdr.fmt)
println("Усиление:              ", hdr.gain)
println("Описание:              ", hdr.desc)
Наименование записи:   101
Частота дискретизации: 360.0 Гц
Количество сигналов:   2
Количество отсчётов:   650000
Формат данных:         212
Усиление:              200.0
Описание:              MLII

Продемонстрируем единичную предсердную экстрасистолу. Для этого выделим на записи шестисекундный фрагмент в интервале 373 - 379 с и отметим на графике участок, соответствующий экстрасистолическому комплексу, цветными вертикальными линиями.

In [ ]:
t_start = 373.0
t_dur = 6.0

sampl_start = Int(round(t_start * hdr.fs))
sampl_end   = sampl_start + Int(round(t_dur * hdr.fs))

_, raw, phys = read_dat_212(data; sampfrom=sampl_start, sampto=sampl_end)
y3 = phys === nothing ? float.(raw[:,1]) : phys[:,1]
t3  = (0:length(y3)-1) ./ hdr.fs .+ t_start

plot(t3, y3,
        xlabel="Время, с", 
        ylabel="Амлитуда", 
        title="Запись $(hdr.record) MIT-BIH Arrhythmia Database ",
        legend=false)
vline!([375.6, 376.2], color=:red, alpha=0.3)
Out[0]:

Продемонстрируем минутный фрагмент ЭКГ записи, содержащий эпизоды нарушений сердечного ритма.

In [ ]:
t_start = 370.0
t_dur = 60.0

sampl_start = Int(round(t_start * hdr.fs))
sampl_end   = sampl_start + Int(round(t_dur * hdr.fs))

_, raw, phys = read_dat_212(data; sampfrom=sampl_start, sampto=sampl_end)
y3 = phys === nothing ? float.(raw[:,1]) : phys[:,1]
t3  = (0:length(y3)-1) ./ hdr.fs .+ t_start

plot(t3, y3,
        xlabel="Время, с", 
        ylabel="Амлитуда", 
        title="Запись $(hdr.record) MIT-BIH Arrhythmia Database ",
        legend=false)
Out[0]:

Аналогично предыдущим шагам, для минутного фрагмента ЭКГ выполним частотный анализ с использованием функций библиотеки EngeeDSP, получив центрированное спектральное представление сигнала.

In [ ]:
nsampl = length(y3)
fs = hdr.fs
df = hdr.fs / nsampl

freq_vec3 = -fs/2 : df : fs/2 - df

fft_y3 = EngeeDSP.Functions.fft(y3)     # БПФ

fft_Y3 = EngeeDSP.Functions.fftshift(fft_y3)    # Центрированный спектр
Out[0]:
21600-element Vector{ComplexF64}:
  -0.3499999999994543 + 0.0im
   -2.234148576509483 - 1.2921799198174142im
  -1.6923286675628049 - 3.0776448272429917im
   0.4223899856295361 + 4.918528645252934im
  0.06853869626723963 + 1.1634092443288893im
  0.07893171630887252 + 1.2391034578455589im
  0.23785772024982066 + 0.35861164346277974im
  0.13804578436253223 - 0.4131028992901946im
   0.9968657203876319 + 0.26269403356537424im
 -0.22749912173740938 + 0.05458454978024285im
 -0.10207517835085866 + 0.39308378482185447im
  -0.7325178393852525 + 0.02981812698969577im
 -0.11654664523090119 + 0.07441184108022014im
                      ⋮
 -0.11654664523090119 - 0.07441184108022014im
  -0.7325178393852525 - 0.02981812698969577im
 -0.10207517835085866 - 0.39308378482185447im
 -0.22749912173740938 - 0.05458454978024285im
   0.9968657203876319 - 0.26269403356537424im
  0.13804578436253223 + 0.4131028992901946im
  0.23785772024982066 - 0.35861164346277974im
  0.07893171630887252 - 1.2391034578455589im
  0.06853869626723963 - 1.1634092443288893im
   0.4223899856295361 - 4.918528645252934im
  -1.6923286675628049 + 3.0776448272429917im
   -2.234148576509483 + 1.2921799198174142im

Построим амплитудный спектр минутного фрагмента ЭКГ в диапазоне частот до 10 Гц.

In [ ]:
Amp3 = (2*abs.(fft_Y3))/nsampl

 plot(
    freq_vec3, Amp3,
    xlabel="Частота, Гц",
    ylabel="Амплитуда",
    title="Амплитудный спектр сигнала $(hdr.record) MIT-BIH Arrhythmia Database",
    grid=true,
    legend=false,
    xlim=(0, 10),
    ylim=(0 ,0.08)
)
Out[0]:

Полученный амплитудный спектр минутного фрагмента ЭКГ из базы MIT-BIH Arrhythmia Database характеризуется выраженной разупорядоченностью по сравнению с нормальным синусовым ритмом. В спектре присутствует основная низкочастотная компонента, однако спектральные пики имеют заметное уширение, а энергия сигнала распределена по более широкому диапазону частот.

Спектральный анализ ЭКГ при фибрилляции предсердия

Фибрилляция предсердий - это форма нарушения сердечного ритма, при которой электрическая активность предсердий становится хаотичной и несогласованной. Вместо регулярных импульсов синусового узла в предсердиях возникают множественные очаги возбуждения, что приводит к их неэффективным сокращениям.

На электрокардиограмме фибрилляция предсердий характеризуется отсутствием нормальных зубцов P и появлением мелких нерегулярных колебаний базовой линии, а также нерегулярными интервалами между комплексами QRS

Выбираем запись s02, соответствующую фибрилляции предсердий, из базы данных Atrial Fibrillation Termination Challenge Database (AFDB).

In [ ]:
data = ("$(@__DIR__)/af-termination-challenge/s02")
Out[0]:
"/user/DemoPublic/biomedical/spectral_analysis_arrhythmia/af-termination-challenge/s02"
In [ ]:
hdr = read_header(data)

println("Наименование записи:   ", hdr.record)
println("Частота дискретизации: ", hdr.fs, " Гц")
println("Количество сигналов:   ", hdr.nsig)
println("Количество отсчётов:   ", hdr.nsamp)
println("Формат данных:         ", hdr.fmt)
println("Усиление:              ", hdr.gain)
println("Описание:              ", hdr.desc)
Наименование записи:   s02
Частота дискретизации: 128.0 Гц
Количество сигналов:   2
Количество отсчётов:   7680
Формат данных:         16
Усиление:              182.149
Описание:              ECG

Продемонстрируем 10-секундный фрагмент записи ЭКГ, на котором заметна нерегулярность ритма, характерная для фибрилляции предсердий.

In [ ]:
t_start = 0.0
t_dur   = 10.0

sampl_start = Int(round(t_start * hdr.fs))
sampl_end   = sampl_start + Int(round(t_dur * hdr.fs))

_, raw, phys = read_dat_16(data; sampfrom=sampl_start, sampto=sampl_end)
y4 = phys === nothing ? float.(raw[:,1]) : phys[:,1]
t4  = (0:length(y4)-1) ./ hdr.fs .+ t_start

plot(t4, y4,
        xlabel="Время, с", 
        ylabel="Амлитуда", 
        title="Запись $(hdr.record) AFDB",
        legend=false)
Out[0]:

Продемонстрируем минутный фрагмент записи ЭКГ при фибрилляции предсердий, отражающий выраженную нерегулярность сердечного ритма.

In [ ]:
t_start = 0.0
t_dur   = 60.0

sampl_start = Int(round(t_start * hdr.fs))
sampl_end   = sampl_start + Int(round(t_dur * hdr.fs))

_, raw, phys = read_dat_16(data; sampfrom=sampl_start, sampto=sampl_end)
y4 = phys === nothing ? float.(raw[:,1]) : phys[:,1]
t4  = (0:length(y4)-1) ./ hdr.fs .+ t_start

plot(t4, y4,
        xlabel="Время, с", 
        ylabel="Амплитуда", 
        title="Запись $(hdr.record) AFDB",
        legend=false)
Out[0]:

Аналогично предыдущим шагам, выполним частотный анализ минутного фрагмента ЭКГ при фибрилляции предсердий с использованием функций библиотеки EngeeDSP и получим центрированный спектр сигнала.

In [ ]:
nsampl = length(y4)
fs = hdr.fs
df = hdr.fs / nsampl

freq_vec4 = -fs/2 : df : fs/2 - df

fft_y4 = EngeeDSP.Functions.fft(y4)     # БПФ

fft_Y4 = EngeeDSP.Functions.fftshift(fft_y4)    # Центрированный спектр
Out[0]:
7680-element Vector{ComplexF64}:
 0.005490010925129241 + 0.0im
  -0.7423632719658406 + 1.9789740826734277im
  0.33492665860237025 - 1.5643893204067822im
  -0.7660751104496875 - 2.9121794152264586im
  -0.5678084664411713 + 0.9427265362270969im
  -0.5230071267951804 - 1.5753561875288806im
    1.182602214953216 - 0.7141930881550123im
  -0.7904291722913852 - 1.9998184339818996im
    1.542071912231664 - 0.48908491965557044im
  -1.9879774432424888 - 0.1390182820275765im
   1.0971526826344933 + 0.7966247851480954im
   -0.723195108699282 - 0.7038636138748355im
  -1.4293774193780902 - 0.9104137771854699im
                      ⋮
  -1.4293774193780902 + 0.9104137771854699im
   -0.723195108699282 + 0.7038636138748355im
   1.0971526826344933 - 0.7966247851480954im
  -1.9879774432424888 + 0.1390182820275765im
    1.542071912231664 + 0.48908491965557044im
  -0.7904291722913852 + 1.9998184339818996im
    1.182602214953216 + 0.7141930881550123im
  -0.5230071267951804 + 1.5753561875288806im
  -0.5678084664411713 - 0.9427265362270969im
  -0.7660751104496875 + 2.9121794152264586im
  0.33492665860237025 + 1.5643893204067822im
  -0.7423632719658406 - 1.9789740826734277im

Построим амплитудный спектр минутного фрагмента ЭКГ при фибрилляции предсердий в диапазоне частот до 10 Гц.

In [ ]:
Amp4 = (2*abs.(fft_Y4))/nsampl

 plot(
    freq_vec4, Amp4,
    xlabel="Частота, Гц",
    ylabel="Амплитуда",
    title="Амплитудный спектр сигнала $(hdr.record) AFDB",
    grid=true,
    legend=false,
    xlim=(0, 10),
)
Out[0]:

Амплитудный спектр ЭКГ при фибрилляции предсердий характеризуется выраженной разупорядоченностью и отсутствием чётко выраженной основной частотной компоненты. Энергия сигнала распределена по широкому диапазону частот, при этом наблюдается повышенный фоновый уровень спектра и большое количество нерегулярных спектральных составляющих.

Используемые материалы

В работе использовались реальные электрокардиографические записи из открытого ресурса PhysioNet.

  1. MIT-BIH Normal Sinus Rhythm Database (NSRDB) - записи ЭКГ с нормальным синусовым ритмом - https://physionet.org/content/nsrdb/1.0.0/
  2. CU Ventricular Tachyarrhythmia Database (CUDB) - записи ЭКГ с желудочковыми нарушениями ритма - https://physionet.org/content/cudb/1.0.0/
  3. MIT-BIH Arrhythmia Database - записи ЭКГ с различными видами аритмий - https://physionet.org/content/mitdb/1.0.0/
  4. Atrial Fibrillation Database (AFDB) - записи ЭКГ с фибрилляцией предсердий - https://physionet.org/content/afdb/1.0.0/

Заключение

В ходе примера был представлен спектральный анализ различных аритмий сердца. В работе использовались реальные электрокардиографические сигналы, полученные из открытых медицинских баз данных. Для частотного анализа сигналов применялись функции библиотеки EngeeDSP, в частности функции EngeeDSP.Functions.fft для вычисления быстрого преобразования Фурье и EngeeDSP.Functions.fftshift для формирования центрированного спектрального представления. Использование данных инструментов позволило наглядно продемонстрировать особенности спектров ЭКГ при различных типах нарушений сердечного ритма.