exponenta event banner

signalLabelDefinition

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

Описание

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

Создание

Описание

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

пример

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

Входные аргументы

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

Имя метки, указанное как вектор символа или скаляр строки.

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

Свойства

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

Имя метки, указанное как вектор символа или скаляр строки.

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

Тип метки, указанный как одно из следующих значений:

  • 'attribute' - Определение характеристик сигнала.

  • 'roi' - Определение характеристик сигнала по интересующим регионам.

  • 'point' - Определение характеристик сигнала по интересующим точкам.

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

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

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

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

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

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

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

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

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

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

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

Пример: 'LabelDataType','numeric','DefaultValue',1,'ValidationFunction',@(x)x<2

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

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

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

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

Описание метки, указанное как вектор символа или скаляр строки.

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

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

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

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

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

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

Примечание

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

Пример: 'Sublabels',[signalLabelDefinition("negative"),signalLabelDefinition("positive")]

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

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

Примеры

свернуть все

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

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

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

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

Определение метки области интересов (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');        

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

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

dTrills.Sublabels = dTrillPeaks;

Набор маркированных сигналов

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

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 секунд.

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

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.

Визуализация меток точек

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

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'   }

Создайте хранилище данных сигнала, указывающее на указанную папку. Задайте имя переменной частоты выборки как Fs, что является общим для всех файлов. Создание подмножества хранилища данных, исключающего файл mtlb.mat. Использовать хранилище данных подмножества в качестве источника для 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