В этом примере показано, как выполнить диагностику неисправности подшипника элемента качения на основе сигналов ускорения, особенно при наличии сильных маскирующих сигналов от других компонентов машины. В примере показано, как применять анализ спектра огибающей и спектральный куртоз для диагностики неисправностей подшипников, и он способен масштабироваться до приложений больших данных.
Обзор проблемы
Локализованные дефекты в подшипнике элемента качения могут возникать во внешнем кольце, внутреннем кольце, обойме или элементе качения. Высокочастотные резонансы между подшипником и датчиком отклика возбуждаются, когда элементы качения поражают локальное замыкание на наружное или внутреннее кольцо, или повреждение элемента качения поражает внешнее или внутреннее кольцо [1]. На следующем рисунке показан элемент качения, поражающий локальную неисправность внутреннего кольца. Проблема заключается в том, как обнаружить и идентифицировать различные типы неисправностей.

Данные MFPT Challenge [4] содержат 23 набора данных, собранных с машин при различных условиях отказа. Первые 20 наборов данных собраны с установки для испытания подшипников, 3 в хороших условиях, 3 с разломами наружного кольца при постоянной нагрузке, 7 с разломами наружного кольца при различных нагрузках и 7 с разломами внутреннего кольца при различных нагрузках. Остальные 3 набора данных получены от реальных машин: подшипник масляного насоса, подшипник промежуточной скорости и планетарный подшипник. Местоположения отказов неизвестны. В этом примере используются только данные, собранные с испытательной установки с известными условиями.
Каждый набор данных содержит сигнал ускорения «gs», частоту дискретизации «sr», скорость «частоты вращения вала», «вес нагрузки» и четыре критические частоты, представляющие различные места возникновения отказов: BPFO, BPFI, FTF и BSF. Вот формулы для этих критических частот [1].
Частота Ballpass, наружное кольцо (BPFO)
1-dDcosϕ)
Частота Ballpass, внутренняя гонка (BPFI)
dDcosstart)
Основная частота поезда (FTF), также известная как скорость клетки
1-dDcosϕ)
Частота вращения шарика (ролика)
dDcosstart) 2]
Как показано на чертеже, - диаметр шарика, - диаметр шага. Переменный - скорость шахты, - число катящихся элементов, - угол контакта отношения [1].
В наборе данных MFPT скорость вала является постоянной, поэтому нет необходимости выполнять отслеживание заказа в качестве этапа предварительной обработки для устранения влияния изменений скорости вала.
Когда элементы качения ударяют по локальным разломам на внешнем или внутреннем кольце или когда разломы на элементе качения ударяют по внешнему или внутреннему кольцу, удар будет модулировать соответствующие критические частоты, например BPFO, BPFI, FTF, BSF. Следовательно, сигнал огибающей, полученный амплитудной демодуляцией, передает больше диагностической информации, которая недоступна из спектрального анализа исходного сигнала. Возьмем в качестве примера сигнал отказа внутренней расы в наборе данных MFPT.
dataInner = load(fullfile(matlabroot, 'toolbox', 'predmaint', ... 'predmaintdemos', 'bearingFaultDiagnosis', ... 'train_data', 'InnerRaceFault_vload_1.mat'));
Визуализация необработанных данных об отказах внутренней расы во временной области.
xInner = dataInner.bearing.gs; fsInner = dataInner.bearing.sr; tInner = (0:length(xInner)-1)/fsInner; figure plot(tInner, xInner) xlabel('Time, (s)') ylabel('Acceleration (g)') title('Raw Signal: Inner Race Fault') xlim([0 0.1])

Визуализация необработанных данных в частотной области.
figure [pInner, fpInner] = pspectrum(xInner, fsInner); pInner = 10*log10(pInner); plot(fpInner, pInner) xlabel('Frequency (Hz)') ylabel('Power Spectrum (dB)') title('Raw Signal: Inner Race Fault') legend('Power Spectrum')

Теперь увеличьте спектр мощности необработанного сигнала в низкочастотном диапазоне, чтобы более внимательно рассмотреть частотную характеристику в BPFI и его первые несколько гармоник.
figure plot(fpInner, pInner) ncomb = 10; helperPlotCombs(ncomb, dataInner.BPFI) xlabel('Frequency (Hz)') ylabel('Power Spectrum (dB)') title('Raw Signal: Inner Race Fault') legend('Power Spectrum', 'BPFI Harmonics') xlim([0 1000])

