Маркируйте QRS Complexes и R Peaks of ECG Signals Using Deep Network

То В этом примере показано, как использовать пользовательскую автоматизированную маркировку, функционирует в Signal Labeler к комплексам метки QRS и peaks R электрокардиограммы (ECG) сигналы. Одна пользовательская функция использует ранее обученную текущую нейронную сеть для глубокого обучения, чтобы идентифицировать и определить местоположение комплексов QRS. Другая пользовательская функция использует простое пиковое средство поиска, чтобы определить местоположение peaks R. В примере сеть помечает комплексы QRS двух сигналов, которые абсолютно независимы от сетевого обучения и процесса тестирования.

Комплекс QRS, который состоит из трех отклонений в форме волны ECG, отражает деполяризацию правых и левых желудочков основы. QRS является также самым высоким амплитудным сегментом человеческого heartbeat. Исследование комплекса QRS может помочь оценить полное здоровье основы человека и присутствие отклонений [1]. В частности, путем определения местоположения R peaks в комплексах QRS и взгляда в то время интервалы между последовательным peaks, диагност может вычислить изменчивость сердечного ритма пациента и обнаружить сердечную аритмию.

Нейронная сеть для глубокого обучения в этом примере была введена в Сегментации Формы волны Используя Глубокое обучение (Signal Processing Toolbox), где это было обучено с помощью сигналов ECG от общедоступной Базы данных QT 2[] 3[]. Данные состоят примерно из 15 минут записей ECG от в общей сложности 105 пациентов, произведенных на уровне 250 Гц. Чтобы получить каждую запись, ревизоры поместили два электрода в другие места на груди пациента, которая привела к двухканальному сигналу. База данных обеспечивает метки области сигнала, сгенерированные автоматизированной экспертной системой [1]. Добавленные метки позволяют использовать данные, чтобы обучить глубокую сеть. Смотрите, что Сегментация Формы волны Использует Глубокое обучение (Signal Processing Toolbox) для получения дополнительной информации.

Загрузите, передискретизируйте и импортируйте данные в Signal Labeler

Сигналы, помеченные в этом примере, от Базы данных Аритмии MIT-BIH [4]. Каждый сигнал в базе данных был произведен на уровне 360 Гц и аннотировался двумя кардиологами, допуская верификацию результатов.

Загрузите два из сигналов базы данных MIT, соответствуя записям 200 и 203. Передискретизируйте сигналы к 250 Гц, частоту дискретизации данных о Базе данных QT.

load mit200
y200 = resample(ecgsig,25,36);

load mit203
y203 = resample(ecgsig,25,36);

Запустите Signal Analyzer и перетащите сигналы к таблице Signal. Выберите сигналы. Добавьте время информация: на вкладке Analyzer нажмите Time Values, выберите Sample Rate and Start Time, и задайте частоту дискретизации 250 Гц. На вкладке Analyzer нажмите Label. Сигналы появляются в Помеченном Настроенном браузере Сигнала.

Задайте метки

Задайте метки, чтобы присоединить к сигналам.

  1. Задайте категориальную метку видимой области (ROI) для комплексов QRS. Нажмите Add Definition на вкладке Label. Задайте Маркировать Name как QRSregions, выберите LabelType of ROI, введите Тип данных как categorical, и добавьте две Категории, QRS и n/a, каждый на его собственной линии.

  2. Задайте числовую метку точки для peaks R и установите ее как подметку QRSregions. Нажмите QRSregions в Маркировать браузере Definitions, чтобы выбрать его. Нажмите Add Definition ▼ и выберите Add sublabel definition. Задайте маркировать Name как Rpeaks, выберите LabelType of Point, и введите Тип данных как numeric.

Создайте пользовательские функции автомаркировки

Создайте две пользовательских функции, один, чтобы определить местоположение и пометить комплексы QRS и другого, чтобы определить местоположение и пометить пик R в каждом комплексе QRS. (Код для findQRS, computeFSST, p2qrs, и findRpeaks функции появляются позже в примере.), Чтобы создать каждую функцию, во вкладке Analyzer, нажимают Automate Value ▼ и выбирают Add Custom Function. Signal Labeler показывает диалоговое окно, просящее имя, описание и тип метки функции, чтобы добавить.

  1. Для функции, которая определяет местоположение комплексов QRS, введите findQRS в Поле имени и выбирают ROI как Маркировать Type. Можно оставить поле Description пустым, или можно ввести собственное описание.

  2. Для функции, которая определяет местоположение peaks R, введите findRpeaks в Поле имени и выбирают Point как Маркировать Type. Можно оставить поле Description пустым, или можно ввести собственное описание.

