% This program is part of a vibration test to see how well 
% trained tool can differentiate different random vibration data 
% and collected vibration data
% 6/9/2024
% Coded in MATLAB R2024b
% Note: 
% Need previous table data AxisData.mat

%Remove previous setting
clear all; close all;

%Load collected vibration data
load AxisData.mat;

% AxisDataFault data collected while shaking accelerometer to simulate
% faulty condition
AxisDataFault = T
AxisDataFault.Status = repmat({'Fault'},size(AxisDataFault,1),1)
AxisDataFault.Properties.VariableNames = ["Date", "Time", "AccelX", "AccelY", "AccelZ", "GyroX", "GyroY", "GyroZ", "Status"]
AxisDataFault.Date = erase(AxisDataFault.Date, '[')
AxisDataFault.Time = erase(AxisDataFault.Time, ']')

% AxisDataNormal is created with random number within normal range (-1 to
% 1) in all values

AxisDataNormal = T
AxisDataNormal.Status = repmat({'Normal'},size(AxisDataNormal,1),1)
AxisDataNormal.Properties.VariableNames = ["Date", "Time", "AccelX", "AccelY", "AccelZ", "GyroX", "GyroY", "GyroZ", "Status"]
AxisDataNormal.Date = erase(AxisDataNormal.Date, '[')
AxisDataNormal.Time = erase(AxisDataNormal.Time, ']')

max = 1; min = -1; % for scaling random number(0~1) to be -1~1

%Create test data
AxisDataNormal.AccelX = (max-min).*rand(height(AxisDataNormal),1)+min;
AxisDataNormal.AccelY = (max-min).*rand(height(AxisDataNormal),1)+min;
AxisDataNormal.AccelZ = (max-min).*rand(height(AxisDataNormal),1)+min;
AxisDataNormal.GyroX = (max-min).*rand(height(AxisDataNormal),1)+min;
AxisDataNormal.GyroY = (max-min).*rand(height(AxisDataNormal),1)+min;
AxisDataNormal.GyroZ = (max-min).*rand(height(AxisDataNormal),1)+min;
AxisDataNormal.Date = datetime(AxisDataNormal.Date,'Format','dd-MMM-uuuu')
AxisDataNormal.Time = datetime(AxisDataNormal.Time,'Format','HH:mm:ss.SSS')
AxisDataFault.Date = datetime(AxisDataFault.Date,'Format','dd-MMM-uuuu')
AxisDataFault.Time = datetime(AxisDataFault.Time,'Format','HH:mm:ss.SSS')

%Show graph
figure('NumberTitle', 'off', 'Name', 'Normal Vibration and Gyro Data','Position', [50 1 600 950]);
subplot(6,1,1);
plot(AxisDataNormal{:,2},AxisDataNormal{:,3})
ylim([-10 10])
title('Acceleration Data for X Axis')

subplot(6,1,2);
plot(AxisDataNormal{:,2},AxisDataNormal{:,4})
ylim([-10 10])
title('Acceleration Data for Y Axis')

subplot(6,1,3);
plot(AxisDataNormal{:,2},AxisDataNormal{:,5})
ylim([-10 10])
title('Acceleration Data for Z Axis')

subplot(6,1,4);
plot(AxisDataNormal{:,2},AxisDataNormal{:,3})
ylim([-10 10])
title('Gyro Data for X Axis')

subplot(6,1,5);
plot(AxisDataNormal{:,2},AxisDataNormal{:,4})
ylim([-10 10])
title('Gyro Data for Y Axis')

subplot(6,1,6);
plot(AxisDataNormal{:,2},AxisDataNormal{:,5})
ylim([-10 10])
title('Gyro Data for Z Axis')

%Show graph
figure('NumberTitle', 'off', 'Name', 'Faulty Vibration and Gyro Data','Position', [680 1 600 950]);
subplot(6,1,1);
plot(AxisDataFault{:,2},AxisDataFault{:,3})
title('Acceleration Data for X Axis')