Четкий рисунок не виден в BPFI и его гармониках. Частотный анализ необработанного сигнала не дает полезной диагностической информации.
При рассмотрении данных временной области наблюдается, что амплитуда исходного сигнала модулируется на определенной частоте, а основная частота модуляции составляет около 1/0,009 Гц 111 Гц. Известно, что частота наезда элемента качения на локальный отказ во внутреннем кольце, то есть BPFI, составляет 118,875 Гц. Это указывает на то, что подшипник потенциально имеет неисправность внутреннего кольца.
figure subplot(2, 1, 1) plot(tInner, xInner) xlim([0.04 0.06]) title('Raw Signal: Inner Race Fault') ylabel('Acceleration (g)') annotation('doublearrow', [0.37 0.71], [0.8 0.8]) text(0.047, 20, ['0.009 sec \approx 1/BPFI, BPFI = ' num2str(dataInner.BPFI)])
Чтобы извлечь модулированную амплитуду, вычислите огибающую необработанного сигнала и визуализируйте его на нижней части графика.
subplot(2, 1, 2) [pEnvInner, fEnvInner, xEnvInner, tEnvInner] = envspectrum(xInner, fsInner); plot(tEnvInner, xEnvInner) xlim([0.04 0.06]) xlabel('Time (s)') ylabel('Acceleration (g)') title('Envelope signal')

Теперь вычислите спектр мощности огибающего сигнала и посмотрите на частотный отклик в BPFI и его гармоники.
figure plot(fEnvInner, pEnvInner) xlim([0 1000]) ncomb = 10; helperPlotCombs(ncomb, dataInner.BPFI) xlabel('Frequency (Hz)') ylabel('Peak Amplitude') title('Envelope Spectrum: Inner Race Fault') legend('Envelope Spectrum', 'BPFI Harmonics')

Показано, что большая часть энергии сосредоточена на BPFI и его гармониках. Это указывает на отказ внутренней цепи подшипника, который соответствует типу отказа данных.
Теперь повторите один и тот же анализ огибающей спектра для нормальных данных и данных об отказах внешнего контура.
dataNormal = load(fullfile(matlabroot, 'toolbox', 'predmaint', ... 'predmaintdemos', 'bearingFaultDiagnosis', ... 'train_data', 'baseline_1.mat')); xNormal = dataNormal.bearing.gs; fsNormal = dataNormal.bearing.sr; tNormal = (0:length(xNormal)-1)/fsNormal; [pEnvNormal, fEnvNormal] = envspectrum(xNormal, fsNormal); figure plot(fEnvNormal, pEnvNormal) ncomb = 10; helperPlotCombs(ncomb, [dataNormal.BPFO dataNormal.BPFI]) xlim([0 1000]) xlabel('Frequency (Hz)') ylabel('Peak Amplitude') title('Envelope Spectrum: Normal') legend('Envelope Spectrum', 'BPFO Harmonics', 'BPFI Harmonics')

Как и ожидалось, спектр огибающей нормального несущего сигнала не показывает каких-либо значительных пиков в BPFO или BPFI.
dataOuter = load(fullfile(matlabroot, 'toolbox', 'predmaint', ... 'predmaintdemos', 'bearingFaultDiagnosis', ... 'train_data', 'OuterRaceFault_2.mat')); xOuter = dataOuter.bearing.gs; fsOuter = dataOuter.bearing.sr; tOuter = (0:length(xOuter)-1)/fsOuter; [pEnvOuter, fEnvOuter, xEnvOuter, tEnvOuter] = envspectrum(xOuter, fsOuter); figure plot(fEnvOuter, pEnvOuter) ncomb = 10; helperPlotCombs(ncomb, dataOuter.BPFO) xlim([0 1000]) xlabel('Frequency (Hz)') ylabel('Peak Amplitude') title('Envelope Spectrum: Outer Race Fault') legend('Envelope Spectrum', 'BPFO Harmonics')

