signalLabelDefinition

Создайте определение метки сигнала

Описание

Используйте signalLabelDefinition чтобы создать сигнал помечают определения для наборов данных. Метки могут соответствовать атрибутам, областям или интересным местам. Используйте вектор из signalLabelDefinition объекты создать labeledSignalSet.

Создание

Описание

sld = signalLabelDefinition(name) создает объект определения метки сигнала, sld, с набором свойств Имени к name и другой набор свойств к значениям по умолчанию.

пример

sld = signalLabelDefinition(name,Name,Value) Свойства наборов с помощью пар "имя-значение". Можно задать несколько пар "имя-значение". Заключите каждое имя свойства в кавычки.

Входные параметры

развернуть все

Пометьте имя в виде вектора символов или строкового скаляра.

Типы данных: char | string

Свойства

развернуть все

Имя метки в виде вектора символов или строкового скаляра.

Типы данных: char | string

Тип метки в виде одного из следующего:

  • 'attribute' — Задайте характеристики сигнала.

  • 'roi' — Задайте характеристики сигнала по необходимым областям.

  • 'point' — Задайте характеристики сигнала по интересным местам.

Типы данных: char | string

Тип данных метки в виде 'logical'категориальныйЧисловойСтрокаТаблица, или 'timetable'. Используйте свойство Categories задать массив категорий, когда это свойство будет установлено в 'categorical'.

Типы данных: char | string

Категория меток называет в виде массива строк или массива ячеек из символьных векторов. Массив должен иметь уникальные элементы. Это свойство применяется только, когда свойство LabelDataType установлено в 'categorical'.

Пример: 'LabelDataType','categorical','Categories',["apple","orange"]

Типы данных: char | string

Тип данных ROI ограничивает в виде любого 'double' или 'duration'. Это свойство применяется только, когда LabelType установлен в 'roi'.

Типы данных: char | string

Тип данных местоположений точки в виде любого 'double' или 'duration'. Это свойство применяется только, когда LabelType установлен в 'point'.

Типы данных: char | string

Функция валидации в виде указателя на функцию и используемый при устанавливании значений метки в labeledSignalSet объект. Это свойство применяется только, когда LabelDataType установлен в 'categorical'логическийЧисловойТаблица, или 'timetable'. Если не заданный, функция проверяет только, что ее входные значения имеют правильный тип данных. Если LabelDataType установлен в 'categorical', функция проверяет, что вход является одним из значений, заданных с помощью Категорий. Функция берет входное значение и возвращает true если значение допустимо и false если значение недопустимо.

Пример: 'LabelDataType', 'числовой', 'DefaultValue', 1, 'ValidationFunction',@ (x) x <2

Типы данных: function_handle

Значение по умолчанию метки в виде значения типа, заданного с помощью LabelDataType. Если LabelDataType установлен в 'categorical', затем DefaultValue должен быть одним из значений, заданных с помощью Категорий.

Пример: 'LabelDataType', 'категориальный', 'Categories', ["яблоко", "оранжевое"], 'DefaultValue', "яблоко"

Типы данных: char | double | logical | string | table

Пометьте описание в виде вектора символов или строкового скаляра.

Пример: 'Description','Patient is asleep'

Типы данных: char | string

Идентификатор тега label в виде вектора символов или строкового скаляра. Используйте это свойство идентифицировать ту же метку в большей схеме маркировки или общедоступном наборе маркировки.

Пример: 'Tag','Peak1'

Типы данных: char | string

Массив подметок в виде объекта определения метки сигнала. Чтобы задать больше чем одну подметку, установите это свойство на вектор из объектов определения метки сигнала. Используйте это свойство создать отношение между родительской меткой и ее дочерними элементами.

Примечание

Подметки не могут иметь подметок.

Пример: 'Sublabels', [signalLabelDefinition ("отрицательный"), signalLabelDefinition ("положительный")]

Функции объекта