Если вы уже записали функции, и функции находятся в текущей папке или в пути MATLAB®, Signal Labeler добавляет функции в галерею. Если вы не записали функции, Signal Labeler открывает пустые шаблоны в Редакторе для вас, чтобы ввести или вставить код. Сохраните файлы. Функции появляются в галерее.

Маркируйте QRS Complexes и R Peaks

Найдите и пометьте комплексы QRS входных сигналов.

  1. В Помеченном Настроенном браузере Сигнала установите флажок рядом с y200.

  2. Выберите QRSregions в Маркировать браузере Definitions.

  3. На галерее Automate Value выберите findQRS.

  4. Нажмите Auto-Label и нажмите ОК в диалоговом окне, которое появляется.

Signal Labeler определяет местоположение и помечает комплексы QRS для всех сигналов, но отображает только те из сигнала, флажок которого вы установили. Комплексы QRS появляются как заштрихованные области в графике и в осях средства просмотра метки. Активируйте регулятор панорамы путем нажатия на Panner на вкладке Display и увеличьте масштаб области помеченного сигнала.

Найдите и пометьте peaks R, соответствующий комплексам QRS.

  1. Выберите Rpeaks в Маркировать браузере Definitions.

  2. Вернитесь к вкладке Label. На галерее Automate Value выберите findRpeaks.

  3. Нажмите Auto-Label и нажмите ОК в диалоговом окне, которое появляется.

Метки и их числовые значения появляются в графике и в осях средства просмотра метки.

Экспортируйте помеченные сигналы и вычислите изменчивость сердечного ритма

Экспортируйте помеченные сигналы сравнить изменчивость сердечного ритма для каждого пациента. На вкладке Label нажмите Save Labels. В диалоговом окне, которое появляется, дайте имени heartrates к помеченному набору сигнала. Нажмите ОК, чтобы возвратиться к Signal Analyzer. В таблице Signal выберите heartrates и щелкните правой кнопкой, чтобы экспортировать его в файл под названием HeartRates.mat.

Загрузите помеченный набор сигнала. Для каждого сигнала в наборе вычислите изменчивость сердечного ритма как стандартное отклонение разницы во времени между последовательными heartbeat. Постройте гистограмму различий и отобразите изменчивость сердечного ритма.

load HeartRates

nms = getMemberNames(heartrates);

for k = 1:heartrates.NumMembers
    
    v = getLabelValues(heartrates,k,{'QRSregions','Rpeaks'});
    
    hr = diff(cellfun(@(x)x.Location,v));
    
    subplot(2,1,k)
    histogram(hr,0.5:.025:1.5)
    legend(['hrv = ' num2str(std(hr))])
    ylabel(nms(k))
    ylim([0 6])

end

findQRS Функция: найдите комплексы QRS

findQRS функция находит и помечает комплексы QRS входных сигналов.

Функция использует две вспомогательных функции, computeFSST и p2qrs. (Код для обеих вспомогательных функций появляется позже в примере.) Можно или сохранить функции в отдельных файлах в той же директории или вложить их в findQRS путем вставки их перед итоговым end оператор.

Между вызовами computeFSST и p2qrs, findQRS использует classify функционируйте и обученная глубокая сеть net идентифицировать области QRS. Прежде, чем вызвать classify, findQRS преобразует данные в формат, ожидаемый net, как объяснено в Сегментации Формы волны Используя Глубокое обучение (Signal Processing Toolbox):

  • Каждый сигнал должен быть произведен на уровне 250 Гц и разделен в стек 2 N массивами ячеек, где каждая строка соответствует каналу, и N является кратным 5 000. Фактическое разделение и укладка сделаны в computeFSST функция.

  • Каждый из передискретизируемых сигналов MIT имеет 6 945 выборок, номер, который не является кратным 5 000. Чтобы сохранить все данные в каждом сигнале, заполните сигнал случайными числами. Позже в процессе, p2qrs функционируйте помечает случайные числа, когда не принадлежащий QRS объединяет и отбрасывает их.

