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/BR2020bd/build/matlab/toolbox/matlab/audiovideo/train.mat"

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

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 имеет данные, считайте каждое наблюдение из datastore сигнала и постройте кратковременное преобразование Фурье.

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

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

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

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

свернуть все

Datastore сигнала в виде signalDatastore объект.

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

свернуть все

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

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

  • Первые члены n, если 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});

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

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

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

Введенный в R2020a