From 8a74b15e82ea60bcb7b1e473aeff125d84640caa Mon Sep 17 00:00:00 2001
From: Stefano Belletti <stefano.belletti@skywarder.eu>
Date: Fri, 17 Jan 2025 11:05:12 +0100
Subject: [PATCH] Added scripts for noise analysis

---
 .../Functions/NoiseAnalysis_pink.m            | 155 ++++++++++++++++++
 .../Functions/NoiseAnalysis_white.m           | 110 +++++++++++++
 .../NoiseAnalysis/Functions/WindowViewer.m    |  22 +++
 .../sensors/NoiseAnalysis/Functions/dft.m     |  33 ++++
 .../sensors/NoiseAnalysis/NoiseCreator.mlx    | Bin 0 -> 24120 bytes
 .../NoiseAnalysis/main_noiseAnalysis.m        |  93 +++++++++++
 .../sensors/NoiseAnalysis/mat_creator.m       |  63 +++++++
 7 files changed, 476 insertions(+)
 create mode 100644 commonFunctions/sensors/NoiseAnalysis/Functions/NoiseAnalysis_pink.m
 create mode 100644 commonFunctions/sensors/NoiseAnalysis/Functions/NoiseAnalysis_white.m
 create mode 100644 commonFunctions/sensors/NoiseAnalysis/Functions/WindowViewer.m
 create mode 100644 commonFunctions/sensors/NoiseAnalysis/Functions/dft.m
 create mode 100644 commonFunctions/sensors/NoiseAnalysis/NoiseCreator.mlx
 create mode 100644 commonFunctions/sensors/NoiseAnalysis/main_noiseAnalysis.m
 create mode 100644 commonFunctions/sensors/NoiseAnalysis/mat_creator.m

