signalLabelDefinition

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

Описание

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

Создание

Описание

sld = signalLabelDefinition(name) создает объект определения метки сигнала, sldс Именем набора свойств для 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'функция проверяет, что вход является одним из значений, заданных с помощью Categories. Функция принимает вход значение и возвраты true если значение верно и false если значение недопустимо.

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

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

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

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

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

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

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

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

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

Пример: '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) метку, чтобы захватить стоновые области. Задайте другую метку информация только для чтения для захвата областей trill.

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

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

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 (Signal Processing Toolbox) объект для каждой песни кита и используйте его, чтобы визуализировать и пометить различные области. Для лучшей визуализации измените значения меток с логических на категориальные.

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

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

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     

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

  • The signalDatastore (Signal Processing Toolbox) объект sd содержит данные сигнала.

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

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

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

  • Использование signalMask (Signal Processing Toolbox) объект, чтобы выделить необходимые области синего цвета.

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

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

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