Esta página es para la versión anterior. La página correspondiente en inglés ha sido eliminada en la versión actual.

Diagnóstico de fallas de rodamientos de elementos rodantes

Este ejemplo muestra cómo realizar el diagnóstico de fallas de un rodamiento de elementos rodantes basadoen en señales de aceleración, especialmente en presencia de señales de enmascaramiento fuertes de otros componentes de la máquina. El ejemplo demostrará cómo aplicar el análisis del espectro de envolvente y la kurtosis espectral para diagnosticar fallas de rodamientos y es capaz de escalar hasta aplicaciones de Big Data.

Descripción general del problema

Las fallas localizadas en un rodamiento de elementos rodantes pueden ocurrir en la raza exterior, la carrera interna, la jaula o un elemento rodante. Las resonancias de alta frecuencia entre el rodamiento y el transductor de respuesta se excitan cuando los elementos rodantes golpean una falla local en la carrera externa o interna, o una falla en un elemento rodante golpea la carrera externa o interna [1]. La siguiente imagen muestra un elemento rodante golpeando una falla local en la carrera interna. El problema es cómo detectar e identificar los diversos tipos de fallas.

Datos de Desafío de la Tecnología de Prevención de Fallos de Maquinaria (MFPT)

Los datos de MFPT Challenge [4] contienen 23 conjuntos de datos recopilados de máquinas en diversas condiciones de avería. Los primeros 20 conjuntos de datos se recopilan de una plataforma de prueba de rodamientos, con 3 en buenas condiciones, 3 con fallas de carrera externas bajo carga constante, 7 con fallas de carrera externas bajo varias cargas, y 7 con fallas de carrera internas bajo varias cargas. Los 3 conjuntos de datos restantes provienen de máquinas del mundo real: un rodamiento de bomba de aceite, un rodamiento de velocidad intermedio y un rodamiento de planetas. Se desconocen las ubicaciones de error. En este ejemplo, solo se utilizan los datos recopilados del equipo de pruebas con condiciones conocidas.

Cada conjunto de datos contiene una señal de aceleración "gs", frecuencia de muestreo "sr", velocidad del eje "velocidad", peso de carga "carga", y cuatro frecuencias críticas que representan diferentes ubicaciones de falla: carrera exterior de frecuencia de paso de bolas (BPFO), carrera interna de frecuencia de paso de bolas (BPFI), frecuencia de tren fundamental (FTF) y frecuencia de giro de bola (BSF). Aquí están las fórmulas para esas frecuencias críticas [1].

  • Frecuencia de pase de bola, carrera externa (BPFO)

<math display="block">
<mrow>
<mi>B</mi>
<mi>P</mi>
<mi>F</mi>
<mi>O</mi>
<mo>=</mo>
<mfrac>
<mrow>
<mi>n</mi>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>r</mi>
</mrow>
</msub>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</mfrac>
<mrow>
<mo>(</mo>
<mn>1</mn>
<mo>-</mo>
<mfrac>
<mrow>
<mi>d</mi>
</mrow>
<mrow>
<mi>D</mi>
</mrow>
</mfrac>
<mi mathvariant="normal">cos</mi>
<mi>ϕ</mi>
<mo>)</mo>
</mrow>
</mrow>
</math>

  • Frecuencia de pase de bola, carrera interna (BPFI)

<math display="block">
<mrow>
<mi>B</mi>
<mi>P</mi>
<mi>F</mi>
<mi>I</mi>
<mo>=</mo>
<mfrac>
<mrow>
<mi>n</mi>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>r</mi>
</mrow>
</msub>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</mfrac>
<mrow>
<mo>(</mo>
<mn>1</mn>
<mo>+</mo>
<mfrac>
<mrow>
<mi>d</mi>
</mrow>
<mrow>
<mi>D</mi>
</mrow>
</mfrac>
<mi mathvariant="normal">cos</mi>
<mi>ϕ</mi>
<mo>)</mo>
</mrow>
</mrow>
</math>

  • Frecuencia de tren fundamental (FTF), también conocida como velocidad de jaula