labelDefinitionsHierarchyПолучите иерархический список метки и подпометьте имена
labelDefinitionsSummaryПолучите сводную таблицу определений метки сигнала

Примеры

свернуть все

Рассмотрите набор аудиозаписей кита. Записанные звуки кита состоят из трелей и стонов. Трели походят на серию нажатий кнопки. Стоны являются низкочастотными криками, похожими на звук, сделанный рогом поставки. Вы хотите посмотреть на каждый сигнал и пометить его, чтобы идентифицировать тип кита, области трели и области стона. Для каждой области трели вы также хотите пометить peaks сигнала выше, чем определенный порог.

Определения метки сигнала

Задайте метку атрибута, чтобы сохранить типы кита. Возможные категории являются голубым китом, горбатым китом и белухой.

dWhaleType = signalLabelDefinition('WhaleType',...
   'LabelType','attribute',...
   'LabelDataType','categorical',...
   'Categories', ["blue" "humpback" "white"],...
   'Description','Whale type'); 

Задайте метку видимой области (ROI), чтобы получить области стона. Задайте другую метку ROI, чтобы получить области трели.

dMoans = signalLabelDefinition('MoanRegions',...
   'LabelType','roi',...
   'LabelDataType','logical',...
   'Description','Regions where moans occur');

dTrills = signalLabelDefinition('TrillRegions',...
   'LabelType','roi',...
   'LabelDataType','logical',...
   'Description','Regions where trills occur');        

Наконец, задайте метку точки, чтобы получить peaks трели. Установите эту метку как подметку dTrills определение.

dTrillPeaks = signalLabelDefinition('TrillPeaks',...
   'LabelType','point',...
   'LabelDataType','numeric',...
   'Description','Trill peaks');

dTrills.Sublabels = dTrillPeaks;

Помеченный набор сигнала

Создайте labeledSignalSet с китом сигнализирует и определения метки. Добавьте значения метки, чтобы идентифицировать тип кита, стон и области трели и peaks трелей.

load labelwhalesignals
lbldefs = [dWhaleType dMoans dTrills];

lss = labeledSignalSet({whale1 whale2},lbldefs,'MemberNames',{'Whale1' 'Whale2'}, ...
   'SampleRate',Fs,'Description','Characterize wave song regions');     

Визуализируйте иерархию метки и пометьте свойства с помощью labelDefinitionsHierarchy и labelDefinitionsSummary.

labelDefinitionsHierarchy(lss)
ans = 
    'WhaleType
       Sublabels: []
     MoanRegions
       Sublabels: []
     TrillRegions
       Sublabels: TrillPeaks
     '

labelDefinitionsSummary(lss)
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"

Сигналы в загруженных данных соответствуют песням двух голубых китов. Установите 'WhaleType' значения для обоих сигналов.

setLabelValue(lss,1,'WhaleType','blue');
setLabelValue(lss,2,'WhaleType','blue');

Визуализируйте 'Labels' свойство. Таблица имеет недавно добавленный 'WhaleType' значения для обоих сигналов.

lss.Labels      
ans=2×3 table
              WhaleType    MoanRegions    TrillRegions
              _________    ___________    ____________

    Whale1      blue       {0x2 table}    {0x3 table} 
    Whale2      blue       {0x2 table}    {0x3 table} 

Визуализируйте метки области

Визуализируйте песни кита, чтобы идентифицировать области стона и трель.

subplot(2,1,1)
plot((0:length(whale1)-1)/Fs,whale1)
ylabel('Whale 1')

subplot(2,1,2)
plot((0:length(whale2)-1)/Fs,whale2)
ylabel('Whale 2')

Figure contains 2 axes. Axes 1 contains an object of type line. Axes 2 contains an object of type line.