Для сигнала отказа внешней гонки также отсутствуют четкие пики на гармониках BPFO. Не позволяет ли анализ огибающей спектра отличить подшипник с неисправностью внешнего кольца от здоровых подшипников? Давайте сделаем шаг назад и снова посмотрим на сигналы во временной области при различных условиях.
Сначала давайте снова визуализируем сигналы во временной области и рассчитаем их куртоз. Куртоз - четвёртый стандартизированный момент случайной величины. Он характеризует импульсивность сигнала или тяжесть хвоста случайной величины.
figure subplot(3, 1, 1) kurtInner = kurtosis(xInner); plot(tInner, xInner) ylabel('Acceleration (g)') title(['Inner Race Fault, kurtosis = ' num2str(kurtInner)]) xlim([0 0.1]) subplot(3, 1, 2) kurtNormal = kurtosis(xNormal); plot(tNormal, xNormal) ylabel('Acceleration (g)') title(['Normal, kurtosis = ' num2str(kurtNormal)]) xlim([0 0.1]) subplot(3, 1, 3) kurtOuter = kurtosis(xOuter); plot(tOuter, xOuter) xlabel('Time (s)') ylabel('Acceleration (g)') title(['Outer Race Fault, kurtosis = ' num2str(kurtOuter)]) xlim([0 0.1])

Показано, что сигнал отказа внутренней расы имеет значительно большую импульсную способность, благодаря чему анализ спектра огибающей эффективно фиксирует сигнатуру отказа в BPFI. Для сигнала отказа внешней гонки амплитудная модуляция в BPFO слегка заметна, но она маскируется сильным шумом. Нормальный сигнал не показывает никакой амплитудной модуляции. Выделение импульсного сигнала с амплитудной модуляцией в BPFO (или усиление отношения сигнал/шум) является ключевым этапом предварительной обработки перед анализом огибающей спектра. В следующем разделе будут введены куртограмма и спектральный куртоз для выделения сигнала с наивысшим куртозом и для отфильтрованного сигнала будет выполнен анализ огибающей спектра.
Куртограмма и спектральный куртоз вычисляют куртоз локально в частотных диапазонах. Они представляют собой мощные инструменты для определения диапазона частот с наивысшим куртозом (или наивысшим отношением сигнал/шум) [2]. После определения полосы частот с наивысшим куртозом к исходному сигналу может быть применен полосовой фильтр для получения более импульсного сигнала для анализа спектра огибающей.
level = 9; figure kurtogram(xOuter, fsOuter, level)

Куртограмма показывает, что полоса частот, центрированная на 2,67 кГц с шириной полосы 0,763 кГц, имеет наивысший куртоз 2,71.
Теперь используйте оптимальную длину окна, предложенную куртограммой, для вычисления спектрального куртоза.
figure wc = 128; pkurtosis(xOuter, fsOuter, wc)

Чтобы визуализировать полосу частот на спектрограмме, вычислите спектрограмму и поместите спектральный куртоз сбоку. Для интерпретации спектрального куртоза другим способом высокие значения спектрального куртоза указывают на высокую дисперсию мощности на соответствующей частоте, что делает спектральный куртоз полезным инструментом для нахождения нестационарных составляющих сигнала [3].
helperSpectrogramAndSpectralKurtosis(xOuter, fsOuter, level)

Посредством полосовой фильтрации сигнала с предлагаемыми центральной частотой и полосой пропускания может быть усилен куртоз и может быть извлечена модулированная амплитуда отказа внешнего кольца.
[~, ~, ~, fc, ~, BW] = kurtogram(xOuter, fsOuter, level); bpf = designfilt('bandpassfir', 'FilterOrder', 200, 'CutoffFrequency1', fc-BW/2, ... 'CutoffFrequency2', fc+BW/2, 'SampleRate', fsOuter); xOuterBpf = filter(bpf, xOuter); [pEnvOuterBpf, fEnvOuterBpf, xEnvOuterBpf, tEnvBpfOuter] = envspectrum(xOuter, fsOuter, ... 'FilterOrder', 200, 'Band', [fc-BW/2 fc+BW/2]); figure subplot(2, 1, 1) plot(tOuter, xOuter, tEnvOuter, xEnvOuter) ylabel('Acceleration (g)') title(['Raw Signal: Outer Race Fault, kurtosis = ', num2str(kurtOuter)]) xlim([0 0.1]) legend('Signal', 'Envelope') subplot(2, 1, 2) kurtOuterBpf = kurtosis(xOuterBpf); plot(tOuter, xOuterBpf, tEnvBpfOuter, xEnvOuterBpf) ylabel('Acceleration (g)') xlim([0 0.1]) xlabel('Time (s)') title(['Bandpass Filtered Signal: Outer Race Fault, kurtosis = ', num2str(kurtOuterBpf)]) legend('Signal', 'Envelope')