diff --git a/commonFunctions/sensors/NoiseAnalysis/Functions/NoiseAnalysis_pink.m b/commonFunctions/sensors/NoiseAnalysis/Functions/NoiseAnalysis_pink.m
new file mode 100644
index 0000000..a1fd16d
--- /dev/null
+++ b/commonFunctions/sensors/NoiseAnalysis/Functions/NoiseAnalysis_pink.m
@@ -0,0 +1,155 @@
+function [sensor_vect] = NoiseAnalysis_pink(sensor_vect, sensor_number, track, plot_val)
+
+fprintf("Sensor analyzed: %s, track: %d and noise type: %s\n\n", sensor_vect(sensor_number).name, track, sensor_vect(sensor_number).noise_type);
+
+name = sensor_vect(sensor_number).name;
+fs = sensor_vect(sensor_number).fs;
+
+b_left = sensor_vect(sensor_number).bounds(1);
+b_right = sensor_vect(sensor_number).bounds(2);
+
+
+%% Magic values
+temp_val = 0.1;
+butterOrder = 1;
+fcut = 0.3;
+white_variance = 15;
+
+
+%% Noise extraction
+A = importdata(name).data;
+signal = A(:,track);
+
+cut_left = ceil(length(signal)*b_left);
+cut_right = ceil(length(signal)*b_right);
+signal = signal(cut_left:cut_right);
+
+filtered_signal = movmean(signal, fs);
+
+% Plots
+bound = 15;
+y_min = min(min(signal), min(filtered_signal));
+y_max = max(max(signal), max(filtered_signal));
+if plot_val
+    figure(2)
+    subplot(1,2,1), hold on, grid on, title("Unfiltered signal"), xlabel("Samples [-]"), ylabel("Value"), ylim([y_min y_max])
+    plot(signal)
+    subplot(1,2,2), hold on, grid on, title("Filtered signal"), xlabel("Samples [-]"), ylabel("Value"), ylim([y_min y_max])
+    plot(filtered_signal(bound:end-bound)) % removed boundaries
+end
+
+% Noise extraction
+noise = signal(bound:end-bound) - filtered_signal(bound:end-bound);
+
+% fft of noise
+tf = length(noise)/fs;
+t = 0:1/fs:tf;
+[G_n,f] = dft(noise,t);
+
+
+%% Peaks identification & pink noise creator
+max_height = round(max(abs(G_n))*temp_val);
+
+if plot_val
+    figure(3)
+    subplot(1,2,1), hold on, hold on, grid on, title("Real noise"), xlabel("f [Hz]"), ylabel("|fft(X)|")
+    plot(f,abs(G_n))
+    plot([0 max(f)], [max_height max_height], '.--')
+end
+
+peaks_count = 0;
+peaks_vect_val = [];
+peaks_vect_f = [];
+peaks_last = 0;
+for ii = round(length(G_n)/2) : length(G_n)-1
+    if abs(G_n(ii)) > max_height && abs(G_n(ii+1)) < abs(G_n(ii)) && ii-peaks_last>1
+        peaks_count = peaks_count + 1;
+        peaks_vect_val = [peaks_vect_val abs(G_n(ii))];
+        peaks_vect_f = [peaks_vect_f f(ii)];
+        peaks_last = ii;
+        
+        if plot_val
+            plot(f(ii), abs(G_n(ii)), 'or')
+        end
+    end
+end
+
+% Peaks creator as sine waves
+factor = 2/(length(t));               % normalize the height
+sine_vect = zeros(1,length(t));
+for ii = 1:length(peaks_vect_val)
+    sine_vect = sine_vect + factor*peaks_vect_val(ii)*sin(2*pi*peaks_vect_f(ii)*t + randn(1));
+end
+
+
+
+%% Noise cut for variance
+% new_vect=zeros(1,length(G_n));
+% for ii = 1:length(G_n)
+%     if abs(G_n(ii)) < max_height
+%         new_vect(ii) = G_n(ii);
+%     else
+%         new_vect(ii) = 0;
+%     end
+% end
+% figure
+% plot(f,abs(new_vect))
+% 
+% signal_new = idft(new_vect',f,t);
+% variance1 = var(signal_new);
+
+
+%% Pink noise creator
+white_noise = sqrt(white_variance)*randn(size(t));
+
+[b, a] = butter(butterOrder, fcut, 'low');
+pink_noise = filter(b, a, white_noise);
+noise_modeled = sine_vect + pink_noise;
+
+
+%% Final plots
+[G_test,f] = dft(noise_modeled,t);
+if plot_val
+    figure(3)
+    subplot(1,2,2), hold on, hold on, grid on, title("Modeled noise"), xlabel("f [Hz]"), ylabel("|fft(X)|")
+    plot(f,abs(G_test))
+end
+
+y_min = min(min(noise), min(noise));
+y_max = max(max(noise_modeled), max(noise_modeled));
+
+if plot_val
+    figure(4)
+    subplot(1,2,1), hold on, grid on, title("Real noise"), xlabel("Samples [-]"), ylabel("Value"), ylim([y_min y_max])
+    plot(noise)
+    subplot(1,2,2), hold on, grid on, title("Modeled noise"), xlabel("Samples [-]"), ylabel("Value"), ylim([y_min y_max])
+    plot(noise_modeled)
+end
+
+
+%% Data
+
+if ~plot_val
+    tracks = sensor_vect(sensor_number).tracks;
+    if tracks(1) >= 6
+        track = track - (tracks(1) - 2);
+    end
+    switch track
+        case 2
+            sensor_vect(sensor_number).track1.peaks_vect_f = peaks_vect_f;
+            sensor_vect(sensor_number).track1.peaks_vect_val = factor*peaks_vect_val;
+            sensor_vect(sensor_number).track1.variance = white_variance*sensor_vect(sensor_number).factor;
+        case 3
+            sensor_vect(sensor_number).track2.peaks_vect_f = peaks_vect_f;
+            sensor_vect(sensor_number).track2.peaks_vect_val = factor*peaks_vect_val;
+            sensor_vect(sensor_number).track2.variance = white_variance*sensor_vect(sensor_number).factor;
+        case 4
+            sensor_vect(sensor_number).track3.peaks_vect_f = peaks_vect_f;
+            sensor_vect(sensor_number).track3.peaks_vect_val = factor*peaks_vect_val;
+            sensor_vect(sensor_number).track3.variance = white_variance*sensor_vect(sensor_number).factor;
+    end
+end
+
+
+end
+
diff --git a/commonFunctions/sensors/NoiseAnalysis/Functions/NoiseAnalysis_white.m b/commonFunctions/sensors/NoiseAnalysis/Functions/NoiseAnalysis_white.m
new file mode 100644
index 0000000..c7737a5
--- /dev/null
+++ b/commonFunctions/sensors/NoiseAnalysis/Functions/NoiseAnalysis_white.m
@@ -0,0 +1,110 @@
+function [sensor_vect] = NoiseAnalysis_white(sensor_vect, sensor_number, track, plot_val)
+
+fprintf("Sensor analyzed: %s, track: %d and noise type: %s\n", sensor_vect(sensor_number).name, track, sensor_vect(sensor_number).noise_type);
+
+% data extrapolation
+name = sensor_vect(sensor_number).name;
+fs = sensor_vect(sensor_number).fs;
+
+b_left = sensor_vect(sensor_number).bounds(1);
+b_right = sensor_vect(sensor_number).bounds(2);
+
+bound = 1;
+
+A = importdata(name).data;
+signal = A(:,track);
+
+% portion to be analyzed
+cut_left = ceil(length(signal)*b_left);
+cut_right = ceil(length(signal)*b_right);
+signal = signal(cut_left:cut_right);
+
+% filtered signal
+filtered_signal = movmean(signal, fs);
+
+y_min = min(min(signal), min(filtered_signal));
+y_max = max(max(signal), max(filtered_signal));
+if plot_val
+    figure
+    subplot(1,2,1), hold on, grid on, title("Unfiltered signal"), xlabel("Samples [-]"), ylabel("Value"), ylim([y_min y_max])
+    plot(signal)
+    subplot(1,2,2), hold on, grid on, title("Filtered signal"), xlabel("Samples [-]"), ylabel("Value"), ylim([y_min y_max])
+    plot(filtered_signal(bound:end-bound)) % removed boundaries
+end
+
+noise = signal(bound:end-bound) - filtered_signal(bound:end-bound);
+
+% fft of noise
+tf = length(noise)/fs;
+t = 0:1/fs:tf;
+L = length(t)-1;
+
+[G_n,~] = dft(noise,t);
+noise_variance = var(signal);
+
+% White noise - modeling
+white_noise = sqrt(noise_variance)*randn(L, 1);
+
+y_min = min(min(noise), min(white_noise));
+y_max = max(max(noise), max(white_noise));
+if plot_val
+    figure
+    subplot(1,2,1), hold on, grid on, title("Extracted noise"), xlabel("Samples [-]"), ylabel("Value"), ylim([y_min y_max])
+    plot(noise) % removed boundaries
+    subplot(1,2,2), hold on, grid on, title("Modeled noise"), xlabel("Samples [-]"), ylabel("Value"), ylim([y_min y_max])
+    plot(white_noise)
+end
+
+[G_wn,~] = dft(white_noise,t);
+
+% comparison between modeled noise and extracted
+filtered_white_noise = movmean(white_noise, fs);
+
+[G_check,f] = dft(white_noise-filtered_white_noise,t);
+y_max = round(max(max(abs(G_check)), max(abs(G_n))));
+
+if plot_val
+    figure
+    subplot(1,3,1), axis square, hold on, grid on, title("|fft(X)| - Extracted noise"), xlabel("f (Hz)"), ylabel("|fft(X)|"), ylim([0, y_max])
+    plot(f,abs(G_n),"LineWidth",1)
+    subplot(1,3,2), axis square, hold on, grid on, title("|fft(X)| - Modeled (+ filter)"), xlabel("f (Hz)"), ylabel("|fft(X)|"), ylim([0, y_max])
+    plot(f,abs(G_check),"LineWidth",1)
+    subplot(1,3,3), axis square, hold on, grid on, title("|fft(X)| modeled white noise"), xlabel("f (Hz)"), ylabel("|fft(X)|"), ylim([0, y_max])
+    plot(f,abs(G_wn),"LineWidth",1)
+end
+
+% Variance check
+fprintf("Variance of orginal noise: \t\t\t\t" + var(noise) + "\n")
+fprintf("variance of modeled (+ filter) noise: \t" + var(white_noise-filtered_white_noise) + "\n")
+
+% Statistical analysis
+[h,p] = ttest2(noise, filtered_white_noise);
+
+if h == 0
+    disp('Signals are statistically similar');
+else
+    disp('Signals are not statistically similar');
+end
+
+% Mean squared error
+mse = mean((noise - filtered_white_noise).^2);
+disp(['MSE between the two noises: ', num2str(mse)]);
+fprintf("\n")
+
+if ~plot_val
+    tracks = sensor_vect(sensor_number).tracks;
+    if tracks(1) >= 6
+        track = track - (tracks(1) - 2);
+    end
+    switch track
+        case 2
+            sensor_vect(sensor_number).track1 = noise_variance;
+        case 3
+            sensor_vect(sensor_number).track2 = noise_variance;
+        case 4
+            sensor_vect(sensor_number).track3 = noise_variance;
+    end
+end
+
+end
+
diff --git a/commonFunctions/sensors/NoiseAnalysis/Functions/WindowViewer.m b/commonFunctions/sensors/NoiseAnalysis/Functions/WindowViewer.m
new file mode 100644
index 0000000..8cc5f8e
--- /dev/null
+++ b/commonFunctions/sensors/NoiseAnalysis/Functions/WindowViewer.m
@@ -0,0 +1,22 @@
+function [] = WindowViewer(name, track, b_left, b_right)
+
+A = importdata(name).data;
+signal = A(:,track);
+
+cut_left = ceil(length(signal)*b_left);
+cut_right = ceil(length(signal)*b_right);
+
+figure(1), subplot(1,2,1), hold on, grid on
+plot(linspace(0,1,length(signal)), signal')
+plot([b_left b_left], [min(signal) max(signal)], Color="red", LineWidth=1.5)
+plot([b_right b_right], [min(signal) max(signal)], Color="red", LineWidth=1.5)
+xlabel("Position [-]"), ylabel("Value")
+
+cut_signal = signal(cut_left:cut_right);
+
+subplot(1,2,2), hold on, grid on
+plot(cut_signal)
+xlabel("Samples [-]"), ylabel("Value")
+hold off
+
+end
diff --git a/commonFunctions/sensors/NoiseAnalysis/Functions/dft.m b/commonFunctions/sensors/NoiseAnalysis/Functions/dft.m
new file mode 100644
index 0000000..7902b04
--- /dev/null
+++ b/commonFunctions/sensors/NoiseAnalysis/Functions/dft.m
@@ -0,0 +1,33 @@
+function [G,f] = dft(g,t,Nf)
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% DISCREET FOURIER TRANSFORM
+% g = input signal
+% t = input time axis
+% Nf = number of frequency samples
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+if not(exist('Nf'))
+    Nf = length(t);
+end
+if size(g,1)==1
+    g = g.';
+end
+
+G = fft(g,Nf,1); % transform along columns by default
+G = fftshift(G,1);
+
+% frequency axis
+dt = t(2)-t(1);
+if mod(Nf,2) % odd number of samples
+    f = (-(Nf-1)/2:(Nf-1)/2)/Nf/dt;
+else   % even number of samples
+    f = (-Nf/2:Nf/2-1)/Nf/dt;
+end
+
+% fft delay compensation
+phase = -2*pi*f(:)*t(1);
+w = exp(1i*phase(:))*ones(1,size(g,2));
+G = G.*w;
+
+end
diff --git a/commonFunctions/sensors/NoiseAnalysis/NoiseCreator.mlx b/commonFunctions/sensors/NoiseAnalysis/NoiseCreator.mlx
new file mode 100644
index 0000000000000000000000000000000000000000..4492785dca3564e01f78d8765e7e77b1bf62ea31
GIT binary patch
literal 24120
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%0ABu%^y~?DY*95ANNXmts)##n8;amw(kP
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

literal 0
HcmV?d00001

diff --git a/commonFunctions/sensors/NoiseAnalysis/main_noiseAnalysis.m b/commonFunctions/sensors/NoiseAnalysis/main_noiseAnalysis.m
new file mode 100644
index 0000000..833acbe
--- /dev/null
+++ b/commonFunctions/sensors/NoiseAnalysis/main_noiseAnalysis.m
@@ -0,0 +1,93 @@
+%% Main script for noise modeling
+
+restoredefaultpath
+
+
+%% Path
+
+matFolder = "";
+addpath(genpath("./Functions"))
+addpath(genpath(matFolder))
+
+
+%% 1 - Single sensor test
+
+clear, clc
+close all
+
+sensor_single.name = "motor_Motor_CCPressureData.csv";
+sensor_single.noise_type = "white";
+sensor_single.track = 2;
+sensor_single.fs = 100;
+sensor_single.bound_left = 0.35;
+sensor_single.bound_right = 0.5;
+sensor_single.bounds = [sensor_single.bound_left sensor_single.bound_right];
+
+
+%% 1.1 - Visualizer
+
+clc, close all
+
+WindowViewer(sensor_single.name, sensor_single.track, sensor_single.bound_left, sensor_single.bound_right)
+
+
+%% 1.2 - Single sensor analysis
+
+clc, close all
+
+if sensor_single.noise_type == "white"
+    sensor_vect = NoiseAnalysis_white(sensor_single, 1, sensor_single.track, 1);
+elseif sensor_single.noise_type == "pink"
+    sensor_vect = NoiseAnalysis_pink(sensor_single, 1, sensor_single.track, 1);
+else
+    error("Noise type is neither 'white' nor 'pink'")
+end
+
+
+%% 2 - Multiple sensors analysis
+
+clear, clc
+close all
+
+name = "Lyra_Port_sensor_vect";
+save_name = "Lyra_Port_sensor_vect_res";
+
+try
+    load(name)
+catch
+    error("Use mat_creator first")
+end
+
+for sensor_num  = 1:length(Lyra_Port_sensor_vect)
+    for track = Lyra_Port_sensor_vect(sensor_num).tracks
+        if Lyra_Port_sensor_vect(sensor_num).noise_type == "white"
+            Lyra_Port_sensor_vect = NoiseAnalysis_white(Lyra_Port_sensor_vect, sensor_num, track, 0);
+        elseif Lyra_Port_sensor_vect(sensor_num).noise_type == "pink"
+            Lyra_Port_sensor_vect = NoiseAnalysis_pink(Lyra_Port_sensor_vect, sensor_num, track, 0);
+        else
+            error("Noise type is neither 'white' nor 'pink'")
+        end
+    end
+end
+
+save(save_name, name)
+
+
+%% 3 - fs
+
+name = "payload_Payload_StaticPressureData.csv";
+track = 1;              % timestamp track
+
+timestamp = importdata(name).data;
+timestamp = timestamp(:,1);
+
+diff = zeros(1,length(timestamp)-1);
+for ii = 1:length(timestamp)-1
+    diff(ii) = timestamp(ii+1) - timestamp(ii);
+end
+
+diff_mean = mean(diff);
+fs = round(1/diff_mean * 1e6);
+
+fprintf("%s is sampled at %d Hz\n", name, fs)
+
diff --git a/commonFunctions/sensors/NoiseAnalysis/mat_creator.m b/commonFunctions/sensors/NoiseAnalysis/mat_creator.m
new file mode 100644
index 0000000..c24e4ed
--- /dev/null
+++ b/commonFunctions/sensors/NoiseAnalysis/mat_creator.m
@@ -0,0 +1,63 @@
+%% new .mat for init Portugal October 2024 - Lyra
+
+clear, clc
+close all
+
+Lyra_Port_sensor_vect(1).name = "main_Main_StaticPressureData1.csv";
+Lyra_Port_sensor_vect(1).info = "barometer1";
+Lyra_Port_sensor_vect(1).fs = 100;
+Lyra_Port_sensor_vect(1).noise_type = "pink";
+Lyra_Port_sensor_vect(1).bounds = [0.5 0.6];
+Lyra_Port_sensor_vect(1).tracks = 2;
+Lyra_Port_sensor_vect(1).factor = 0.01;
+
+Lyra_Port_sensor_vect(2).name = "main_Main_StaticPressureData2.csv";
+Lyra_Port_sensor_vect(2).info = "barometer2";
+Lyra_Port_sensor_vect(2).fs = 100;
+Lyra_Port_sensor_vect(2).noise_type = "pink";
+Lyra_Port_sensor_vect(2).bounds = [0.6 0.7];
+Lyra_Port_sensor_vect(2).tracks = 2;
+Lyra_Port_sensor_vect(2).factor = 0.01;
+
+Lyra_Port_sensor_vect(3).name = "main_Boardcore_LPS28DFWData.csv";
+Lyra_Port_sensor_vect(3).info = "barometer3";
+Lyra_Port_sensor_vect(3).fs = 50;
+Lyra_Port_sensor_vect(3).noise_type = "white";
+Lyra_Port_sensor_vect(3).bounds = [0.13 0.23];
+Lyra_Port_sensor_vect(3).tracks = 2;
+Lyra_Port_sensor_vect(3).factor = 0.01;
+
+Lyra_Port_sensor_vect(4).name = "main_Boardcore_LSM6DSRXData.csv";
+Lyra_Port_sensor_vect(4).info = "accelerometer";
+Lyra_Port_sensor_vect(4).fs = 440;
+Lyra_Port_sensor_vect(4).noise_type = "white";
+Lyra_Port_sensor_vect(4).bounds = [0.35 0.5];
+Lyra_Port_sensor_vect(4).tracks = [2 3 4];
+Lyra_Port_sensor_vect(4).factor = 1000/9.81;
+
+Lyra_Port_sensor_vect(5).name = "main_Boardcore_LSM6DSRXData.csv";
+Lyra_Port_sensor_vect(5).info = "initial gyroscope";
+Lyra_Port_sensor_vect(5).fs = 440;
+Lyra_Port_sensor_vect(5).noise_type = "white";
+Lyra_Port_sensor_vect(5).bounds = [0.35 0.5];
+Lyra_Port_sensor_vect(5).tracks = [6 7 8];
+Lyra_Port_sensor_vect(5).factor = 1000;
+
+Lyra_Port_sensor_vect(6).name = "motor_Motor_CCPressureData.csv";
+Lyra_Port_sensor_vect(6).info = "initial chamber pressure";
+Lyra_Port_sensor_vect(6).fs = 100;
+Lyra_Port_sensor_vect(6).noise_type = "white";
+Lyra_Port_sensor_vect(6).bounds = [0.35 0.5];
+Lyra_Port_sensor_vect(6).tracks = 2;
+Lyra_Port_sensor_vect(6).factor = 0.01;
+
+Lyra_Port_sensor_vect(7).name = "payload_Payload_StaticPressureData.csv";
+Lyra_Port_sensor_vect(7).info = "pitot (static + total)";
+Lyra_Port_sensor_vect(7).fs = 100;
+Lyra_Port_sensor_vect(7).noise_type = "pink";
+Lyra_Port_sensor_vect(7).bounds = [0.3 0.47];
+Lyra_Port_sensor_vect(7).tracks = 2;
+Lyra_Port_sensor_vect(7).factor = 0.01;
+
+save("Lyra_Port_sensor_vect")
+
-- 
GitLab