function [labelVals,labelLocs] = findQRS(x,t,parentLabelVal,parentLabelLoc,varargin)
% This is a template for creating a custom function for automated labeling
%
%  x is a matrix where each column contains data corresponding to a
%  channel. If the channels have different lengths, then x is a cell array
%  of column vectors.
%
%  t is a matrix where each column contains time corresponding to a
%  channel. If the channels have different lengths, then t is a cell array
%  of column vectors.
%
%  parentLabelVal is the parent label value associated with the output
%  sublabel or empty when output is not a sublabel.
%  parentLabelLoc contains an empty vector when the parent label is an
%  attribute, a vector of ROI limits when parent label is an ROI or a point
%  location when parent label is a point.
%
%  labelVals must be a column vector with numeric, logical or string output
%  values.
%  labelLocs must be an empty vector when output labels are attributes, a
%  two column matrix of ROI limits when output labels are ROIs, or a column
%  vector of point locations when output labels are points.

labelVals = [];
labelLocs = [];

Fs = 250;

load('trainedQTSegmentationNetwork','net')

for kj = 1:size(x,2)

    sig = x(:,kj);
    
    % Create 10000-sample signal expected by the deep network
    
    sig = [sig;randn(10000-length(sig),1)/100]';
    
    % Resize input and compute synchrosqueezed Fourier transforms

    mitFSST = computeFSST(sig,Fs);
    
    % Use trained network to predict which points belong to QRS regions
    
    netPreds = classify(net,mitFSST,'MiniBatchSize',50);
    
    % Convert stack of cell arrays into a single vector
    
    Location = [1:length(netPreds{1}) length(netPreds{1})+(1:length(netPreds{2}))]';
    Value = [netPreds{1} netPreds{2}]';
    
    % Label QRS complexes as regions of interest and discard non-QRS data
    
    [Locs,Vals] = p2qrs(table(Location,Value));
    
    labelVals = [labelVals;Vals];
    labelLocs = [labelLocs;Locs/Fs];

end

% Insert computeFSST and p2qrs here if you want to nest them inside
% queryQRS instead of including them as separate functions in the folder.

end

computeFSST Функция: измените размер входа и вычислите преобразования Фурье Synchrosqueezed

Эта функция изменяет входные данные в форму, ожидаемую net и затем использует fsst функция, чтобы вычислить synchrosqueezed преобразование Фурье (FSST) входа. В Сегментации Формы волны Используя Глубокое обучение (Signal Processing Toolbox) сеть выполняет лучше всего, когда дали, как введено карту частоты времени каждого обучения или тестирующий сигнал. FSST приводит к набору функций, особенно полезных для текущих сетей, потому что преобразование имеет то же разрешение времени как исходный вход. Функция:

  • Задает окно Кайзера длины 128, чтобы обеспечить соответствующее разрешение частоты.

  • Данные об извлечениях по частотному диапазону от 0,5 Гц до 40 Гц.

  • Вычитает среднее значение каждого сигнала и делится на стандартное отклонение.

  • Обработайте действительные и мнимые части FSST как отдельные функции.

function signalsFsst = computeFSST(xd,Fs)

targetLength = 5000;
signalsOut = {};