Области стона поддержаны низкочастотные вопли.

  • whale1 имеет стоны, сосредоточенные приблизительно в 7 секунд, 12 секунд и 17 секунд.

  • whale2 имеет стоны, сосредоточенные приблизительно в 3 секунды, 7 секунд и 16 секунд.

Добавьте области стона в помеченный набор. Задайте пределы ROI в секундах и значениях метки.

moanRegionsWhale1 = [6.1 7.7; 11.4 13.1; 16.5 18.1];
mrsz1 = [size(moanRegionsWhale1,1) 1];
setLabelValue(lss,1,'MoanRegions',moanRegionsWhale1,true(mrsz1));

moanRegionsWhale2 = [2.5 3.5; 5.8 8; 15.4 16.7];
mrsz2 = [size(moanRegionsWhale2,1) 1];
setLabelValue(lss,2,'MoanRegions',moanRegionsWhale2,true(mrsz2));

Области трели имеют отличные пакеты звука, акцентированного тишиной.

  • whale1 сосредоточили трель приблизительно в 2 секунды.

  • whale2 сосредоточили трель приблизительно в 12 секунд.

Добавьте области трели в помеченный набор.

trillRegionWhale1 = [1.4 3.1];
trsz1 = [size(trillRegionWhale1,1) 1];
setLabelValue(lss,1,'TrillRegions',trillRegionWhale1,true(trsz1));

trillRegionWhale2 = [11.1 13];
trsz2 = [size(trillRegionWhale1,1) 1];
setLabelValue(lss,2,'TrillRegions',trillRegionWhale2,true(trsz2));

Создайте signalMask объект для каждой песни кита и использования это, чтобы визуализировать и пометить различные области. Для лучшей визуализации измените значения метки от логического до категориального.

mr1 = getLabelValues(lss,1,'MoanRegions');
mr1.Value = categorical(repmat("moan",mrsz1));
tr1 = getLabelValues(lss,1,'TrillRegions');
tr1.Value = categorical(repmat("trill",trsz1));

msk1 = signalMask([mr1;tr1],'SampleRate',Fs);

subplot(2,1,1)
plotsigroi(msk1,whale1)
ylabel('Whale 1')
hold on

mr2 = getLabelValues(lss,2,'MoanRegions');
mr2.Value = categorical(repmat("moan",mrsz2));
tr2 = getLabelValues(lss,2,'TrillRegions');
tr2.Value = categorical(repmat("trill",trsz2));

msk2 = signalMask([mr2;tr2],'SampleRate',Fs);

subplot(2,1,2)
plotsigroi(msk2,whale2)
ylabel('Whale 2')
hold on

Figure contains 2 axes. Axes 1 contains 3 objects of type line. Axes 2 contains 3 objects of type line.

Визуализируйте метки точки

Пометьте три peaks для каждой области трели. Для меток точки вы задаете местоположения точки и значения метки. В этом примере местоположения точки находятся в секундах.

peakLocsWhale1 = [1.553 1.626 1.7];
peakValsWhale1 = [0.211 0.254 0.211];

setLabelValue(lss,1,["TrillRegions" "TrillPeaks"],...
   peakLocsWhale1,peakValsWhale1,'LabelRowIndex',1);

subplot(2,1,1)
plot(peakLocsWhale1,peakValsWhale1,'v')
hold off

peakLocsWhale2 = [11.214 11.288 11.437];
peakValsWhale2 = [0.119 0.14 0.15];

setLabelValue(lss,2,["TrillRegions" "TrillPeaks"],...
   peakLocsWhale2,peakValsWhale2,'LabelRowIndex',1);

subplot(2,1,2)
plot(peakLocsWhale2,peakValsWhale2,'v')
hold off

Figure contains 2 axes. Axes 1 contains 4 objects of type line. Axes 2 contains 4 objects of type line.

Исследуйте значения метки

Исследуйте значения метки с помощью getLabelValues.

