В этом примере показано, как использовать пользовательские функции автомаркировки в Signal Labeler для маркировки комплексов QRS и пиков R сигналов электрокардиограммы (ЭКГ). Одна пользовательская функция использует ранее обученную сеть повторного глубокого обучения для идентификации и определения местоположения комплексов QRS. Другая пользовательская функция использует простой поиск пиков для определения пиков R. В этом примере сеть маркирует комплексы QRS двумя сигналами, которые полностью не зависят от процесса обучения и тестирования сети.
Комплекс QRS, который состоит из трех отклонений в форме волны ЭКГ, отражает деполяризацию правого и левого желудочков сердца. QRS также является сегментом с самой высокой амплитудой сердцебиения человека. Исследование комплекса QRS может помочь оценить общее состояние здоровья сердца человека и наличие аномалий [1]. В частности, путем определения пиков R в пределах комплексов QRS и просмотра временных интервалов между последовательными пиками диагностик может вычислить вариабельность частоты сердечных сокращений пациента и обнаружить сердечную аритмию.
Сеть глубокого обучения в этом примере была введена в Waveform Segmentation Using Deep Learning (Signal Processing Toolbox), где она была обучена с использованием сигналов ЭКГ из общедоступной базы данных QT [2] [3]. Данные состоят примерно из 15 минут записей ЭКГ от в общей сложности 105 пациентов, отобранных при частоте 250 Гц. Чтобы получить каждую запись, экзаменаторы разместили два электрода в разных местах на груди пациента, что привело к двухканальному сигналу. База данных предоставляет метки области сигнала, генерируемые автоматизированной экспертной системой [1]. Добавленные метки позволяют использовать данные для обучения сети глубокого обучения.
Сигналы, помеченные в этом примере, поступают из базы данных аритмии MIT-BIH [4]. Каждый сигнал в базе данных нерегулярно отбирался со средней частотой 360 Гц и был аннотирован двумя кардиологами, что позволило проверить результаты.
Загрузите два сигнала базы данных MIT, соответствующие записям 200 и 203. Повторная выборка сигналов в однородную сетку с временем выборки 1/250 секунды, что соответствует номинальной частоте дискретизации данных базы данных QT.
load mit200 y200 = resample(ecgsig,tm,250); load mit203 y203 = resample(ecgsig,tm,250);
Открыть метку сигнала (панель инструментов обработки сигнала). На вкладке «Маркировщик» нажмите кнопку «Импорт» и выберите From workspace в списке Участники. В диалоговом окне выберите сигналы y200 и y203. Добавить информацию о времени: Выбрать Time из выпадающего списка и укажите частоту выборки 250 Гц. Щелкните Импорт (Import) и закройте диалоговое окно. Сигналы отображаются в браузере набора маркированных сигналов. Постройте график сигналов, установив флажки рядом с их именами.
Определите метки для присоединения к сигналам.
Определение метки категориальной области интересов (ROI) для комплексов QRS. Щелкните Добавить определение (Add Definition) на вкладке Маркировщик (Labeler). Укажите имя метки как QRSregions, выберите тип метки ROI, введите тип данных как categoricalи добавьте две категории, QRS и n/a, каждый на своей линии.
Определение подмаркировки QRSregions в качестве числовой метки точки для пиков R. Щелкнуть QRSregions в браузере «Определения меток», чтобы выбрать его. Щелкните Добавить определение (Add Definition) и выберите Add sublabel definition. Укажите имя метки как Rpeaks, выберите LabelType из Pointи введите тип данных как numeric.

