Считайте затем последовательное наблюдение сигнала
Задайте путь к демонстрационным сигналам, включенным с Signal Processing Toolbox™.
folder = fullfile(matlabroot,'toolbox','matlab','audiovideo');
Создайте datastore сигнала, который указывает на заданную папку и имя переменной частоты дискретизации набора к Fs
. Перечислите имена MAT-файлов в datastore. Используйте extractAfter
функционируйте, чтобы извлечь имена из полного пути.
sds = signalDatastore(folder,'FileExtension','.mat','SampleRateVariableName','Fs'); c = extractAfter(sds.Files,'audiovideo\')
c = 7×1 cell
{'chirp.mat' }
{'gong.mat' }
{'handel.mat' }
{'laughter.mat'}
{'mtlb.mat' }
{'splat.mat' }
{'train.mat' }
В то время как 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: "B:\21\ubhattac.techreview.0111\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 = 1×1 cell array
{'laughter.mat'}
Считайте данные и информацию о сигнале в datastore, соответствующем четвертому разделу. Извлеките частоту дискретизации из struct 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
— Datastore сигналаsignalDatastore
объектDatastore сигнала в виде signalDatastore
объект.
sig
— Данные сигналаДанные сигнала, возвращенные как массив. По умолчанию, вызов read
однажды возвращает первую переменную одного файла за один раз. Если вы устанавливаете свойство ReadSize на n, такой, что n> 1, каждый раз вы вызываете read
функция, функциональные чтения:
Первая переменная первых файлов n, если sds
содержит данные о файле.
Первые члены n, если sds
содержит данные в оперативной памяти.
info
— Информация о данных сигналаИнформация о данных сигнала, возвращенных как struct.
В случае данных о файле, info
содержит информацию времени (если задано), имена файлов, и имена переменных раньше читали сигнал и данные времени, если эта информация была указана в signalDatastore
.
Если datastore содержит данные в оперативной памяти, info
содержит информацию времени (если задано) и имена элемента.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.