combine

Объедините данные из нескольких хранилищ данных

Описание

пример

sdsnew = combine(sds1,sds2,...,sdsn) объединяет два или более хранилища данных путем горизонтального конкатенации данных, возвращаемых read (Audio Toolbox) вызывается функция на входных хранилищах данных.

Примеры

свернуть все

Укажите путь к четырем сигналам, включенным в MATLAB ®. Сигналами являются записи птичьего щебета, гонга, train и брызги. Все сигналы дискретизированы на частоте 8192 Гц.

folder = fullfile(matlabroot,'toolbox','matlab','audiovideo', ...
         ["chirp.mat","gong.mat","train.mat","splat.mat"]);

Создайте сигнальный datastore, который указывает на указанные файлы. Каждый файл содержит переменную Fs что обозначает частоту дискретизации.

sds1 = signalDatastore(folder,'SampleRateVariableName','Fs');

Задайте функцию, которая принимает выходы read функция и вычисляет верхнюю и нижнюю огибающие сигналов с помощью сплайн интерполяции по локальным максимумам, разделенным по меньшей мере 80 выборками. Функция также возвращает шаги расчета для каждого сигнала.

function [dataOut,infoOut] = signalEnvelope(dataIn,info)
    [dataOut(:,1),dataOut(:,2)] = envelope(dataIn,80,'peak');
    infoOut = info;
    infoOut.TimeInstants = (0:length(dataOut)-1)/info.SampleRate;
end

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

sds2 = transform(sds1,@signalEnvelope,"IncludeInfo",true);

Объедините sds1 и sds2 создать третий datastore. Каждый вызов на read функция из комбинированного datastore возвращает матрицу с тремя столбцами:

  • Первый столбец соответствует исходному сигналу.

  • Второй и третий столбцы соответствуют верхней и нижней огибающим соответственно.

sdsCombined = combine(sds1,sds2);

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

tiledlayout('flow')
while hasdata(sdsCombined)
    [dataOut,infoOut] = read(sdsCombined);
    ts = infoOut{2}.TimeInstants;
    nexttile
    hold on
    plot(ts,dataOut(:,1),'Color','#DCDCDC','LineStyle',':')
    plot(ts,dataOut(:,2:3),'Linewidth',1.5)
    hold off
    xlabel('Time (s)')
    ylabel('Signal')
    title(extractBetween(infoOut{:,2}.FileName,'audiovideo\','.mat'))
end

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

Укажите путь к файлам примера, включенным в Signal Processing Toolbox™. Каждый файл содержит щебет и частоту случайных выборок в диапазоне от 100 до 150 Гц.

folder = fullfile(matlabroot,'examples','signal','data','sample_chirps');

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

sds = signalDatastore(folder,'SampleRateVariableName','fs');

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

function [dataOut,infoOut] = extractinstfreq(dataIn,info)
    [P,F,T] = pspectrum(dataIn,info.SampleRate,'spectrogram',...
             'TimeResolution',0.1,'OverlapPercent',40,'Leakage',0.8);
    dataOut = {instfreq(P,F,T)'};
    infoOut = info;
    infoOut.CenterFrequencies = F;
    infoOut.TimeInstants = T;
end

Вызовите transform функция для создания нового datastore, который вычисляет мгновенные частоты.

sds2 = transform(sds,@extractinstfreq,'IncludeInfo',true);

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

sds1 = transform(sds,@(x) {x});

Объедините sds1 и sds2. В то время как объединенный datastore имеет непрочитанные файлы, прочитайте из нового datastore и визуализируйте спектрограммы. Наложите мгновенные частоты на спектрограммы.

sdsCombined = combine(sds1,sds2);
sdsSubset = subset(sdsCombined,[1,4,9,10]);
plotID = 1;
while hasdata(sdsSubset)
    subplot(2,2,plotID)
    [sig,info] = read(sdsSubset);
    pspectrum(sig{:,1},info{:,2}.SampleRate,'spectrogram', ...
             'TimeResolution',0.1,'OverlapPercent',40,'Leakage',0.8)
    hold on
    plot(info{:,2}.TimeInstants',sig{:,2})
    plotID = plotID + 1;
end

Figure contains 4 axes. Axes 1 with title Fres = 17.8854 Hz, Tres = 93.2203 ms contains 2 objects of type image, line. Axes 2 with title Fres = 17.3141 Hz, Tres = 96.2963 ms contains 2 objects of type image, line. Axes 3 with title Fres = 18.037 Hz, Tres = 92.437 ms contains 2 objects of type image, line. Axes 4 with title Fres = 16.6729 Hz, Tres = 100 ms contains 2 objects of type image, line.

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

свернуть все

Сигнализируйте хранилища данных для объединения, заданные как два или более разделенных запятыми signalDatastore объекты.

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

свернуть все

Новый datastore с объединенными данными, возвращенный как CombinedDatastore объект.

Вызов read (Audio Toolbox) на объединенном datastore, горизонтально конкатенирует данные путем вызова read (Audio Toolbox) на каждом входном datastore.

Введенный в R2020a