Можно видеть, что значение куртоза увеличивается после полосовой фильтрации. Теперь визуализируйте сигнал огибающей в частотной области.
figure plot(fEnvOuterBpf, pEnvOuterBpf); ncomb = 10; helperPlotCombs(ncomb, dataOuter.BPFO) xlim([0 1000]) xlabel('Frequency (Hz)') ylabel('Peak Amplitude') title('Envelope Spectrum of Bandpass Filtered Signal: Outer Race Fault ') legend('Envelope Spectrum', 'BPFO Harmonics')

Показано, что посредством полосовой фильтрации необработанного сигнала с диапазоном частот, предложенным куртограммой и спектральным куртозом, анализ спектра огибающей способен выявить сигнатуру неисправности в BPFO и ее гармоники.
Теперь применим алгоритм к пакету обучающих данных, используя хранилище данных файлового ансамбля.
На панели инструментов доступна ограниченная часть набора данных. Скопируйте набор данных в текущую папку и включите разрешение на запись:
copyfile(... fullfile(matlabroot, 'toolbox', 'predmaint', 'predmaintdemos', ... 'bearingFaultDiagnosis'), ... 'RollingElementBearingFaultDiagnosis-Data-master') fileattrib(fullfile('RollingElementBearingFaultDiagnosis-Data-master', 'train_data', '*.mat'), '+w') fileattrib(fullfile('RollingElementBearingFaultDiagnosis-Data-master', 'test_data', '*.mat'), '+w')
Для полного набора данных перейдите по этой ссылке https://github.com/mathworks/RollingElementBearingFaultDiagnosis-Data, чтобы загрузить весь репозиторий в виде zip-файла и сохранить его в том же каталоге, что и сценарий. Распакуйте файл с помощью следующей команды:
if exist('RollingElementBearingFaultDiagnosis-Data-master.zip', 'file') unzip('RollingElementBearingFaultDiagnosis-Data-master.zip') end
Результаты в этом примере генерируются из полного набора данных. Полный набор данных содержит обучающий набор данных с 14 файлами мата (2 нормальные, 4 ошибки внутренней гонки, 7 ошибок внешней гонки) и тестовый набор данных с 6 файлами мата (1 нормальная, 2 ошибки внутренней гонки, 3 ошибки внешней гонки).
Путем назначения дескрипторов функций ReadFcn и WriteToMemberFcnхранилище данных ансамбля файлов сможет перемещаться в файлы для извлечения данных в требуемом формате. Например, данные MFPT имеют структуру bearing который сохраняет вибросигнал gs, частота отбора проб srи так далее. Вместо возврата самой несущей конструкции readMFPTBearing функция записывается таким образом, что хранилище данных ансамбля файлов возвращает сигнал вибрации gs внутри bearing структура данных.
fileLocation = fullfile('.', 'RollingElementBearingFaultDiagnosis-Data-master', 'train_data'); fileExtension = '.mat'; ensembleTrain = fileEnsembleDatastore(fileLocation, fileExtension); ensembleTrain.ReadFcn = @readMFPTBearing; ensembleTrain.DataVariables = ["gs", "sr", "rate", "load", "BPFO", "BPFI", "FTF", "BSF"]; ensembleTrain.ConditionVariables = ["Label", "FileName"]; ensembleTrain.WriteToMemberFcn = @writeMFPTBearing; ensembleTrain.SelectedVariables = ["gs", "sr", "rate", "load", "BPFO", "BPFI", "FTF", "BSF", "Label", "FileName"]
ensembleTrain =
fileEnsembleDatastore with properties:
ReadFcn: @readMFPTBearing
WriteToMemberFcn: @writeMFPTBearing
DataVariables: [8×1 string]
IndependentVariables: [0×0 string]
ConditionVariables: [2×1 string]
SelectedVariables: [10×1 string]
ReadSize: 1
NumMembers: 14
LastMemberRead: [0×0 string]
Files: [14×1 string]
ensembleTrainTable = tall(ensembleTrain)
Starting parallel pool (parpool) using the 'local' profile ...
connected to 6 workers.
ensembleTrainTable =
M×10 tall table
gs sr rate load BPFO BPFI FTF BSF Label FileName
_________________ _____ ____ ____ ______ ______ ______ _____ __________________ ________________________
[146484×1 double] 48828 25 0 81.125 118.88 14.838 63.91 "Inner Race Fault" "InnerRaceFault_vload_1"
[146484×1 double] 48828 25 50 81.125 118.88 14.838 63.91 "Inner Race Fault" "InnerRaceFault_vload_2"
[146484×1 double] 48828 25 100 81.125 118.88 14.838 63.91 "Inner Race Fault" "InnerRaceFault_vload_3"
[146484×1 double] 48828 25 150 81.125 118.88 14.838 63.91 "Inner Race Fault" "InnerRaceFault_vload_4"
[146484×1 double] 48828 25 200 81.125 118.88 14.838 63.91 "Inner Race Fault" "InnerRaceFault_vload_5"
[585936×1 double] 97656 25 270 81.125 118.88 14.838 63.91 "Outer Race Fault" "OuterRaceFault_1"
[585936×1 double] 97656 25 270 81.125 118.88 14.838 63.91 "Outer Race Fault" "OuterRaceFault_2"
[146484×1 double] 48828 25 25 81.125 118.88 14.838 63.91 "Outer Race Fault" "OuterRaceFault_vload_1"
: : : : : : : : : :
: : : : : : : : : :
Из последнего раздела анализа следует, что амплитуды спектра огибающей с полосовой фильтрацией в BPFO и BPFI являются двумя индикаторами состояния для диагностики неисправности подшипника. Поэтому следующим шагом является извлечение двух индикаторов условий из всех данных обучения. Чтобы сделать алгоритм более надежным, установите узкую полосу (полоса пропускания = , где - частотное разрешение спектра мощности) вокруг BPFO и BPFI, а затем найдите максимальную амплитуду внутри этой узкой полосы. Алгоритм содержится в bearingFeatureExtraction функции, перечисленные ниже. Следует отметить, что амплитуды спектра огибающей вокруг BPFI и BPFO в остальном примере называются «BPFIAmplitude» и «BPFOAmplitude».
% To process the data in parallel, use the following code % ppool = gcp; % n = numpartitions(ensembleTrain, ppool); % parfor ct = 1:n % subEnsembleTrain = partition(ensembleTrain, n, ct); % reset(subEnsembleTrain); % while hasdata(subEnsembleTrain) % bearingFeatureExtraction(subEnsembleTrain); % end % end ensembleTrain.DataVariables = [ensembleTrain.DataVariables; "BPFIAmplitude"; "BPFOAmplitude"]; reset(ensembleTrain) while hasdata(ensembleTrain) bearingFeatureExtraction(ensembleTrain) end
После добавления новых индикаторов условий в хранилище данных ансамбля файлов укажите SelectedVariables для считывания соответствующих данных из хранилища данных ансамбля файлов и создания таблицы элементов, содержащей извлеченные индикаторы условий.
ensembleTrain.SelectedVariables = ["BPFIAmplitude", "BPFOAmplitude", "Label"]; featureTableTrain = tall(ensembleTrain); featureTableTrain = gather(featureTableTrain);
Evaluating tall expression using the Parallel Pool 'local': - Pass 1 of 1: 0% complete Evaluation 0% complete