for sig_idx = 1:size(xd,1)

    current_sig = xd(sig_idx,:)';

    % Compute the number of targetLength-sample chunks in the signal
    numSigs = floor(length(current_sig)/targetLength);

    % Truncate to a multiple of targetLength
    current_sig = current_sig(1:numSigs*targetLength);

    % Create a matrix with as many columns as targetLength signals
    xM = reshape(current_sig,targetLength,numSigs);

    % Vertically concatenate into cell arrays
    signalsOut = [signalsOut; mat2cell(xM.',ones(numSigs,1))];

end

signalsFsst = cell(size(signalsOut));

for idx = 1:length(signalsOut)

   [s,f] = fsst(signalsOut{idx},Fs,kaiser(128));

   % Extract data over the frequency range from 0.5 Hz to 40 Hz
   f_indices = (f > 0.5) & (f < 40);
   signalsFsst{idx}= [real(s(f_indices,:)); imag(s(f_indices,:))];

   signalsFsst{idx} = (signalsFsst{idx}-mean(signalsFsst{idx},2)) ...
       ./std(signalsFsst{idx},[],2);

end

end

p2qrs Функция: маркируйте QRS Complexes как необходимые области

Глубокие сетевые выходные параметры категориальный массив, который помечает каждую точку входного сигнала как принадлежность области P, комплекса QRS, области T, или ни к одному из тех. Эта функция преобразует те метки точки в метки необходимой области QRS.

  • Чтобы выполнить преобразование, функция присваивает целочисленные численные значения категориям и использует findchangepts функционируйте, чтобы найти точки, где числовой массив изменяет значение.

  • Каждый из тех changepoints является левой конечной точкой категориальной области и точкой, которая предшествует, это в массиве - правильная конечная точка предыдущей области.

  • Алгоритм добавляет 1e-6 к правильным конечным точкам, чтобы препятствовать тому, чтобы области с одной выборкой имели нулевую длительность.

  • df параметр выбирает как необходимые области только те комплексы QRS, длительность которых больше df выборки.

function [locs,vals] = p2qrs(k)

fc = 1e-6;
df = 20;

ctgs = categories(k.Value);
levs = 1:length(ctgs);
for jk = levs
   cat2num(k.Value == ctgs{jk}) = levs(jk);
end
chpt = findchangepts(cat2num,'MaxNumChanges',length(cat2num));
locs = [[1;chpt'] [chpt'-1;length(cat2num)]+fc];

vals = categorical(cat2num(locs(:,1))',levs,ctgs);
locs = locs+round(k.Location(1))-1;

qrs = find(vals=='QRS' & diff(locs,[],2)>df);

vals = categorical(string(vals(qrs)),["QRS" "n/a"]);

locs = locs(qrs,:);

end

findRpeaks Функция: найдите Peaks R

Эта функция определяет местоположение самого видного пика необходимых областей QRS, найденных findQRS. Функция применяет MATLAB® islocalmax функционируйте к абсолютному значению сигнала в интервалах, расположенных findQRS.

function [labelVals,labelLocs] = findRpeaks(x,t,parentLabelVal,parentLabelLoc,varargin)

Fs = 250;

if isempty(t)
    t = (0:length(x)-1)'/Fs;
end

labelVals = zeros(size(parentLabelLoc,1),1);
labelLocs = zeros(size(parentLabelLoc,1),1);

for kj = 1:size(parentLabelLoc,1)
    tvals = t>=parentLabelLoc(kj,1) & t<=parentLabelLoc(kj,2);
    ti = t(tvals);
    xi = x(tvals);
    lc = islocalmax(abs(xi),'MaxNumExtrema',1);
    labelVals(kj) = xi(lc);
    labelLocs(kj) = ti(lc);
end

end

Ссылки

[1] Laguna, Пабло, Рэймон Джейне и Пере Каминаль. "Автоматическое обнаружение контуров волны в мультиведущих сигналах ECG: Валидация с базой данных CSE". Компьютеры и Биомедицинское Исследование. Издание 27, № 1, 1994, стр 45–60.

[2] Голдбергер, Ари Л., Луис А. Н. Амараль, Леон Гласс, Джеффри М. Гаусдорф, Plamen Ch. Иванов, Роджер Г. Марк, Джозеф Э. Митус, Джордж Б. Муди, Чанг-Канг Пенг и Х. Юджин Стэнли. "PhysioBank, PhysioToolkit и PhysioNet: Компоненты Нового Ресурса Исследования для Комплексных Физиологических Сигналов". Циркуляция. Издание 101, № 23, 2000, стр e215–e220. [Циркуляция Электронные Страницы: http://circ.ahajournals.org/content/101/23/e215.full].

[3] Laguna, Пабло, Роджер Г. Марк, Ари Л. Голдбергер и Джордж Б. Муди. "База данных для Оценки Алгоритмов для Измерения QT и Других Интервалов Формы волны в ECG". Компьютеры в Кардиологии. Издание 24, 1997, стр 673–676.

[4] Капризный, Джордж Б. и Роджер Г. Марк. "Удар Базы данных Аритмии MIT-BIH". Разработка IEEE в Журнале Медицины и Биологии. Издание 20, № 3, мочь-июнь 2001, стр 45–50.

Смотрите также

|

Похожие темы