subplot(6,1,2);
plot(AxisDataFault{:,2},AxisDataFault{:,4})
title('Acceleration Data for Y Axis')

subplot(6,1,3);
plot(AxisDataFault{:,2},AxisDataFault{:,5})
title('Acceleration Data for Z Axis')

subplot(6,1,4);
plot(AxisDataFault{:,2},AxisDataFault{:,6})
title('Gyro Data for X Axis')

subplot(6,1,5);
plot(AxisDataFault{:,2},AxisDataFault{:,7})
title('Gyro Data for Y Axis')

subplot(6,1,6);
plot(AxisDataFault{:,2},AxisDataFault{:,8})
title('Gyro Data for Z Axis')

%Combine axis data
CombinedAxisData = AxisDataNormal; 
CombinedAxisData.("FaultAccelX") = AxisDataFault.AccelX;
CombinedAxisData.("FaultAccelY") = AxisDataFault.AccelY;
CombinedAxisData.("FaultAccelZ") = AxisDataFault.AccelZ;
CombinedAxisData.("FaultGyroX") = AxisDataFault.GyroX;
CombinedAxisData.("FaultGyroY") = AxisDataFault.GyroY;
CombinedAxisData.("FaultGyroZ") = AxisDataFault.GyroZ;
CombinedAxisData.("FaultStatus") = AxisDataFault.Status;

%Show graph
figure('NumberTitle', 'off', 'Name', 'Normal and Faulty Vibration and Gyro Data','Position', [1300 1 600 950]);
subplot(6,1,1);
plot(CombinedAxisData.Time,CombinedAxisData.AccelX)
hold on
plot(CombinedAxisData.Time,CombinedAxisData.FaultAccelX)
hold off 
title('Combined Acceleration Data for X Axis')

%Show graph
subplot(6,1,2);
plot(CombinedAxisData.Time,CombinedAxisData.AccelY)
hold on
plot(CombinedAxisData.Time,CombinedAxisData.FaultAccelY)
hold off
title('Combined Acceleration Data for Y Axis')

%Show graph
subplot(6,1,3);
plot(CombinedAxisData.Time,CombinedAxisData.AccelZ)
hold on
plot(CombinedAxisData.Time,CombinedAxisData.FaultAccelZ)
hold off
title('Combined Acceleration Data for Z Axis')

%Show graph
subplot(6,1,4);
plot(CombinedAxisData.Time,CombinedAxisData.GyroX)
hold on
plot(CombinedAxisData.Time,CombinedAxisData.FaultGyroX)
hold off
title('Combined Gyro Data for X Axis')

%Show graph
subplot(6,1,5);
plot(CombinedAxisData.Time,CombinedAxisData.GyroY)
hold on
plot(CombinedAxisData.Time,CombinedAxisData.FaultGyroY)
hold off
title('Combined Gyro Data for Y Axis')

%Show graph
subplot(6,1,6);
plot(CombinedAxisData.Time,CombinedAxisData.GyroZ)
hold on
plot(CombinedAxisData.Time,CombinedAxisData.FaultGyroZ)
hold off
title('Combined Gyro Data for Z Axis')

combinedV = vertcat(AxisDataNormal,AxisDataFault);

%Show graph
figure('NumberTitle', 'off', 'Name', 'Spectrogram of Normal and Faulty Vibration','Position', [1600 1 600 950]);
subplot(3,1,1);
spectrogram(combinedV{:,3})
subplot(3,1,2);
spectrogram(combinedV{:,4})
subplot(3,1,3);
spectrogram(combinedV{:,5})
hold off;

%Show graph
figure('NumberTitle', 'off', 'Name', 'Spectrogram of Normal and Faulty Gyro Data','Position', [1800 1 600 950]);
hold on;
subplot(3,1,1);
spectrogram(combinedV{:,6})
subplot(3,1,2);
spectrogram(combinedV{:,7})
subplot(3,1,3);
spectrogram(combinedV{:,8})
hold off;

%Save adjusted test vibration data
save AxisDataProcessed.mat
