What is Vibration Classification?
Vibration classification is a key technology in fields such as mechanical fault diagnosis and structural health monitoring. By analyzing and classifying vibration signals, we can identify the operational status of equipment and detect anomalies, thereby enabling predictive maintenance.
First, we need to prepare some vibration data. Here, we use simulated bearing vibration data, which includes three conditions: normal state, inner race fault, and outer race fault.
% Clear environment
clear; close all; clc;
% Set parameters
fs = 12000; % Sampling frequency 12kHz
t = 0:1/fs:1-1/fs; % 1 second time vector
f_rotor = 30; % Rotor frequency 30Hz
f_bpfi = 5.2*f_rotor; % Inner race fault frequency
f_bpfo = 3.6*f_rotor; % Outer race fault frequency
% Generate simulated vibration signals
% Normal signal - mainly rotor frequency and its harmonics
normal_signal = 0.5*sin(2*pi*f_rotor*t) + 0.2*sin(2*pi*2*f_rotor*t) + 0.1*randn(size(t));
% Inner race fault - rotor frequency + fault frequency modulation
inner_signal = 0.5*sin(2*pi*f_rotor*t) + 0.3*(1+0.5*sin(2*pi*f_bpfi*t)).*sin(2*pi*f_rotor*t) + 0.1*randn(size(t));
% Outer race fault - rotor frequency + fault frequency modulation
outer_signal = 0.5*sin(2*pi*f_rotor*t) + 0.4*(1+0.6*sin(2*pi*f_bpfo*t)).*sin(2*pi*f_rotor*t) + 0.1*randn(size(t));
% Combine dataset
signals = [normal_signal; inner_signal; outer_signal];
labels = {'Normal State', 'Inner Race Fault', 'Outer Race Fault'};
Time Domain Visualization
Time domain analysis is the most intuitive method for analyzing vibration signals, allowing us to directly observe the waveform characteristics of the signals.
% Time domain waveform plotting
figure('Position', [100, 100, 1200, 800])
for i = 1:3
subplot(3, 1, i)
plot(t(1:1000), signals(i, 1:1000), 'LineWidth', 1.5)
title(['Vibration Signal Time Domain Waveform - ' labels{i}], 'FontSize', 12, 'FontWeight', 'bold')
xlabel('Time (s)')
ylabel('Amplitude')
grid on
set(gca, 'FontSize', 10)
end
% Set overall title
sgtitle('Time Domain Comparison of Vibration Signals Under Different Conditions', 'FontSize', 16, 'FontWeight', 'bold')
% Save image
saveas(gcf, 'Time_Domain_Comparison.png')

Frequency Domain Analysis
Frequency domain analysis can reveal the frequency composition of signals, which is particularly important for fault diagnosis.
% Frequency domain analysis
figure('Position', [100, 100, 1200, 800])
for i = 1:3
% Calculate FFT
N = length(signals(i, :));
f = (0:N-1)*fs/N;
Y = fft(signals(i, :));
P2 = abs(Y/N);
P1 = P2(1:N/2+1);
P1(2:end-1) = 2*P1(2:end-1);
f_plot = f(1:N/2+1);
subplot(3, 1, i)
plot(f_plot, P1, 'LineWidth', 1.5, 'Color', [0.8500, 0.3250, 0.0980])
title(['Vibration Signal Spectrum - ' labels{i}], 'FontSize', 12, 'FontWeight', 'bold')
xlabel('Frequency (Hz)')
ylabel('Magnitude')
xlim([0, 1000])
grid on
set(gca, 'FontSize', 10)
end
sgtitle('Frequency Spectrum Comparison of Vibration Signals Under Different Conditions', 'FontSize', 16, 'FontWeight', 'bold')
saveas(gcf, 'Frequency_Spectrum_Comparison.png')

Time-Frequency Analysis – Short-Time Fourier Transform
Time-frequency analysis can simultaneously display the changes of signals in time and frequency, making it particularly suitable for analyzing non-stationary signals.
% Time-frequency analysis
figure('Position', [100, 100, 1200, 900])
for i = 1:3
subplot(3, 1, i)
% Perform Short-Time Fourier Transform
[s, f, t] = spectrogram(signals(i, :), 256, 250, 256, fs, 'yaxis');
% Plot time-frequency map
imagesc(t, f, 10*log10(abs(s)))
axis xy
colorbar
title(['Time-Frequency Analysis - ' labels{i}], 'FontSize', 12, 'FontWeight', 'bold')
xlabel('Time (s)')
ylabel('Frequency (Hz)')
ylim([0, 1000])
set(gca, 'FontSize', 10)
end
sgtitle('Time-Frequency Analysis of Vibration Signals', 'FontSize', 16, 'FontWeight', 'bold')
saveas(gcf, 'Time_Frequency_Analysis.png')

Feature Extraction and Visualization
We can extract various features from vibration signals for classification and condition recognition.
% Feature extraction function
function features = extract_features(signal)
features = zeros(1, 6);
% Time domain features
features(1) = rms(signal); % Root Mean Square
features(2) = std(signal); % Standard Deviation
features(3) = kurtosis(signal); % Kurtosis
features(4) = skewness(signal); % Skewness
% Frequency domain features
Y = fft(signal);
L = length(signal);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
features(5) = mean(P1); % Mean of Spectrum
features(6) = std(P1); % Standard Deviation of Spectrum
end
% Extract features from all signals
feature_matrix = [];
for i = 1:3
features = extract_features(signals(i, :));
feature_matrix = [feature_matrix; features];
end
% Feature visualization
figure('Position', [100, 100, 1400, 600])
feature_names = {'RMS', 'Standard Deviation', 'Kurtosis', 'Skewness', 'Mean of Spectrum', 'Standard Deviation of Spectrum'};
for i = 1:6
subplot(2, 3, i)
bar(feature_matrix(:, i), 'FaceColor', [0.3010, 0.7450, 0.9330])
title(feature_names{i}, 'FontSize', 11, 'FontWeight', 'bold')
set(gca, 'XTickLabel', labels)
xtickangle(45)
grid on
end
sgtitle('Comparison of Vibration Signal Features', 'FontSize', 16, 'FontWeight', 'bold')
saveas(gcf, 'Feature_Comparison.png')