<math display="block">
<mrow>
<mi>F</mi>
<mi>T</mi>
<mi>F</mi>
<mo>=</mo>
<mfrac>
<mrow>
<msub>
<mrow>
<mi>f</mi>
</mrow>
<mrow>
<mi>r</mi>
</mrow>
</msub>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</mfrac>
<mrow>
<mo>(</mo>
<mn>1</mn>
<mo>-</mo>
<mfrac>
<mrow>
<mi>d</mi>
</mrow>
<mrow>
<mi>D</mi>
</mrow>
</mfrac>
<mi mathvariant="normal">cos</mi>
<mi>ϕ</mi>
<mo>)</mo>
</mrow>
</mrow>
</math>

  • Frecuencia de giro de bola (rodillo)

<math display="block">
<mrow>
<mi>B</mi>
<mi>S</mi>
<mi>F</mi>
<mo>=</mo>
<mfrac>
<mrow>
<mi>D</mi>
</mrow>
<mrow>
<mn>2</mn>
<mi>d</mi>
</mrow>
</mfrac>
<mrow>
<mo>[</mo>
<mn>1</mn>
<mo>-</mo>
<msup>
<mrow>
<mo>(</mo>
<mfrac>
<mrow>
<mi>d</mi>
</mrow>
<mrow>
<mi>D</mi>
</mrow>
</mfrac>
<mi mathvariant="normal">cos</mi>
<mi>ϕ</mi>
<mo>)</mo>
</mrow>
<mrow>
<mn>2</mn>
</mrow>
</msup>
<mo>]</mo>
</mrow>
</mrow>
</math>

Como se muestra en la figura,

<math display="inline">
<mrow>
<mi mathvariant="italic">d</mi>
</mrow>
</math>
es el diámetro de la bola,
<math display="inline">
<mrow>
<mi mathvariant="italic">D</mi>
</mrow>
</math>
es el diámetro del paso. La variable
<math display="inline">
<mrow>
<msub>
<mrow>
<mi mathvariant="italic">f</mi>
</mrow>
<mrow>
<mi mathvariant="italic">r</mi>
</mrow>
</msub>
</mrow>
</math>
es la velocidad del eje,
<math display="inline">
<mrow>
<mi mathvariant="italic">n</mi>
</mrow>
</math>
es el número de elementos rodantes,
<math display="inline">
<mrow>
<mi>ϕ</mi>
</mrow>
</math>
es el ángulo de contacto del rodamiento [1].

Análisis del espectro de envolventes para el diagnóstico de rodamientos

En el conjunto de datos MFPT, la velocidad del eje es constante, por lo tanto, no hay necesidad de realizar el seguimiento de la orden como un paso de preprocesamiento para eliminar el efecto de las variaciones de velocidad del eje.

Cuando los elementos rodantes golpean las fallas locales en las carreras externas o internas, o cuando las fallas en el elemento rodante golpean las carreras externas o internas, el impacto modulará las frecuencias críticas correspondientes, por ejemplo BPFO, BPFI, FTF, BSF. Por lo tanto, la señal de envolvente producida por la demodulación de amplitud transmite más información de diagnóstico que no está disponible a partir del análisis de espectro de la señal bruta. Tome como ejemplo una señal de error de carrera interna en el conjunto de datos MFPT.

dataInner = load(fullfile(matlabroot, 'toolbox', 'predmaint', ...     'predmaintdemos', 'bearingFaultDiagnosis', ...     'train_data', 'InnerRaceFault_vload_1.mat'));

Visualice los datos de error de carrera interna sin procesar en el dominio de tiempo.

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])

Visualice los datos sin procesar en el dominio de frecuencia.

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')

Ahora zoom en el espectro de potencia de la señal bruta en rango de baja frecuencia para echar un vistazo más de cerca a la respuesta de frecuencia en BPFI y sus primeros armónicos.

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])

Ningún patrón claro es visible en BPFI y sus armónicos. El análisis de frecuencia en la señal sin procesar no proporciona información útil del diagnóstico.

Mirando los datos del dominio del tiempo, se observa que la amplitud de la señal bruta se modula a una cierta frecuencia, y la frecuencia principal de la modulación es alrededor de 1/0.009 Hz

<math display="inline">
<mrow>
<mo></mo>
</mrow>
</math>
111 Hz. Se sabe que la frecuencia con la que el elemento rodante golpea una falla local en la carrera interna, es decir, BPFI, es 118.875 Hz. Esto indica que el rodamiento potencialmente tiene una falla de carrera interna.

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)])

