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