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

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

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

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

sds - Хранилище данных сигналаsignalDatastore объектХранилище данных сигнала, указанное как signalDatastore объект.
sig - Сигнальные данныеДанные сигнала, возвращаемые в виде массива. По умолчанию вызов 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 - Информация о сигналахИнформация о данных сигнала, возвращаемая в виде структуры.
В случае данных файла info содержит информацию о времени (если указано), имена файлов и имена переменных, используемые для считывания данных о сигнале и времени, если эта информация была указана в signalDatastore.
Если хранилище данных содержит данные в памяти, info содержит информацию о времени (если она указана) и имена членов.
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.