Para extraer la amplitud modulada, calcule la envolvente de la señal sin procesar y visualícela en la subtrama inferior.

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')

Ahora calcula el espectro de potencia de la señal de envolvente y echa un vistazo a la respuesta de frecuencia en BPFI y sus armónicos.

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')

Se muestra que la mayor parte de la energía se centra en BPFI y sus armónicos. Esto indica un fallo de carrera interna del rodamiento, que coincide con el tipo de fallo de los datos.

Aplicación del análisis de espectro de envolvente a otros tipos de fallas

Ahora repita el mismo análisis del espectro de envolvente en los datos normales y los datos de fallas de carrera externa.

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')

Como era de esperar, el espectro de envolvente de una señal de rodamiento normal no muestra picos significativos en BPFO o 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')

Para una señal de falla de carrera externa, tampoco hay picos claros en los armónicos BPFO. ¿El análisis del espectro de envolvente no diferencia el rodamiento con la falla de carrera externa de los rodamientos sanos? Vamos a dar un paso atrás y mirar las señales en el dominio del tiempo en diferentes condiciones de nuevo.

Primero vamos a visualizar las señales en el dominio del tiempo de nuevo y calcular su kurtosis. Kurtosis es el cuarto momento estandarizado de una variable aleatoria. Caracteriza la impulsividad de la señal o la pesadez de la cola de la variable aleatoria.

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])

Se muestra que la señal de falla de carrera interna tiene impulsividad significativamente mayor, haciendo que el análisis del espectro de envolvente capture la firma de falla en BPFI con eficacia. Para una señal de falla de carrera externa, la modulación de amplitud en BPFO es ligeramente perceptible, pero está enmascarada por un ruido fuerte. La señal normal no muestra ninguna modulación de amplitud. Extraer la señal impulsiva con modulación de amplitud en BPFO (o mejorar la relación señal-ruido) es un paso clave de preprocesamiento antes del análisis del espectro de envolvente. La siguiente sección introducirá kurtogram a kurtosis espectral para extraer la señal con la máxima kurtosis, y realizar análisis del espectro de envolvente en la señal filtrada.

Kurtograma y Kurtosis Espectral para Selección de Bandas

Kurtograma y kurtosis espectral calculan la kurtosis localmente dentro de las bandas de frecuencia. Son potentes herramientas para localizar la banda de frecuencia que tiene la kurtosis más alta (o la relación señal-ruido más alta) [2]. Después de identificar la banda de frecuencia con la curtosis más alta, se puede aplicar un filtro de paso de banda a la señal sin procesar para obtener una señal más impulsiva para el análisis del espectro de envolvente.

level = 9; figure kurtogram(xOuter, fsOuter, level)

El kurtogramindica que la banda de frecuencia centrada en 2,67 kHz con un ancho de banda de 0,763 kHz tiene la curtosis más alta de 2,71.

Ahora usa la longitud óptima de la ventana sugerida por el kurtogrampara para calcular la curtosis espectral.

figure wc = 128; pkurtosis(xOuter, fsOuter, wc)

Para visualizar la banda de frecuencia en un espectrograma, calcule el espectrograma y coloque la curtosis espectral en el lado. Para interpretar la kurtosis espectral de otra manera, los valores de kurtosis espectral altos indican una alta varianza de potencia a la frecuencia correspondiente, lo que hace que la kurtosis espectral sea una herramienta útil para localizar componentes no estacionarios de la señal [3].

helperSpectrogramAndSpectralKurtosis(xOuter, fsOuter, level)

Por paso de banda filtrando la señal con la frecuencia central sugerida y ancho de banda, la kurtosis se puede mejorar y la amplitud modulada de la falla de carrera externa se puede recuperar.