- Pass 1 of 1: Completed in 3 sec Evaluation completed in 3 sec
featureTableTrain
featureTableTrain=14×3 table
BPFIAmplitude BPFOAmplitude Label
_____________ _____________ __________________
0.33918 0.082296 "Inner Race Fault"
0.31488 0.026599 "Inner Race Fault"
0.52356 0.036609 "Inner Race Fault"
0.52899 0.028381 "Inner Race Fault"
0.13515 0.012337 "Inner Race Fault"
0.004024 0.03574 "Outer Race Fault"
0.0044918 0.1835 "Outer Race Fault"
0.0074993 0.30166 "Outer Race Fault"
0.013662 0.12468 "Outer Race Fault"
0.0070963 0.28215 "Outer Race Fault"
0.0060772 0.35241 "Outer Race Fault"
0.011244 0.17975 "Outer Race Fault"
0.0036798 0.0050208 "Normal"
0.00359 0.0069449 "Normal"
Визуализация созданной таблицы элементов.
figure gscatter(featureTableTrain.BPFIAmplitude, featureTableTrain.BPFOAmplitude, featureTableTrain.Label, [], 'ox+') xlabel('BPFI Amplitude') ylabel('BPFO Amplitude')

Относительные значения амплитуды BPFI и амплитуды BPFO могут быть эффективным индикатором различных типов отказов. Здесь создается новая функция, которая представляет собой логарифмическое отношение двух существующих функций и визуализируется в гистограмме, сгруппированной по различным типам отказов.
featureTableTrain.IOLogRatio = log(featureTableTrain.BPFIAmplitude./featureTableTrain.BPFOAmplitude); figure hold on histogram(featureTableTrain.IOLogRatio(featureTableTrain.Label=="Inner Race Fault"), 'BinWidth', 0.5) histogram(featureTableTrain.IOLogRatio(featureTableTrain.Label=="Outer Race Fault"), 'BinWidth', 0.5) histogram(featureTableTrain.IOLogRatio(featureTableTrain.Label=="Normal"), 'BinWidth', 0.5) plot([-1.5 -1.5 NaN 0.5 0.5], [0 3 NaN 0 3], 'k--') hold off ylabel('Count') xlabel('log(BPFIAmplitude/BPFOAmplitude)') legend('Inner Race Fault', 'Outer Race Fault', 'Normal', 'Classification Boundary')