getLabelValues(lss)
ans=2×3 table
              WhaleType    MoanRegions    TrillRegions
              _________    ___________    ____________

    Whale1      blue       {3x2 table}    {1x3 table} 
    Whale2      blue       {3x2 table}    {1x3 table} 

Получите области стона для первого члена помеченного набора.

getLabelValues(lss,1,'MoanRegions')
ans=3×2 table
     ROILimits      Value
    ____________    _____

     6.1     7.7    {[1]}
    11.4    13.1    {[1]}
    16.5    18.1    {[1]}

Используйте второй выходной аргумент, чтобы перечислить подметки метки.

[value,valueWithSublabel] = getLabelValues(lss,1,'TrillRegions')
value=1×2 table
    ROILimits     Value
    __________    _____

    1.4    3.1    {[1]}

valueWithSublabel=1×3 table
    ROILimits     Value     Sublabels 
                           TrillPeaks 
    __________    _____    ___________

    1.4    3.1    {[1]}    {3x2 table}

Чтобы получить значения в подметке, опишите имя метки как двухэлементный массив.

getLabelValues(lss,1,["TrillRegions" "TrillPeaks"])
ans=3×2 table
    Location      Value   
    ________    __________

     1.553      {[0.2110]}
     1.626      {[0.2540]}
       1.7      {[0.2110]}

Найдите значение третьего соответствия пика трели второму члену набора.

getLabelValues(lss,2,["TrillRegions" "TrillPeaks"], ...
    'LabelRowIndex',1,'SublabelRowIndex',3)
ans=1×2 table
    Location      Value   
    ________    __________

     11.437     {[0.1500]}

Задайте путь к набору звуковых сигналов, включенных как MAT-файлы с MATLAB®. Каждый файл содержит переменную сигнала и частоту дискретизации. Перечислите имена файлов.

folder = fullfile(matlabroot,"toolbox","matlab","audiovideo");
lst = dir(append(folder,"/*.mat"));
nms = {lst(:).name}'
nms = 7x1 cell
    {'chirp.mat'   }
    {'gong.mat'    }
    {'handel.mat'  }
    {'laughter.mat'}
    {'mtlb.mat'    }
    {'splat.mat'   }
    {'train.mat'   }

Создайте datastore сигнала, который указывает на заданную папку. Определите имя переменной частоты дискретизации к Fs, который характерен для всех файлов. Сгенерируйте подмножество datastore, который исключает файл mtlb.mat. Используйте datastore подмножества в качестве источника для labeledSignalSet объект.

sds = signalDatastore(folder,"SampleRateVariableName","Fs");
sds = subset(sds,~strcmp(nms,"mtlb.mat"));
lss = labeledSignalSet(sds);

Создайте три определения метки, чтобы пометить сигналы:

  • Задайте логическую метку атрибута, которая верна для сигналов, которые содержат человеческую речь.

  • Задайте числовую метку точки, которая отмечает местоположение и амплитуду максимума каждого сигнала.

  • Задайте категориальную метку видимой области (ROI), чтобы выбрать неналожение, универсальная длина случайные области каждого сигнала.

Добавьте определения метки сигнала помеченному набору сигнала.

vc = signalLabelDefinition("Voice",'LabelType','attribute', ...
    'LabelDataType','logical','DefaultValue',false);
mx = signalLabelDefinition("Maximum",'LabelType','point', ...
    'LabelDataType','numeric');
rs = signalLabelDefinition("RanROI",'LabelType','ROI', ...
    'LabelDataType','categorical','Categories',["ROI" "other"]);
addLabelDefinitions(lss,[vc mx rs])

Пометьте сигналы:

  • Маркируйте 'handel.mat' и 'laughter.mat' как наличие человеческой речи.

  • Используйте islocalmax функционируйте, чтобы найти максимум каждого сигнала. Пометьте его местоположение и значение.

  • Используйте randROI функция, чтобы сгенерировать столько областей длины выборки N/10, сколько может поместиться в сигнал длины N, учитывая минимальное разделение выборок N/6 между областями. Пометьте их местоположения и присвойте их ROI категория.