[~, ~, ~, 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')

Se puede ver que el valor de la kurtosis se incrementa después del filtrado de paso de banda. Ahora visualice la señal de envolvente en el dominio de frecuencia.

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')

Se muestra que por paso de banda filtrando la señal cruda con la banda de frecuencia sugerida por el kurtogramo y la kurtosis espectral, el análisis del espectro de envolvente es capaz de revelar la firma de falla en BPFO y sus armónicos.

Proceso por lotes

Ahora vamos a aplicar el algoritmo a un lote de datos de entrenamiento mediante un almacén de datos de conjunto de archivos.

Una parte limitada del conjunto de datos está disponible en el cuadro de herramientas. Copie el conjunto de datos en la carpeta actual y habilite el permiso de escritura:

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')

Para el conjunto de datos completo, vaya a este enlace para descargar todo el repositorio como un archivo zip y guardarlo en el mismo directorio que el script activo.https://github.com/mathworks/RollingElementBearingFaultDiagnosis-Data Descomprima el archivo utilizando este comando:

if exist('RollingElementBearingFaultDiagnosis-Data-master.zip', 'file')     unzip('RollingElementBearingFaultDiagnosis-Data-master.zip') end

Los resultados de este ejemplo se generan a partir del conjunto de datos completo. El conjunto de datos completo contiene un conjunto de datos de entrenamiento con 14 archivos de estera (2 archivos normales, 4 de carrera interna, 7 fallas de carrera externas) y un conjunto de datos de prueba con 6 archivos de tapete (1 normal, 2 errores de carrera interna, 3 fallas de carrera externas).

Al asignar identificadores de función a y , el almacén de datos del conjunto de archivos podrá navegar a los archivos para recuperar datos en el formato deseado.ReadFcn WriteToMemberFcn Por ejemplo, los datos MFPT tienen una estructura que almacena la señal de vibración, la frecuencia de muestreo, etc.bearinggssr En lugar de devolver la propia estructura de rodamientos, la función se escribe para que el almacén de datos del conjunto de archivos devuelva la señal de vibración dentro de la estructura de datos.readMFPTBearinggsbearing

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"             :              :       :       :        :         :         :         :              :                        :             :              :       :       :        :         :         :         :              :                        : 

En la última sección del análisis, observe que las amplitudes de espectro de envolvente filtrada de paso de banda en BPFO y BPFI son dos indicadores de condición para el diagnóstico de fallas de rodamientos. Por lo tanto, el siguiente paso es extraer los dos indicadores de condición de todos los datos de entrenamiento. Para que el algoritmo sea más robusto, establezca una banda estrecha (ancho de banda )

<math display="inline">
<mrow>
<mn>10</mn>
<mi>Δ</mi>
<mi mathvariant="italic">f</mi>
</mrow>
</math>
Dónde
<math display="inline">
<mrow>
<mi>Δ</mi>
<mi mathvariant="italic">f</mi>
</mrow>
</math>
es la resolución de frecuencia del espectro de potencia) alrededor de BPFO y BPFI, y luego encontrar la amplitud máxima dentro de esta banda estrecha. El algoritmo está contenido en la función que se muestra a continuación.bearingFeatureExtraction Observe que las amplitudes del espectro envolvente alrededor de BPFI y BPFO se conocen como "BPFIAmplitude" y "BPFOAmplitude" en el resto del ejemplo.

% 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

Una vez que se añadan los nuevos indicadores de condición al almacén de datos del conjunto de archivos, especifique para leer los datos relevantes del almacén de datos del conjunto de archivos y cree una tabla de características que contenga los indicadores de condición extraídos.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"          

Visualice la tabla de características que se ha creado.

figure gscatter(featureTableTrain.BPFIAmplitude, featureTableTrain.BPFOAmplitude, featureTableTrain.Label, [], 'ox+') xlabel('BPFI Amplitude') ylabel('BPFO Amplitude')

Los valores relativos de Amplitud BPFI y Amplitud BPFO podrían ser un indicador eficaz de diferentes tipos de fallas. Aquí se crea una nueva característica, que es la relación de registro de las dos entidades existentes, y se visualiza en un histograma agrupado por diferentes tipos de fallas.

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')

El histograma muestra una separación clara entre las tres condiciones de rodamiento diferentes. La relación de registro entre las amplitudes BPFI y BPFO es una característica válida para clasificar las fallas de los rodamientos. Para simplificar el ejemplo, se deriva un clasificador muy simple: si

