exponenta event banner

читать

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

Описание

пример

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

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

Примеры

свернуть все

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

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

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

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

Пока хранилище данных сигнала имеет непрочитанные файлы, считывайте последовательные файлы из хранилища данных. Используйте 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"

Создайте хранилище данных сигнала для итерации через элементы массива ячеек в памяти данных сигнала. Данные состоят из синусоидально модулированного линейного чирпа, вогнутого квадратичного чирпа и генератора, управляемого напряжением. Сигналы дискретизируются при 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);

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

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 ®. Сигналы являются записями птичьего чирпа, гонга, поезда и шлейфа. Все сигналы дискретизируются на частоте 8192 Гц.

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

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

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

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

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

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

sdsCombined = combine(sds1,sds2);

Считывание и отображение исходных данных и верхней и нижней конвертов из объединенного хранилища данных. Используйте 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.

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

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

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

В то время как преобразованное хранилище данных содержит непрочитанные файлы, считывайте из нового хранилища данных и визуализируйте спектрограммы в трехмерном пространстве.

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 ®. Создайте хранилище данных сигнала, указывающее на указанную папку.

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

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

n = numpartitions(sds)
n = 7

Разбиение хранилища данных на разделы по умолчанию и возврат хранилища данных, соответствующего четвертому разделу.

subsds = partition(sds,n,4);

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

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

Считывайте данные и информацию о сигнале в хранилище данных, соответствующем четвертому разделу. Извлечь частоту выборки из 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.

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

свернуть все

Хранилище данных сигнала, указанное как 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});

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

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

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

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

Представлен в R2020a