Гистограмма показывает четкое разделение между тремя различными условиями подшипника. Логарифмическое отношение между амплитудами BPFI и BPFO является допустимой функцией для классификации неисправностей подшипников. Чтобы упростить пример, очень простой классификатор получен: если -1.5, у отношения есть внешняя ошибка гонки; ≤0.5, отношение нормально; и (BPFIAmplitudeBPFOAmplitude)> 0.5, у отношения есть внутренняя ошибка гонки.
Теперь применим рабочий процесс к набору тестовых данных и проверим классификатор, полученный в последнем разделе. Здесь тестовые данные содержат 1 набор нормальных данных, 2 набора данных о неисправностях внутренней гонки и 3 набора данных о неисправностях внешней гонки.
fileLocation = fullfile('.', 'RollingElementBearingFaultDiagnosis-Data-master', 'test_data'); fileExtension = '.mat'; ensembleTest = fileEnsembleDatastore(fileLocation, fileExtension); ensembleTest.ReadFcn = @readMFPTBearing; ensembleTest.DataVariables = ["gs", "sr", "rate", "load", "BPFO", "BPFI", "FTF", "BSF"]; ensembleTest.ConditionVariables = ["Label", "FileName"]; ensembleTest.WriteToMemberFcn = @writeMFPTBearing; ensembleTest.SelectedVariables = ["gs", "sr", "rate", "load", "BPFO", "BPFI", "FTF", "BSF", "Label", "FileName"]
ensembleTest =
fileEnsembleDatastore with properties:
ReadFcn: @readMFPTBearing
WriteToMemberFcn: @writeMFPTBearing
DataVariables: [8×1 string]
IndependentVariables: [0×0 string]
ConditionVariables: [2×1 string]
SelectedVariables: [10×1 string]
ReadSize: 1
NumMembers: 6
LastMemberRead: [0×0 string]
Files: [6×1 string]
ensembleTest.DataVariables = [ensembleTest.DataVariables; "BPFIAmplitude"; "BPFOAmplitude"]; reset(ensembleTest) while hasdata(ensembleTest) bearingFeatureExtraction(ensembleTest) end
ensembleTest.SelectedVariables = ["BPFIAmplitude", "BPFOAmplitude", "Label"]; featureTableTest = tall(ensembleTest); featureTableTest = gather(featureTableTest);
Evaluating tall expression using the Parallel Pool 'local': - Pass 1 of 1: Completed in 1 sec Evaluation completed in 1 sec
featureTableTest.IOLogRatio = log(featureTableTest.BPFIAmplitude./featureTableTest.BPFOAmplitude); figure hold on histogram(featureTableTrain.IOLogRatio(featureTableTrain.Label=="Inner Race Fault"), 'BinWidth', 0.5) histogram(featureTableTrain.IOLogRatio(featureTableTrain.Label=="Outer Race Fault"), 'BinWidth', 0.5) histogram(featureTableTrain.IOLogRatio(featureTableTrain.Label=="Normal"), 'BinWidth', 0.5) histogram(featureTableTest.IOLogRatio(featureTableTest.Label=="Inner Race Fault"), 'BinWidth', 0.1) histogram(featureTableTest.IOLogRatio(featureTableTest.Label=="Outer Race Fault"), 'BinWidth', 0.1) histogram(featureTableTest.IOLogRatio(featureTableTest.Label=="Normal"), 'BinWidth', 0.1) plot([-1.5 -1.5 NaN 0.5 0.5], [0 3 NaN 0 3], 'k--') hold off ylabel('Count') xlabel('log(BPFIAmplitude/BPFOAmplitude)') legend('Inner Race Fault - Train', 'Outer Race Fault - Train', 'Normal - Train', ... 'Inner Race Fault - Test', 'Outer Race Fault - Test', 'Normal - Test', ... 'Classification Boundary')