<math display="inline">
<mrow>
<mi mathvariant="normal">log</mi>
<mrow>
<mo>(</mo>
<mrow>
<mfrac>
<mrow>
<mi mathvariant="normal">BPFIAmp</mi>
<mi mathvariant="normal">litude</mi>
</mrow>
<mrow>
<mi mathvariant="normal">BPFOAmp</mi>
<mi mathvariant="normal">litude</mi>
</mrow>
</mfrac>
</mrow>
<mo>)</mo>
</mrow>
<mo></mo>
<mo>-</mo>
<mn>1</mn>
<mo>.</mo>
<mn>5</mn>
</mrow>
</math>
, el rodamiento tiene una falla de carrera externa; Si
<math display="inline">
<mrow>
<mo>-</mo>
<mn>1</mn>
<mo>.</mo>
<mn>5</mn>
<mo><</mo>
<mi mathvariant="normal">log</mi>
<mrow>
<mo>(</mo>
<mrow>
<mfrac>
<mrow>
<mi mathvariant="normal">BPFIAmp</mi>
<mi mathvariant="normal">litude</mi>
</mrow>
<mrow>
<mi mathvariant="normal">BPFOAmp</mi>
<mi mathvariant="normal">litude</mi>
</mrow>
</mfrac>
</mrow>
<mo>)</mo>
</mrow>
<mo></mo>
<mn>0</mn>
<mo>.</mo>
<mn>5</mn>
</mrow>
</math>
, el rodamiento es normal; y si
<math display="inline">
<mrow>
<mi mathvariant="normal">log</mi>
<mrow>
<mo>(</mo>
<mrow>
<mfrac>
<mrow>
<mi mathvariant="normal">BPFIAmp</mi>
<mi mathvariant="normal">litude</mi>
</mrow>
<mrow>
<mi mathvariant="normal">BPFOAmp</mi>
<mi mathvariant="normal">litude</mi>
</mrow>
</mfrac>
</mrow>
<mo>)</mo>
</mrow>
<mo>></mo>
<mn>0</mn>
<mo>.</mo>
<mn>5</mn>
</mrow>
</math>
, el rodamiento tiene una falla de carrera interna.

Validación mediante conjuntos de datos de prueba

Ahora, apliquemos el flujo de trabajo a un conjunto de datos de prueba y validemos el clasificador obtenido en la última sección. Aquí los datos de prueba contienen 1 conjunto de datos normal, 2 conjuntos de datos de errores de carrera internos y 3 conjuntos de datos de errores de carrera externos.

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')

La relación de registro de las amplitudes BPFI y BPFO de los conjuntos de datos de prueba muestra una distribución coherente con la relación de registro de los conjuntos de datos de entrenamiento. El clasificador ingenuo obtenido en la última sección logró una precisión perfecta en el conjunto de datos de prueba.

Debe tenerse en cuenta que una sola entidad generalmente no es suficiente para obtener un clasificador que generalice bien. Se podrían obtener clasificadores más sofisticados dividiendo los datos en varias piezas (para crear más puntos de datos), extraer varias características relacionadas con el diagnóstico, seleccionar un subconjunto de entidades por sus rangos de importancia y entrenar a varios clasificadores usando el Aplicación de aprendizaje de clasificación en Statistics & Machine Learning Toolbox. Para obtener más detalles de este flujo de trabajo, consulte el ejemplo "Uso de Simulink para generar datos de errores".

Resumen

Este ejemplo muestra cómo utilizar la curtograma, la kurtosis espectral y el espectro de envolventes para identificar diferentes tipos de fallas en los rodamientos de elementos rodantes. A continuación, el algoritmo se aplica a un lote de conjuntos de datos en el disco, lo que ayudó a mostrar que las amplitudes del espectro de envolvente filtrada de paso de banda en BPFI y BPFO son dos indicadores de condición importantes para el diagnóstico de rodamientos.

Referencias

[1] Randall, Robert B., y Jerome Antoni. "Diagnóstico de rodamientos de elementos, un tutorial." .Mechanical Systems and Signal Processing Vol. 25, Número 2, 2011, págs. 485–520.

[2] Antoni, Jéréme. "Cálculo rápido del kurtogrampara para la detección de fallas transitorias." .Mechanical Systems and Signal Processing Vol. 21, Número 1, 2007, págs. 108–124.

[3] Antoni, Jéréme. "La kurtosis espectral: una herramienta útil para caracterizar señales no estacionarias." .Mechanical Systems and Signal Processing Vol. 20, Número 2, 2006, págs. 282–307.

[4] Bechhoefer, Eric. "Base de datos de fallas de mantenimiento basada en condiciones para diagnósticos de pruebas y algoritmos de pronóstico." 2013.https://mfpt.org/fault-data-sets/

Funciones auxiliares

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