read

Считайте следующее последовательное наблюдение сигнала

Описание

пример

sig = read(sds) возвращает данные сигнала, извлеченные из datastore. Каждый последующий вызов на read возвращает данные из следующего файла в datastore (если sds содержит данные файла) или следующего представителя (если sds содержит данные в памяти).

[sig,info] = read(sds) также возвращает информацию об извлеченных сигнальных данных.

Примеры

свернуть все

Укажите путь к выборочным сигналам, включенным в Signal Processing Toolbox™.

folder = fullfile(matlabroot,'toolbox','matlab','audiovideo');

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

sds = signalDatastore(folder,'FileExtension','.mat','SampleRateVariableName','Fs');
[~,c] = fileparts(sds.Files)
c = 7x1 cell
    {'chirp'   }
    {'gong'    }
    {'handel'  }
    {'laughter'}
    {'mtlb'    }
    {'splat'   }
    {'train'   }

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

while hasdata(sds)
    [data,info] = read(sds);
    fprintf('Fraction of files read: %.2f\n',progress(sds))
end
Fraction of files read: 0.14
Fraction of files read: 0.29
Fraction of files read: 0.43
Fraction of files read: 0.57
Fraction of files read: 0.71
Fraction of files read: 0.86
Fraction of files read: 1.00

Печать и просмотр info структура, возвращенная последним вызовом в read функция.

info
info = struct with fields:
             SampleRate: 8192
       TimeVariableName: "Fs"
    SignalVariableNames: "y"
               FileName: "/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/matlab/audiovideo/train.mat"

Создайте сигнальный datastore, чтобы выполнить итерацию через элементы массива ячеек в памяти данных о сигнале. Данные состоят из синусоидально модулированного линейного щебета, вогнутого квадратичного щебета и управляемого напряжением генератора. Дискретизация сигналов осуществляется на частоте 3000 Гц.

fs = 3000;
t = 0:1/fs:3-1/fs;
data = {chirp(t,300,t(end),800).*exp(2j*pi*10*cos(2*pi*2*t)); ...
        2*chirp(t,200,t(end),1000,'quadratic',[],'concave'); ...
        vco(sin(2*pi*t),[0.1 0.4]*fs,fs)};
sds = signalDatastore(data,'SampleRate',fs);

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

plotID = 1;
while hasdata(sds)
    [dataOut,info] = read(sds);
    subplot(3,1,plotID)
    stft(dataOut,info.SampleRate)
    plotID = plotID + 1;
end

Figure contains 3 axes. Axes 1 with title Short-Time Fourier Transform contains an object of type image. Axes 2 with title Short-Time Fourier Transform contains an object of type image. Axes 3 with title Short-Time Fourier Transform contains an object of type image.

Укажите путь к четырем сигналам, включенным в 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™. Каждый файл содержит щебет и случайную частоту дискретизации, fs, в диапазоне от 100 до 150 Гц. Создайте сигнальный datastore, который указывает на указанную папку.

folder = fullfile(matlabroot,'examples','signal','data','sample_chirps', ...
    ["chirp_1.mat","chirp_4.mat","chirp_9.mat","chirp_10.mat"]);
sds = signalDatastore(folder,'SampleRateVariableName','fs');

Задайте функцию, которая принимает выходы read функция и вычисляет и возвращает:

  • Спектрограммы щебета.

  • Вектор моментов времени, соответствующих центрам оконных сегментов.

  • Частоты, соответствующие оценкам.

function [dataOut,infoOut] = extractSpectrogram(dataIn,info)
    [dataOut,F,T] = pspectrum(dataIn,info.SampleRate,'spectrogram',...
                              'TimeResolution',0.25,...
                              'OverlapPercent',40,'Leakage',0.8);
    infoOut = info;
    infoOut.CenterFrequencies = F;
    infoOut.TimeInstants = T;
end

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

sdsNew = transform(sds,@extractSpectrogram,'IncludeInfo',true);

В то время как преобразованный datastore имеет непрочитанные файлы, прочитайте из нового datastore и визуализируйте спектрограммы в 3-мерном пространстве.

t = tiledlayout('flow');
while hasdata(sdsNew)
    nexttile
    [sig,infoOut] = read(sdsNew);
    waterfall(infoOut.TimeInstants,infoOut.CenterFrequencies,sig)
    xlabel('Frequency (Hz)')
    ylabel('Time (S)')
    view([30 70])
end

Figure contains 4 axes. Axes 1 contains an object of type patch. Axes 2 contains an object of type patch. Axes 3 contains an object of type patch. Axes 4 contains an object of type patch.

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

folder = fullfile(matlabroot,'toolbox','matlab','audiovideo');
sds = signalDatastore(folder,'SampleRateVariableName','Fs');

Получите количество разделов по умолчанию для сигнального datastore.

n = numpartitions(sds)
n = 7

Разделите datastore на количество разделов по умолчанию и верните datastore, соответствующий четвертому разделу.

subsds = partition(sds,n,4);

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

fName = extractAfter(subsds.Files,'audiovideo\')
fName = 1x1 cell array
    {0x0 char}

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

while hasdata(subsds)
    [data,info] = read(subsds);
    fs = info.SampleRate;
    f_res = 0.5*fs;
    ts = (0:length(data)-1)/fs;
    data_res = resample(data,1,2);
    t_res = (0:length(data_res)-1)/f_res;
    plot(ts,data,t_res,data_res,':')
    xlabel('Time (s)')
    ylabel('Signal')
    legend('Original','Resampled','Location','NorthWest')
end

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original, Resampled.

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

свернуть все

Сигнальный datastore, заданный как signalDatastore объект.

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

свернуть все

Данные сигнала, возвращенные как массив. По умолчанию вызов read один раз возвращает первую переменную одного файла за раз. Если вы задаете свойство ReadSize n, таким образом, что n > 1, каждый раз, когда вы вызываете read function, функция гласит:

  • Первая переменная первых файлов n, если sds содержит данные файла.

  • Первые < reservedrangesplaceholder1 > представители, если sds содержит данные в памяти.

Примечание

Чтобы определить имя первой переменной в файле, read выполните следующие шаги:

  • Для MAT-файлов:

    s = load(fileName);
    varNames = fieldnames(s);
    firstVar = s.(varNames{1});

  • Для файлов CSV:

    opts = detectImportOptions(fileName,'PreserveVariableNames',true);
    varNames = opts.VariableNames;
    firstVar = string(varNames{1});

Если на SignalVariableNames свойство datastore содержит более одного имени сигнала, затем sig - массив ячеек. Используйте ReadOutputOrientation свойство datastore для управления ориентацией sig как массив столбцов или как массив строк.

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

  • При файле данных info содержит информацию о времени (если задано), именах файлов и именах переменных, используемых для чтения сигнала и временных данных, если эта информация была указана в signalDatastore.

  • Если datastore содержит данные в памяти, info содержит информацию о времени (если задано) и именах представителей.

Введенный в R2020a