При маркировке точек и областей, преобразуйте демонстрационные значения во временные стоимости. Вычтите 1 с учетом индексации массива MATLAB® и разделитесь на частоту дискретизации.

kj = 1;
while hasdata(sds)
    
    [sig,info] = read(sds);
    fs = info.SampleRate;

    [~,fn] = fileparts(info.FileName);
    if fn=="handel" || fn=="laughter"
        setLabelValue(lss,kj,"Voice",true)
    end
    
    xm = find(islocalmax(sig,'MaxNumExtrema',1));
    setLabelValue(lss,kj,"Maximum",(xm-1)/fs,sig(xm))

    N = length(sig);
    rois = randROI(N,round(N/10),round(N/6));
    setLabelValue(lss,kj,"RanROI",(rois-1)/fs,repelem("ROI",size(rois,1)))

    kj = kj+1;
    
end

Проверьте, что только два сигнала содержат речь.

countLabelValues(lss,"Voice")
ans=2×3 table
    Voice    Count    Percent
    _____    _____    _______

    false      4      66.667 
    true       2      33.333 

Проверьте, что два сигнала имеют максимальную амплитуду 1.

countLabelValues(lss,"Maximum")
ans=5×4 table
           Maximum            Count    Percent    MemberCount
    ______________________    _____    _______    ___________

    0.80000000000000004441      1      16.667          1     
    0.89113331915798421612      1      16.667          1     
    0.94730769230769229505      1      16.667          1     
    1                           2      33.333          2     
    1.0575668990330560071       1      16.667          1     

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

countLabelValues(lss,"RanROI")
ans=2×4 table
    RanROI    Count    Percent    MemberCount
    ______    _____    _______    ___________

    ROI        24        100           6     
    other       0          0           0     

Создайте два хранилища данных с данными в помеченном наборе сигнала:

  • signalDatastore объект sd содержит данные сигнала.

  • arrayDatastore объект ld содержит информацию о маркировке. Укажите, что вы хотите включать информацию, соответствующую всем меткам, которые вы создали.

[sd,ld] = createDatastores(lss,["Voice" "RanROI" "Maximum"]);

Используйте информацию в хранилищах данных, чтобы построить сигналы и отобразить их метки.

  • Используйте signalMask возразите, чтобы подсветить необходимые области синего цвета.

  • Постройте желтые графики, чтобы отметить местоположения максимумов.

  • Добавьте красную подпись по осям в сигналы, которые содержат человеческую речь.

tiledlayout flow

while hasdata(sd)

    [sg,nf] = read(sd);
    
    lbls = read(ld);
    
    nexttile
    
    msk = signalMask(lbls{:}.RanROI{:},'SampleRate',nf.SampleRate);    
    plotsigroi(msk,sg)
    colorbar off
    xlabel('')
    
    [X,Y] = meshgrid(lbls{:}.Maximum{:}.Location,ylim);
    hold on
    plot(X,Y,'LineWidth',2,'Color','#EDB120')
    hold off
    
    if lbls{:}.Voice{:}
        ylabel('VOICED','Color','#D95319')
    end

end

Figure contains 6 axes. Axes 1 contains 4 objects of type line. Axes 2 contains 4 objects of type line. Axes 3 contains 4 objects of type line. Axes 4 contains 4 objects of type line. Axes 5 contains 4 objects of type line. Axes 6 contains 4 objects of type line.

function roilims = randROI(N,wid,sep)

num = floor((N+sep)/(wid+sep));
hq = histcounts(randi(num+1,1,N-num*wid-(num-1)*sep),(1:num+2)-1/2);
roilims = (1 + (0:num-1)*(wid+sep) + cumsum(hq(1:num)))' + [0 wid-1];

end

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

Приложения

Объекты

Введенный в R2018b