Пометьте сигналы для приложений анализа или машинного и глубокого обучения
Signal Labeler является интерактивным инструментом, который позволяет вам пометить сигналы для анализа или для использования в машинном обучении и применения глубокого обучения. Используя Signal Labeler, вы можете
Пометьте сигналы атрибутами, областями и интересными местами
Используйте логические, категориальные, числовые, или метки со знаком строки
Метка Automatically сигнализирует о peaks или применяет пользовательские функции маркировки
Добавьте, отредактируйте и удалите метки или подметки
Отобразите выбранные подмножества сигналов и меток
Signal Labeler сохраняет данные к Signal Analyzer как labeledSignalSet
объекты. Можно использовать labeledSignalSet
объекты обучить сеть, классификатор, или анализировать данные и статистику отчета.
В приложении Signal Analyzer, на вкладке Analyzer, нажимают Label.
Записи песен кита содержат трели и стоны. Трели походят на серию нажатий кнопки. Стоны являются низкочастотными криками, похожими на звук, сделанный рогом поставки. Вы хотите посмотреть на каждый сигнал и пометить его, чтобы идентифицировать тип кита, области трели и области стона. Для каждой области трели вы также хотите пометить несколько выбранных peaks сигнала.
Загрузите непомеченные данные
Запустите путем загрузки набора данных, который включает две записи песен кита. Сигналы называются whale1
и whale2
и производятся на уровне 4 кГц. whale1
состоит из трели, сопровождаемой тремя стонами. whale2
состоит из двух стонов, трели и другого стона.
load labelwhalesignals % To hear, type soundsc(whale1,Fs), pause(22), soundsc(whale2,Fs)
Принесите сигналы в Signal Labeler:
Запустите Signal Analyzer и перетащите сигналы к таблице Signal.
Выберите сигналы и добавьте время информация. На вкладке Analyzer нажмите Time Values, выберите Sample Rate and Start Time
, и введите частоту дискретизации, Fs
.
С выбранными сигналами нажмите Label на вкладке Analyzer.
Добавьте, что сигнал помечает определения
Задайте метки, чтобы присоединить к сигналам. Метки могут иметь три типа:
Метки атрибута задают характеристики сигнала.
Метки видимой области (ROI) задают характеристики сигнала по необходимым областям.
Укажите, что метки задают характеристики сигнала по интересным местам.
Каждая метка может иметь один из четырех типов данных:
Логические метки могут быть любой TRUE или FALSE.
Категориальные метки могут принадлежать любому из набора категорий, которые вы задаете.
Числовые метки могут иметь любое числовое значение.
Метки строки могут иметь любое значение, представленное строкой.
Любая метка может иметь любое количество подметок. Сами подметки не могут иметь подметок.
Для сигналов песни кита:
Задайте категориальную метку атрибута, чтобы сохранить типы кита. Вызовите его WhaleType
. Возможные категории являются голубым китом, горбатым китом и белухой.
Задайте логическую метку видимой области (ROI), которая верна для областей стона. Вызовите его MoanRegions
.
Задайте логическую метку ROI, которая верна для областей трели. Вызовите его TrillRegions
.
Задайте числовую метку точки, чтобы получить peaks трели. Вызовите его TrillPeaks
. Установите эту метку как подметку TrillRegions
метка.
Чтобы задать каждую метку, нажмите Add Definition на вкладке Label. Чтобы задать подметку, выберите TrillRegions
пометьте в Маркировать браузере Definitions, нажмите Add Definition ▼ и выберите Add sublabel definition
.
Введите следующие значения в поля в диалоговом окне, которое появляется для каждого определения метки или подметки сигнала. Оставьте поле Default пустым в каждом случае.
Можно экспортировать определения сигнала, которые вы создали к MAT-файлу путем нажатия на Export. Диалоговое окно появляется, который предлагает вам имя файла. В любой точке можно импортировать определения сигнала, сохраненные в MAT-файле путем нажатия на Import.
Маркируйте Signal Attributes
Песни в данных от двух голубых китов. Установите WhaleType
значения для обоих сигналов:
Выберите WhaleType
на Маркировать браузере Definitions.
Нажмите Label ▼ и выберите Label Signals
.
В диалоговом окне, которое появляется, проверьте это оба whale1
и whale2
выбраны и что поле Value установлено в blue
. (Если вы не задаете значение по умолчанию в категориальном определении метки сигнала, Signal Labeler устанавливает метку на первую категорию, заданную в определении.)
Нажать ОК.
Постройте whale1
сигнал путем установки флажка рядом с его именем. Атрибуты сигнала появляются и в Помеченном Настроенном браузере Сигнала и в соответствии с графиком временной зависимости.
Маркируйте Signal Regions
Визуализируйте песни кита и пометьте области стона и трель.
Области трели имеют отличные пакеты звука, акцентированного тишиной. whale1
сосредоточили трель приблизительно в 2 секунды.
Области стона поддержаны низкочастотные вопли. whale1
имеет стоны, сосредоточенные приблизительно в 7 секунд, 12 секунд и 17 секунд.
Пометьте сигналы по одному:
На столбце Графика Помеченного Настроенного браузера Сигнала установите флажок рядом с именем сигнала, чтобы построить сигнал.
Чтобы пометить стон, на Маркировать браузере Definitions, выбирают MoanRegions
пометьте определение.
Нажмите Label ▼ и выберите Label Plotted
. Теневая область кажется, структурированной анимированной пунктирной линией. (Анимированная система координат указывает, что область активна.) Перемещают и изменяют размер активной области, пока она не заключает область стона. Для лучшего размещения метки можно перейти к вкладке Display и выбрать действие изменения масштаба или активировать регулятор панорамы.
Кликните по галочке рядом с кнопкой Label, нажмите Enter или дважды кликните, чтобы маркировать ROI. Область превращается в градиент цвета сигнала. Если вы не задаете значение по умолчанию в логическом определении метки, Signal Labeler устанавливает метку на true
.
Повторите процедуру для других двух стонов.
Чтобы пометить трель, на Маркировать браузере Definitions, выбирают TrillRegions
пометьте определение. Пометьте область трели с помощью шагов 3 и 4.
Прежде, чем пометить второй сигнал песни кита, удалите первый сигнал песни кита из графика путем снятия флажка рядом с его именем в Помеченном Настроенном браузере Сигнала. Если вам построили два сигнала, когда вы помечаете область или точку, Signal Labeler сопоставляет метку с обоими сигналами.
Оси средства просмотра метки показывают местоположения и ширины необходимых областей. Они также показывают значение, присвоенное каждой области.
Маркируйте Signal Points
Области трели имеют отличный peaks, который соответствует пакетам звука. Пометьте три peaks в каждой области трели. Поскольку peaks трели является подметками, каждый должен быть сопоставлен с конкретным TrillRegions
метка.
Пометьте сигналы по одному:
На столбце Графика Помеченного Настроенного браузера Сигнала установите флажок рядом с именем сигнала, чтобы построить сигнал. Также установите флажок, соответствующий области трели, peaks которой вы хотите пометить.
На Маркировать браузере Definitions выберите TrillPeaks
.
На панели инструментов, под Значением, вводят 1
, соответствие первому пику.
На Помеченном Настроенном браузере Сигнала выберите область трели. Область трели становится активной и структурирована анимированной пунктирной линией.
Нажмите Label ▼ и выберите Label Plotted
. Область трели структурирована сплошной линией, и анимированная пунктирная (активная) линия появляется для помечаемой точки.
Переместите активную линию, пока она не пересечет сигнал на пике по вашему выбору. Для лучшего размещения метки можно перейти к вкладке Display и выбрать действие изменения масштаба или активировать регулятор панорамы.
Кликните по галочке рядом с кнопкой Label, нажмите Enter или дважды кликните, чтобы пометить пик. Пунктирная линия превращается в сплошную линию того же цвета как сигнал.
Повторитесь для еще двух peaks, введя 2
и 3
идентифицировать их.
Прежде, чем пометить peaks трели для второго сигнала песни кита, удалите первый сигнал песни кита из графика путем снятия флажка рядом с его именем в Помеченном Настроенном браузере Сигнала.
Оси средства просмотра метки показывают местоположения интересных мест и значения, присвоенного каждой точке.
Постройте два сигнала видеть сводные данные их меток в Маркировать Viewer. Расширьте помеченную иерархию набора сигнала в Помеченном Настроенном браузере Сигнала видеть детали для всех меток. (Чтобы расширить иерархию, щелкните правой кнопкой по любому сигналу по браузеру и выберите Expand All
.) Для каждого сигнала, постройте первую область стона и третий пик трели, который вы пометили.
Отредактируйте значения метки сигнала
В любой точке можно отредактировать любую метку сигнала с помощью Помеченного Настроенного браузера Сигнала. Чтобы отредактировать метку атрибута, выберите его, щелкните правой кнопкой и выберите Edit. Например, если вы обнаруживаете, что второй кит является на самом деле белухой, можно выбрать WhaleType
припишите для whale2
, щелкните правой кнопкой, выберите Edit, и, на диалоговом окне, которое появляется, выберите white
в выпадающем меню.
Если вы хотите отредактировать значение метки ROI или метки точки, можно изменить значение в диалоговом окне. Чтобы изменить местоположение метки ROI или метки точки, можно изменить поля местоположения в диалоговом окне. В качестве альтернативы вы можете:
Постройте метку путем установки флажка рядом с его именем.
Выберите метку.
Переместите область или точку в графике временной зависимости, когда это станет активным.
Экспортируйте помеченный набор сигнала
Экспортируйте помеченные сигналы путем сохранения маркировки и экспорта нового labeledSignalSet
объект. Нажмите кнопку Save Labels на панели инструментов. В диалоговом окне, которое появляется, дайте имени whalesongs
к помеченному набору сигнала. Нажатие на кнопку OK возвращает вас к Signal Analyzer. Смотрите Поведение Импорта и экспорта Signal Labeler для получения дополнительной информации о том, как экспорт Signal Labeler пометил наборы сигнала.
На таблице Signal выберите whalesongs
и щелкните правой кнопкой, чтобы экспортировать его в файл под названием Whale_Songs.mat
.
Загрузите в рабочую область MATLAB® MAT-файл, который вы создали в Маркировать Signal Attributes, Regions of Interest и примере Points. Проверьте, что помеченный набор сигнала содержит определения, что вы добавили использование Signal Labeler.
load Whale_Songs
labelDefinitionsSummary(whalesongs)
ans=3×9 table
LabelName LabelType LabelDataType Categories ValidationFunction DefaultValue Sublabels Tag Description
______________ ___________ _____________ ____________ __________________ ____________ ___________________________ ___ ____________________________
"WhaleType" "attribute" "categorical" {3x1 string} {["N/A" ]} {0x0 double} {0x0 double } "" "Whale type"
"MoanRegions" "roi" "logical" {["N/A" ]} {0x0 double} {0x0 double} {0x0 double } "" "Regions where moans occur"
"TrillRegions" "roi" "logical" {["N/A" ]} {0x0 double} {0x0 double} {1x1 signalLabelDefinition} "" "Regions where trills occur"
Проверьте тот TrillPeaks
подметка TrillRegions
.
labelDefinitionsHierarchy(whalesongs)
ans = 'WhaleType Sublabels: [] MoanRegions Sublabels: [] TrillRegions Sublabels: TrillPeaks '
Получите второго члена набора. Получите имена переменных расписания.
song = getSignal(whalesongs,2); summary(song)
RowTimes: Time: 76579x1 duration Values: Min 0 sec Median 9.5722 sec Max 19.144 sec TimeStep 0.00025 sec Variables: whale2: 76579x1 double Values: Min -0.37326 Median 0 Max 0.37914
Постройте сигнал.
t = song.Time; sng = song.whale2; plot(t,sng)
Визуализируйте помеченные области
Отобразите и идентифицируйте необходимые области, которые вы пометили. Для получения дополнительной информации см. код для labelIntervals
функция в конце примера.
mvals = getLabelValues(whalesongs,2,'MoanRegions'); tvals = getLabelValues(whalesongs,2,'TrillRegions'); cmap = lines; hold on tmoan = mvals.ROILimits; for kj = 1:size(tmoan,1) tv = find(seconds(t)>tmoan(kj,1) & seconds(t)<tmoan(kj,2)); plot(t(tv),sng(tv),'Color',cmap(2,:)) end ttrill = tvals.ROILimits; for kj = 1:size(ttrill,1) tv = find(seconds(t)>ttrill(kj,1) & seconds(t)<ttrill(kj,2)); plot(t(tv),sng(tv),'Color',cmap(3,:)) end labelIntervals(mvals,tvals,cmap(4,:)) hold off
Визуализируйте помеченные точки
Отобразите и идентифицируйте peaks трели, который вы пометили.
pk = getLabelValues(whalesongs,2,{'TrillRegions','TrillPeaks'}); locs = zeros(size(pk,1),1); for kj = 1:length(locs) locs(kj) = find(seconds(t) == pk.Location(kj)); end hold on plot(t(locs),sng(locs)+0.01,'v','MarkerSize',8,'Color',[0.929,0.694,0.125]) text(t(locs)+seconds(0.2),sng(locs)+0.05,int2str(cell2mat(pk.Value)), ... 'HorizontalAlignment','center') hold off
Эта функция помощника отображает и идентифицирует необходимые области.
function labelIntervals(mvals,tvals,clr) [X,Y] = meshgrid(seconds([mvals.ROILimits;tvals.ROILimits]),ylim); plot(X,Y,':k') topts = {'HorizontalAlignment','center','FontWeight','bold', ... 'FontSize',12,'Color',clr}; text((X(1,1:4)+X(1,5:end))/2,Y(2,5:end)-0.1, ... ["moan" "moan" "moan" "trill"],topts{:}) end
То В этом примере показано, как использовать пользовательскую автоматизированную маркировку, функционирует в Signal Labeler к комплексам метки QRS и peaks R электрокардиограммы (ECG) сигналы. Одна пользовательская функция использует ранее обученную текущую нейронную сеть для глубокого обучения, чтобы идентифицировать и определить местоположение комплексов QRS. Другая пользовательская функция использует простое пиковое средство поиска, чтобы определить местоположение peaks R. В примере сеть помечает комплексы QRS двух сигналов, которые абсолютно независимы от сетевого обучения и процесса тестирования.
Комплекс QRS, который состоит из трех отклонений в форме волны ECG, отражает деполяризацию правых и левых желудочков основы. QRS является также самым высоким амплитудным сегментом человеческого heartbeat. Исследование комплекса QRS может помочь оценить полное здоровье основы человека и присутствие отклонений [1]. В частности, путем определения местоположения R peaks в комплексах QRS и взгляда в то время интервалы между последовательным peaks, диагност может вычислить изменчивость сердечного ритма пациента и обнаружить сердечную аритмию.
Нейронная сеть для глубокого обучения в этом примере была введена в Сегментации Формы волны Используя Глубокое обучение, где это было обучено с помощью сигналов ECG от общедоступной Базы данных QT 2[] 3[]. Данные состоят примерно из 15 минут записей ECG от в общей сложности 105 пациентов, произведенных на уровне 250 Гц. Чтобы получить каждую запись, ревизоры поместили два электрода в другие места на груди пациента, которая привела к двухканальному сигналу. База данных обеспечивает метки области сигнала, сгенерированные автоматизированной экспертной системой [1]. Добавленные метки позволяют использовать данные, чтобы обучить глубокую сеть. Дополнительную информацию см. в Сегментации Формы волны Используя Глубокое обучение.
Загрузите, передискретизируйте и импортируйте данные в 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. Сигналы появляются в Помеченном Настроенном браузере Сигнала.
Задайте метки
Задайте метки, чтобы присоединить к сигналам.
Задайте категориальную метку видимой области (ROI) для комплексов QRS. Нажмите Add Definition на вкладке Label. Задайте Маркировать Name как QRSregions
, выберите LabelType of ROI
, введите Тип данных как categorical
, и добавьте две Категории, QRS
и n/a
, каждый на его собственной линии.
Задайте числовую метку точки для 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 показывает диалоговое окно, просящее имя, описание и тип метки функции, чтобы добавить.
Для функции, которая определяет местоположение комплексов QRS, введите findQRS
в Поле имени и выбирают ROI
как Маркировать Type. Можно оставить поле Description пустым, или можно ввести собственное описание.
Для функции, которая определяет местоположение peaks R, введите findRpeaks
в Поле имени и выбирают Point
как Маркировать Type. Можно оставить поле Description пустым, или можно ввести собственное описание.
Если вы уже записали функции, и функции находятся в текущей папке или в пути MATLAB®, Signal Labeler добавляет функции в галерею. Если вы не записали функции, Signal Labeler открывает пустые шаблоны в Редакторе для вас, чтобы ввести или вставить код. Сохраните файлы. Функции появляются в галерее.
Маркируйте QRS Complexes и R Peaks
Найдите и пометьте комплексы QRS входных сигналов.
В Помеченном Настроенном браузере Сигнала установите флажок рядом с y200
.
Выберите QRSregions
в Маркировать браузере Definitions.
На галерее Automate Value выберите findQRS
.
Нажмите Auto-Label и нажмите ОК в диалоговом окне, которое появляется.
Signal Labeler определяет местоположение и помечает комплексы QRS для всех сигналов, но отображает только те из сигнала, флажок которого вы установили. Комплексы QRS появляются как заштрихованные области в графике и в осях средства просмотра метки. Активируйте регулятор панорамы путем нажатия на Panner на вкладке Display и увеличьте масштаб области помеченного сигнала.
Найдите и пометьте peaks R, соответствующий комплексам QRS.
Выберите Rpeaks
в Маркировать браузере Definitions.
Вернитесь к вкладке Label. На галерее Automate Value выберите findRpeaks
.
Нажмите 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
, как объяснено в Сегментации Формы волны Используя Глубокое обучение:
Каждый сигнал должен быть произведен на уровне 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) входа. В Сегментации Формы волны Используя Глубокое обучение сеть выполняет лучше всего, когда дали, как введено карту частоты времени каждого обучения или тестирующий сигнал. 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.
В этом примере показано, как пометить произносимые слова в Signal Labeler. Пример использует Речь IBM® Watson в текстовом программном обеспечении API и Audio Toolbox™. Смотрите Запись Речи в тексте (Audio Toolbox) для инструкций о:
Загрузка speech2text
Audio Toolbox расширенная функциональность, доступная от MATLAB® Central.
Подготовка Речевого API Уотсона IBM, предлагаемого через IBM Cloud Services. Необходимо создать учетную запись IBM Cloud, Речь в текстовом сервисном экземпляре, и перейти к сервисной инструментальной панели и скопировать учетные данные – значения URL и КЛЮЧ API. См. Начинающий Пример в документации IBM для получения дополнительной информации.
Загрузите речевые данные
Загрузите файл аудиоданных, содержащий предложение "Дуб, сильно, и также дает оттенок, на котором" говорит мужской голос. Сигнал производится на уровне 44 100 Гц.
[y,fs] = audioread('oak.m4a'); % To hear, type soundsc(y,fs)
Запустите Signal Analyzer и перетащите сигнал к таблице Signal. Выберите сигнал.
Добавьте время информация: на вкладке Analyzer нажмите Time Values, выберите Sample Rate and Start Time
, и задайте fs
как частота дискретизации.
На вкладке Analyzer нажмите Label. Сигнал появляется в Помеченном Настроенном браузере Сигнала.
Метка Define
Задайте метку, чтобы присоединить к сигналу. Нажмите Add Definition на вкладке Label. Задайте Маркировать Name как Words
, выберите Label Type of ROI
, и введите Тип данных как string
.
Создайте пользовательскую функцию автомаркировки
Создайте пользовательскую функцию, чтобы пометить слова говорившими в звуковом файле. (Код для stt
функция появляется позже в примере.)
Перейдите к директории, где вы сохранили speech2text
Pcode-файлы и файл JSON, который хранит ваши учетные данные IBM Coud.
Чтобы создать функцию, во вкладке Analyzer, нажимают Automate Value ▼ и выбирают Add Custom Function. Signal Labeler показывает диалоговое окно, прося, чтобы вы ввели имя, описание и тип метки функции, чтобы добавить. Введите stt
в Поле имени и выбирают ROI
как Маркировать Type. Можно оставить поле Description пустым, или можно ввести собственное описание.
Скопируйте функциональный код и вставьте его в пустой шаблон, который появляется. Сохраните файл. Функция появляется в галерее.
Найдите и идентифицируйте произносимые слова
Найдите и идентифицируйте слова, произнесенные во входном сигнале.
В Помеченном Настроенном браузере Сигнала установите флажок рядом с y
.
Выберите Words
в Маркировать браузере Definitions.
На галерее Automated Value выберите stt
.
Нажмите Auto-Label и нажмите ОК в диалоговом окне, которое появляется.
Signal Labeler определяет местоположение и помечает произносимые слова.
Экспортируйте помеченный сигнал
Экспортируйте помеченный сигнал. На вкладке Label нажмите Save Labels. В диалоговом окне, которое появляется, дайте имени transcribedAudio
к помеченному набору сигнала. Нажатие "ОК" возвращает вас в Signal Analyzer. На таблице Signal выберите transcribedAudio
и щелкните правой кнопкой, чтобы экспортировать его в файл под названием Transcription.mat
.
Загрузите помеченный набор сигнала. Набор имеет только одного участника. Получите имена меток и используйте имя, чтобы получить и отобразить записанные слова.
load Transcription
ln = getLabelNames(transcribedAudio);
v = getLabelValues(transcribedAudio,1,ln)
v=7×2 table
ROILimits Value
____________ ________
0.09 0.56 "oak"
0.59 0.97 "is"
1 1.78 "strong"
1.94 2.19 "and"
2.22 2.67 "also"
2.67 3.22 "gives"
3.25 3.91 "shade"
Перестройте слова так, чтобы дуб "Чтений предложения дал оттенок, и также был силен". Постройте сигнал с помощью различного цвета в каждом слове.
k = v([1 6:7 4:5 2:3],:); s = getSignal(transcribedAudio,1); sent = []; sgs = NaN(height(s),height(k)); lgd = []; for kj = 1:height(k) lm = length(sent); word = s.y(timerange(seconds(k.ROILimits(kj,1)),seconds(k.ROILimits(kj,2)))); sent = [sent;word]; sgs(lm+(1:length(word)),kj) = word; lgd = [lgd;(length(sent)-length(word)/2)/fs]; end sgs(length(sent)+1:end,:) = []; % To hear, type soundsc(sent,fs) plot((0:length(sgs)-1)/fs,sgs) text(lgd,-0.7*ones(size(lgd)),k.Value,'HorizontalAlignment',"center") axis tight
stt
Функция: найдите и идентифицируйте произносимые слова
Эта функция использует Речевой API Уотсона IBM и speech2text
Audio Toolbox расширенная функциональность, чтобы извлечь произносимые слова из звукового файла.
function [labelVals,labelLocs] = stt(x,t,parentLabelVal,parentLabelLoc,varargin) aspeechObjectIBM = speechClient('IBM','timestamps',true,'model','en-US_NarrowbandModel'); fs = 1/(t(2)-t(1)); tixt = speech2text(aspeechObjectIBM,x,fs); numLabels = numel(tixt.TimeStamps{:}); labelVals = strings(numLabels,1); labelLocs = zeros(numLabels,2); for idx =1:numLabels labelVals(idx) = tixt.TimeStamps{:}{idx}{1}; labelLocs(idx,1) = tixt.TimeStamps{:}{idx}{2}; labelLocs(idx,2) = tixt.TimeStamps{:}{idx}{3}; end end
При сохранении меток Signal Labeler преобразует все сигналы с информацией времени к расписаниям. Это преобразование приводит к более глубокой иерархии вложенных каналов в сохраненном labeledSignalSet
. Дополнительную информацию см. в Поведении Импорта и экспорта Signal Labeler.
Средние значения Signal Labeler образовывают канал цвета, когда это представляет метки, соответствующие многоканальным сигналам. Для лучших результатов настройте цвет линии так, чтобы это было то же самое для всех каналов в данном сигнале. Выполните индивидуальную настройку в Signal Analyzer прежде, чем ввести Signal Labeler.
Сравните цвет метки для diffr
, сигнал, каналы которого имеют различные цвета к цвету метки для equal
, сигнал, каналы которого у всех есть тот же цвет. Любые метки для equal
представляются в тени синего, который совместно используют все каналы. Метки для diffr
представляются в оттенке коричневого цвета, который не совпадает ни с одним из цветов канала.
Когда вы уменьшаете ширину окна Signal Labeler, таблица атрибутов в соответствии с графиком временной зависимости показывает горизонтальную полосу прокрутки. В системах Apple macOS полоса прокрутки скрыта по умолчанию. Если вы имеете сенсорную панель и прокручиваете горизонтально, полоса прокрутки появляется. Если вы используете мышь и хотите, чтобы полоса прокрутки всегда отображалась, можно изменить поведение системы в Установках системы.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.