Создайте две пользовательские функции маркировки (панель инструментов обработки сигналов), одна для определения местоположения и маркировки комплексов QRS, а другая для определения местоположения и маркировки пика R в каждом комплексе QRS. (Код для findQRS и findRpeaks функции появляются далее в примере.) Чтобы создать каждую функцию, на вкладке Labeler разверните галерею Automate Value и выберите Add Custom Function. Signal Labeler отображает диалоговое окно с запросом имени, описания и типа метки функции.
Для функции определения местоположения комплексов QRS введите findQRS в поле Имя и выберите ROI в качестве типа метки. Поле Описание можно оставить пустым или ввести собственное описание.
Для функции поиска пиков R введите findRpeaks в поле Имя и выберите Point в качестве типа метки. Поле Описание можно оставить пустым или ввести собственное описание.
Если функции уже записаны, а функции находятся в текущей папке или в пути MATLAB ®, Signal Labeler добавляет функции в галерею. Если функции не были написаны, Signal Labeler открывает пустые шаблоны в редакторе для ввода или вставки кода. Сохраните файлы. После сохранения файлов функции отображаются в галерее.
Найти и маркировать комплексы QRS входных сигналов.
В браузере набора маркированных сигналов установите флажок рядом с пунктом y200.
Выбрать QRSregions в браузере «Определения меток».
В галерее «Автоматизировать значение» выберите findQRS.
Щелкните Автомаркировка (Auto-Label) и выберите Auto-Label All Signals. В появившемся диалоговом окне введите 250 Частота дискретизации Гц в поле Аргументы и нажмите кнопку ОК.
Signal Labeler определяет местоположение и маркирует комплексы QRS для всех сигналов, но отображает метки только для сигналов, для которых установлены флажки. Комплексы QRS отображаются как затененные области на графике и в осях просмотра меток. Активируйте панорамирование, щелкнув Панорамирование (Panner) на вкладке Отображение (Display), и увеличьте изображение области помеченного сигнала.

Найти и маркировать пики R, соответствующие комплексам QRS.
Выбрать Rpeaks в браузере «Определения меток».
Вернитесь на вкладку Labeler. В галерее «Автоматизировать значение» выберите findRpeaks.
Щелкните Автомаркировка (Auto-Label) и выберите Auto-Label All Signals. Нажмите кнопку ОК в появившемся диалоговом окне.
Метки и их числовые значения отображаются на графике и в осях средства просмотра меток.

Экспортируйте помеченные сигналы для сравнения вариабельности частоты сердечных сокращений для каждого пациента. На вкладке «Маркировщик» нажмите кнопку «Экспорт ▼» и выберите Labeled Signal Set To File. В появившемся диалоговом окне введите имя HeartRates.mat в набор маркированных сигналов и добавить дополнительное краткое описание. Щелкните Экспорт (Export).
Вернитесь в командное окно MATLAB ®. Загрузите набор маркированных сигналов. Для каждого сигнала в наборе вычислите вариабельность частоты сердечных сокращений как стандартное отклонение временных разностей между последовательными сердцебиениями. Постройте гистограмму различий и отобразите вариабельность сердечного ритма.
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:0.025:1.5) legend(['hrv = ' num2str(std(hr))]) ylabel(nms(k)) ylim([0 6]) end