Логарифмическое отношение амплитуд BPFI и BPFO из наборов тестовых данных показывает согласованное распределение с логарифмическим отношением из наборов обучающих данных. Наивный классификатор, полученный в последнем разделе, достиг совершенной точности в наборе тестовых данных.
Следует отметить, что одной особенности обычно недостаточно для получения классификатора, который хорошо обобщается. Более сложные классификаторы могут быть получены путем разделения данных на несколько частей (для создания большего количества точек данных), извлечения нескольких диагностических функций, выбора подмножества функций по рангам важности и обучения различных классификаторов с помощью приложения Classification Learner App in Statistics & Machine Learning Toolbox. Дополнительные сведения об этом рабочем процессе см. в примере «Использование Simulink для генерации данных об отказах».
В этом примере показано, как использовать куртограмму, спектральный куртоз и спектр огибающей для выявления различных типов неисправностей в подшипниках элементов качения. Затем алгоритм применяется к пакету наборов данных на диске, что помогает показать, что амплитуды полосового отфильтрованного огибающего спектра в BPFI и BPFO являются двумя важными индикаторами состояния для диагностики подшипников.
[1] Рэндалл, Роберт Б. и Джером Антони. «Диагностика подшипников качения - учебное пособие». Механические системы и обработка сигналов. Том 25, номер 2, 2011, стр. 485-520.
[2] Антони, Жером. «Быстрое вычисление куртограммы для обнаружения переходных неисправностей». Механические системы и обработка сигналов. Том 21, номер 1, 2007, стр. 108-124.
[3] Антони, Жером. «Спектральный куртоз: полезный инструмент для характеристики нестационарных сигналов». Механические системы и обработка сигналов. Том 20, номер 2, 2006, стр. 282-307.
[4] Беххёфер, Эрик. «База данных отказов технического обслуживания на основе состояния для тестирования диагностических и прогностических алгоритмов». 2013. https://mfpt.org/fault-data-sets/
function bearingFeatureExtraction(ensemble) % Extract condition indicators from bearing data data = read(ensemble); x = data.gs{1}; fs = data.sr; % Critical Frequencies BPFO = data.BPFO; BPFI = data.BPFI; level = 9; [~, ~, ~, fc, ~, BW] = kurtogram(x, fs, level); % Bandpass filtered Envelope Spectrum [pEnvpBpf, fEnvBpf] = envspectrum(x, fs, 'FilterOrder', 200, 'Band', [max([fc-BW/2 0]) min([fc+BW/2 0.999*fs/2])]); deltaf = fEnvBpf(2) - fEnvBpf(1); BPFIAmplitude = max(pEnvpBpf((fEnvBpf > (BPFI-5*deltaf)) & (fEnvBpf < (BPFI+5*deltaf)))); BPFOAmplitude = max(pEnvpBpf((fEnvBpf > (BPFO-5*deltaf)) & (fEnvBpf < (BPFO+5*deltaf)))); writeToLastMemberRead(ensemble, table(BPFIAmplitude, BPFOAmplitude, 'VariableNames', {'BPFIAmplitude', 'BPFOAmplitude'})); end