Создайте хранилища данных, указывающие на сигнал и данные о метках
[
создает datastore, sigdata
,lbldata
] = createDatastores(lss
,lblnames
)sigdata
, содержащий данные представителя сигнала и datastore, lbldata
, содержащие данные о метках из меток, указанных в строковые массивы lblnames
. createDatastores
не применяется к подметкам. Задайте lblnames
к одному или нескольким родительские элементы имен меток, чтобы получить родительского элемента меток и соответствующих значений подметки.
Загрузите маркированный набор сигналов, содержащий записи песен китов.
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.
Отображение меток для первого представителя набора.
lss.Labels(1,:)
ans=1×3 table
WhaleType MoanRegions TrillRegions
_________ ___________ ____________
Member{1} blue {3x2 table} {1x3 table}
Получите имена меток в наборе. Создайте сигнальный datastore с информацией о сигнале и массив datastore с информацией о метке.
lbls = getLabelNames(lss); [sgd,lbd] = createDatastores(lss,lbls)
sgd = signalDatastore with properties: MemberNames:{ 'Member{1}'; 'Member{2}' } Members: {2x1 cell} ReadSize: 1 SampleRate: 4000
lbd = ArrayDatastore with properties: ReadSize: 1 IterationDimension: 1 OutputType: "cell"
Отображение меток для первого представителя набора.
lbls = read(lbd); lbls{:}
ans=1×3 table
WhaleType MoanRegions TrillRegions
_________ ___________ ____________
blue {3x2 table} {1x3 table}
Укажите путь к набору аудиосигналов, включенных в качестве 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
Создайте два хранилища данных с данными в маркированном наборе сигналов:
The signalDatastore
sd объекта
содержит данные сигнала.
The 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
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
lss
- Маркированный набор сигналовlabeledSignalSet
объектМаркированный набор сигналов, заданный как labeledSignalSet
объект.
Пример:
задает набор случайных сигналов с двумя членами, содержащий атрибут labeledSignalSet
({randn (100,1) randn (10,1)}, signalLabelDefinition ('female'))'female'
.
lblnames
- Имена метокИмена меток, заданные как вектор символов, строковый скаляр, массив ячеек из векторов символов или строковые массивы.
Типы данных: char
| string
sigdata
- Сигнальные данныеsignalDatastore
| объекта audioDatastore
объектДанные сигнала, возвращенные как signalDatastore
объект или audioDatastore
(Audio Toolbox) объект.
lbldata
- Маркируйте данныеarrayDatastore
объектПометьте данные, возвращенные как arrayDatastore
объект.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.