combine

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

Описание

пример

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

Примеры

свернуть все

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

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

Задайте путь к файлам в качестве примера, включенным с 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, который вычисляет instantantaneous частоты.

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

Поскольку данные в sds2 не горизонтально concatenable с данными в 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

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

свернуть все

Хранилища данных сигнала, чтобы объединиться в виде двух или больше разделенных от запятой signalDatastore объекты.

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

свернуть все

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

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

Введенный в R2020a