exponenta event banner

countLabelValues

Подсчитать значения меток

    Описание

    пример

    cnt = countLabelValues(lss,lblname) подсчитывает значения метки с именем lblname и возвращает результаты в таблице cnt. cnt содержит количество значений меток и проценты. Когда lblname - ROI или метка точки, cnt также содержит число членов с по крайней мере одним значением конкретной категории. countLabelValues не поддерживает:

    • Подэтикетки

    • Определения меток со свойством LabelDataType, имеющим значение 'table' или 'timetable'

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

      • Массивы ячеек расписаний

      • Массивы ячеек, содержащие матрицы различных размеров

    Примеры

    свернуть все

    Загрузите маркированный набор сигналов, содержащий записи песен китов.

    load whales
    lss
    lss = 
      labeledSignalSet with properties:
    
                 Source: {2x1 cell}
             NumMembers: 2
        TimeInformation: "sampleRate"
             SampleRate: 4000
                 Labels: [2x3 table]
            Description: "Characterize wave song regions"
    
     Use labelDefinitionsHierarchy to see a list of labels and sublabels.
     Use setLabelValue to add data to the set.
    
    

    Получение имен меток в наборе.

    getLabelNames(lss)
    ans = 3x1 string
        "WhaleType"
        "MoanRegions"
        "TrillRegions"
    
    

    Убедитесь, что два члена набора - синие киты.

    countLabelValues(lss,"WhaleType")
    ans=3×3 table
        WhaleType    Count    Percent
        _________    _____    _______
    
        blue           2        100  
        humpback       0          0  
        white          0          0  
    
    

    Убедитесь, что у каждого члена есть три области стона.

    countLabelValues(lss,"MoanRegions")
    ans=2×4 table
        MoanRegions    Count    Percent    MemberCount
        ___________    _____    _______    ___________
    
           false         0          0           0     
           true          6        100           2     
    
    

    Убедитесь, что каждый элемент имеет одну область трели.

    countLabelValues(lss,"TrillRegions")
    ans=2×4 table
        TrillRegions    Count    Percent    MemberCount
        ____________    _____    _______    ___________
    
           false          0          0           0     
           true           2        100           2     
    
    

    Укажите путь к набору аудиосигналов, входящих в состав 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

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

    свернуть все

    Набор маркированных сигналов, указанный как labeledSignalSet объект.

    Пример: labeledSignalSet({randn(100,1) randn(10,1)},signalLabelDefinition('female')) задает двухкомпонентный набор случайных сигналов, содержащих атрибут 'female'.

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

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

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

    свернуть все

    Таблица результатов, возвращенная как таблица со следующими переменными:

    • Count - Количество значений меток для определенной категории.

    • Percent - Количество значений меток для определенной категории в процентах от всех значений меток.

    • MemberCount - количество членов, имеющих хотя бы одно значение определенной категории. Эта переменная возвращается только для ROI или метки точки.

    Представлен в R2021a