При разработке алгоритмов прогностического обслуживания часто используются большие наборы данных, собираемых при работе системы в различных условиях. fileEnsembleDatastore объект помогает управлять такими данными и взаимодействовать с ними. Для этого примера создайте fileEnsembleDatastore объект, указывающий на сбор данных на диске. Настройте его с помощью функций, которые считывают данные из ансамбля и записывают их в ансамбль.
В этом примере имеются два файла данных, содержащих работоспособные рабочие данные из несущей системы. baseline_01.mat и baseline_02.mat. Вы также имеете три файла данных, содержащих неисправные данные из одной и той же системы, FaultData_01.mat, FaultData_02.mat, и FaultData_03.mat. На практике у вас может быть гораздо больше файлов данных.
Каждый из этих файлов данных содержит одну структуру данных, bearing. Загрузите и изучите структуру данных из первого исправного набора данных.
unzip fileEnsData.zip % extract compressed files load baseline_01.mat bearing
bearing = struct with fields:
sr: 97656
gs: [5000x1 double]
load: 270
rate: 25
Структура содержит вектор данных акселерометра gs, частота выборки sr при котором эти данные были записаны, и другие переменные данных.
Для работы с этими данными при разработке алгоритма предиктивного обслуживания сначала создайте хранилище данных ансамбля файлов, указывающее на файлы данных в текущей папке.
fensemble = fileEnsembleDatastore(pwd,'.mat');Перед взаимодействием с данными в ансамбле необходимо создать функции, указывающие программному обеспечению, как обрабатывать файлы данных для считывания переменных в рабочую область MATLAB ® и записи данных обратно в файлы. В этом примере используются следующие функции:
readBearingData - извлечь запрошенные переменные из структуры, bearingи другие переменные, хранящиеся в файле. Эта функция также анализирует имя файла для определения состояния отказа данных. Функция возвращает строку таблицы, содержащую одну переменную таблицы для каждой запрашиваемой переменной.
writeBearingData - Возьмите структуру и запишите ее переменные в файл данных как отдельные сохраненные переменные.
Присвойте эти функции ReadFcn и WriteToMemberFcn свойства хранилища данных ансамбля соответственно.
addpath(fullfile(matlabroot,'examples','predmaint','main')) % Make sure functions are on path fensemble.ReadFcn = @readBearingData; fensemble.WriteToMemberFcn = @writeBearingData;
Наконец, задайте свойства ансамбля для идентификации переменных данных и переменных условий.
fensemble.DataVariables = ["gs";"sr";"load";"rate"]; fensemble.ConditionVariables = ["label";"file"];
Осмотрите ансамбль. Функции и имена переменных назначаются соответствующим свойствам.
fensemble
fensemble =
fileEnsembleDatastore with properties:
ReadFcn: @readBearingData
WriteToMemberFcn: @writeBearingData
DataVariables: [4x1 string]
IndependentVariables: [0x0 string]
ConditionVariables: [2x1 string]
SelectedVariables: [0x0 string]
ReadSize: 1
NumMembers: 5
LastMemberRead: [0x0 string]
Files: [5x1 string]
Присвоенные функции определяют read и writeToLastMemberRead команды взаимодействия с файлами данных, составляющими хранилище данных ансамбля. Таким образом, когда вы вызываете read команда, она использует readBearingData для чтения всех переменных в fensemble.SelectedVariables.
Укажите переменные для чтения и прочтите их от первого участника ансамбля. read считывает данные из первого члена ансамбля в строку таблицы в рабочей области MATLAB. Программа определяет, какой элемент ансамбля следует считать первым.
fensemble.SelectedVariables = ["file";"label";"gs";"sr";"load";"rate"]; data = read(fensemble)
data=1×6 table
label file gs sr load rate
________ ______________ _______________ _____ ____ ____
"Faulty" "FaultData_01" {5000x1 double} 48828 0 25
Предположим, что требуется проанализировать данные акселерометра gs вычислением спектра мощности и последующей записью данных спектра мощности обратно в ансамбль. Для этого сначала извлеките данные из таблицы и вычислите спектр.
gsdata = data.gs{1};
sr = data.sr;
[pdata,fpdata] = pspectrum(gsdata,sr);
pdata = 10*log10(pdata); % Convert to dBМожно записать частотный вектор fpdata и спектр мощности pdata в файл данных в виде отдельных переменных. Сначала добавьте новые переменные в список переменных данных в хранилище данных ансамбля.
fensemble.DataVariables = [fensemble.DataVariables;"freq";"spectrum"]; fensemble.DataVariables
ans = 6x1 string
"gs"
"sr"
"load"
"rate"
"freq"
"spectrum"
Затем запишите новые значения в файл, соответствующий последнему читаемому участнику ансамбля. При звонке writeToLastMemberRead, преобразует данные в структуру и вызывает fensemble.WriteToMemberFcn для записи данных в файл.
writeToLastMemberRead(fensemble,'freq',fpdata,'spectrum',pdata);
Можно добавить новую переменную в fensemble.SelectedVariables или другие свойства для идентификации переменных, при необходимости.
Запрос read снова считывает данные из следующего файла в хранилище данных ансамбля и обновляет свойство fensemble.LastMemberRead.
data = read(fensemble)
data=1×6 table
label file gs sr load rate
________ ______________ _______________ _____ ____ ____
"Faulty" "FaultData_02" {5000x1 double} 48828 50 25
Вы можете подтвердить, что эти данные получены от другого члена load переменная в таблице. Здесь его значение равно 50, в то время как в ранее считанном элементе оно было равно 0.
Можно повторить шаги обработки для вычисления и добавления спектра для этого члена ансамбля. На практике более полезно автоматизировать процесс чтения, обработки и записи данных. Для этого следует сбросить хранилище данных ансамбля в состояние, в котором данные не считывались. ( reset операция не изменяется fensemble.DataVariables, который содержит две новые переменные, которые вы уже добавили.) Затем выполните цикл через ансамбль и выполните шаги чтения, обработки и записи для каждого участника.
reset(fensemble) while hasdata(fensemble) data = read(fensemble); gsdata = data.gs{1}; sr = data.sr; [pdata,fpdata] = pspectrum(gsdata,sr); writeToLastMemberRead(fensemble,'freq',fpdata,'spectrum',pdata); end
hasdata возврат команды false когда прочитан каждый участник ансамбля. Теперь каждый файл данных в ансамбле включает в себя spectrum и freq переменные, полученные из данных акселерометра в этом файле. Можно использовать методы, подобные этому циклу, для извлечения и обработки данных из файлов ансамбля при разработке алгоритма предиктивного обслуживания. Пример, более подробно иллюстрирующий использование хранилища данных файлового ансамбля в процессе разработки алгоритмов, см. в разделе Диагностика неисправности подшипника элемента качения. Этот пример также показывает использование Parallel Computing Toolbox™ для ускорения обработки более крупного ансамбля.
Чтобы подтвердить, что производные переменные присутствуют в хранилище данных ансамбля файлов, прочитайте их у первого и второго участников ансамбля. Для этого снова сбросьте ансамбль и добавьте новые переменные к выбранным переменным. На практике после вычисления производных значений может быть полезно считывать только эти значения без повторного чтения необработанных данных, что может занять значительное место в памяти. В этом примере прочитайте выбранные переменные, которые включают новые переменные, но не включают необработанные данные. gs.
reset(fensemble) fensemble.SelectedVariables = ["label","load","freq","spectrum"]; data1 = read(fensemble)
data1=1×4 table
label load freq spectrum
________ ____ _______________ _______________
"Faulty" 0 {4096x1 double} {4096x1 double}
data2 = read(fensemble)
data2=1×4 table
label load freq spectrum
________ ____ _______________ _______________
"Faulty" 50 {4096x1 double} {4096x1 double}
rmpath(fullfile(matlabroot,'examples','predmaint','main')) % Reset path
fileEnsembleDatastore | read | writeToLastMemberRead