findQRS Функция: Поиск комплексов QRS findQRS функция находит и маркирует комплексы QRS входных сигналов.
Функция использует вспомогательную функцию, computeFSSTдля изменения формы входных данных и вычисления синхронизированного преобразования Фурье (FSST). Вы можете либо хранить computeFSST в отдельном файле в том же каталоге или вложить его внутрь findQRS вставкой перед окончанием end заявление.
findQRS использует classify функция и обученная сеть глубокого обучения net для идентификации областей QRS. Сеть глубокого обучения выводит категориальную матрицу, которая маркирует каждую точку входного сигнала как принадлежащую области P, комплексу QRS, области T или ни к одной из них. Эта функция преобразует метки точек, соответствующие комплексу QRS, в метки области интересов QRS, используя signalMask и отменяет восстановление. df параметр выбирает в качестве интересующих областей только те комплексы QRS, длительность которых превышает 20 выборок. Если частота дискретизации не указана, функция использует значение по умолчанию 250 Гц.
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 = cell(2,1); labelLocs = cell(2,1); if nargin<5 Fs = 250; else Fs = varargin{1}; end df = 20; load('trainedQTSegmentationNetwork','net') for kj = 1:size(x,2) sig = x(:,kj); % Reshape input and compute Fourier synchrosqueezed transforms mitFSST = computeFSST(sig,Fs); % Use trained network to predict which points belong to QRS regions netPreds = classify(net,mitFSST,'MiniBatchSize',50); % Create a signal mask for QRS regions and specify minimum sequence length QRS = categorical([netPreds{1} netPreds{2}]',"QRS"); msk = signalMask(QRS,"MinLength",df,"SampleRate",Fs); r = roimask(msk); % Label QRS complexes as regions of interest labelVals{kj} = r.Value; labelLocs{kj} = r.ROILimits; end labelVals = vertcat(labelVals{:}); labelLocs = cell2mat(labelLocs); % Insert computeFSST here if you want to nest it inside findQRS. end
computeFSST Функция: Изменение формы входных и вычислительных синхронизированных преобразований ФурьеЭта функция использует fsst(Панель инструментов обработки сигналов) для вычисления синхронизированного преобразования Фурье (FSST) входного сигнала. Как обсуждалось в разделе Сегментация формы волны с использованием глубокого обучения (инструментарий обработки сигналов), сеть лучше всего работает, когда в качестве входных данных дается частотно-временная карта каждого обучающего или тестового сигнала. FSST приводит к набору функций, особенно полезных для повторяющихся сетей, поскольку преобразование имеет то же разрешение по времени, что и исходный вход. Функция:
Вставляет входные данные со случайными числами и преобразует их в стек ячеек 2 на 5000, ожидаемый net.
Задает окно Кайзера длиной 128 и коэффициентом формы по умолчанию 0,5 для обеспечения адекватного разрешения по частоте.
Извлекает данные в диапазоне частот от 0,5 Гц до 40 Гц.
Рассматривает реальную и мнимую части FSST как отдельные особенности.
Нормализует данные путем вычитания среднего значения и деления на стандартное отклонение.
function signalsFsst = computeFSST(xd,Fs) xd = reshape([xd;randn(10000-length(xd),1)/100],5000,2); signalsFsst = cell(1,2); for k = 1:2 [ss,ff] = fsst(xd(:,k),Fs,kaiser(128)); sp = ss(ff>0.5 & ff<40,:); signalsFsst{k} = normalize([real(sp);imag(sp)],2); end end
findRpeaks Функция: Поиск пиков RЭта функция определяет наиболее заметный пик областей QRS, представляющих интерес, найденный findQRS. Функция применяет MATLAB ®islocalmax функция до абсолютного значения сигнала в интервалах, расположенных findQRS.
function [labelVals,labelLocs] = findRpeaks(x,t,parentLabelVal,parentLabelLoc,varargin) 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] Лагуна, Пабло, Раймон Джане и Пер Каминал. «Автоматическое обнаружение границ волн в многоярусных сигналах ЭКГ: проверка с помощью базы данных CSE». Компьютеры и биомедицинские исследования. Том 27, № 1, 1994, стр. 45-60.
[2] Голдбергер, Ари Л., Луис А. Н. Амарал, Леон Гласс, Джеффери М. Хаусдорфф, Пламен Ч. Иванов, Роджер Г. Марк, Джозеф Э. Миет, Джордж Б. Муди, Чон-Кан Пэн и Х. Эугал «PhysioBank, PhysioToolkit и PhysioNet: компоненты нового исследовательского ресурса для сложных физиологических сигналов». Циркуляция. Том 101, № 23, 2000, стр. e215-e220. [Электронные страницы: http://circ.ahajournals.org/content/101/23/e215.full].
[3] Лагуна, Пабло, Роджер Г. Марк, Ари Л. Голдбергер и Джордж Б. Муди. «База данных для оценки алгоритмов измерения QT и других интервалов формы сигнала в ЭКГ». Компьютеры в кардиологии. Том 24, 1997, стр. 673-676.
[4] Муди, Джордж Б. и Роджер Г. Марк. «Влияние базы данных аритмии MIT-BIH». IEEE Engineering in Medicine and Biology Magazine. Том 20, № 3, май-июнь 2001 года, стр. 45-50.
trainingOptions | trainNetwork