ref #27 -new gradle and sdk version

- added faster bpm estimation by using multiple windows now
- implemented a simple z score based outlier detection
- some ugly heuristics to prefend to many -1 on the screen
NOTE: this is a very unstable version of the code, very protoype
This commit is contained in:
toni
2018-04-27 16:03:58 +02:00
parent cad85f8593
commit 85ea37c14b
11 changed files with 282 additions and 39 deletions

View File

@@ -41,9 +41,9 @@
%measurements = dlmread('../measurements/wearR/recording_180bpm_4-4_177064915.csv', ';'); *
%files = dir(fullfile('../../measurements/lgWear/', '*.csv'));
files = dir(fullfile('../../measurements/lgWear/', '*.csv'));
%files = dir(fullfile('../../measurements/wearR/', '*.csv'));
files = dir(fullfile('../../measurements/peter_failed/', '*.csv'));
%files = dir(fullfile('../../measurements/peter_failed/', '*.csv'));
for file = files'
@@ -52,7 +52,7 @@ for file = files'
%draw the raw acc data
m_idx = [];
m_idx = (measurements(:,2)==10);
m_idx = (measurements(:,2)==2); %Android App: 10, Normal Data: 2
m = measurements(m_idx, :);
%Interpolate to generate a constant sample rate to 250hz (4ms per sample)
@@ -71,13 +71,19 @@ for file = files'
legend("x", "location", "eastoutside");
figure(2);
plot(m(:,1),m(:,4)) %y
plot(m(:,1),m(:,4)) %yt
legend("y", "location", "eastoutside");
figure(3);
plot(m(:,1),m(:,5)) %z
legend("z", "location", "eastoutside");
%magnitude
magnitude = sqrt(sum(m(:,3:5).^2,2));
figure(5);
plot(m(:,1), magnitude);
legend("magnitude", "location", "eastoutside");
waitforbuttonpress();
%save timestamps
@@ -98,26 +104,39 @@ for file = files'
[corr_x, lag_x] = xcov(m(i-window_size:i,3), (window_size/4), "coeff");
[corr_y, lag_y] = xcov(m(i-window_size:i,4), (window_size/4), "coeff");
[corr_z, lag_z] = xcov(m(i-window_size:i,5), (window_size/4), "coeff");
[corr_mag, lag_mag] = xcov(magnitude(i-window_size:i), (window_size/4), "coeff");
%autocorrelation of the autocorrelation?!
%[corr_corr_x, lag_lag_x] = xcov(corr_x, length(corr_x), "coeff");
%[corr_corr_y, lag_lag_y] = xcov(corr_y, length(corr_x), "coeff");
%[corr_corr_z, lag_lag_z] = xcov(corr_z, length(corr_x), "coeff");
corr_x_pos = corr_x;
corr_y_pos = corr_y;
corr_z_pos = corr_z;
corr_mag_pos = corr_mag;
corr_x_pos(corr_x_pos<0)=0;
corr_y_pos(corr_y_pos<0)=0;
corr_z_pos(corr_z_pos<0)=0;
corr_mag_pos(corr_mag_pos<0)=0;
[peak_x, idx_x_raw] = findpeaks(corr_x_pos, 'MinPeakHeight', 0.1,'MinPeakDistance', 50, 'MinPeakProminence', 0.1);
[peak_y, idx_y_raw] = findpeaks(corr_y_pos, 'MinPeakHeight', 0.1,'MinPeakDistance', 50, 'MinPeakProminence', 0.1);
[peak_z, idx_z_raw] = findpeaks(corr_z_pos, 'MinPeakHeight', 0.1,'MinPeakDistance', 50, 'MinPeakProminence', 0.1);
[peak_mag, idx_mag_raw] = findpeaks(corr_mag_pos, 'MinPeakHeight', 0.1,'MinPeakDistance', 50, 'MinPeakProminence', 0.1);
idx_x_raw = sort(idx_x_raw);
idx_y_raw = sort(idx_y_raw);
idx_z_raw = sort(idx_z_raw);
idx_mag_raw = sort(idx_mag_raw);
idx_x = findFalseDetectedPeaks(idx_x_raw, lag_x, corr_x);
idx_y = findFalseDetectedPeaks(idx_y_raw, lag_y, corr_y);
idx_z = findFalseDetectedPeaks(idx_z_raw, lag_z, corr_z);
idx_mag = findFalseDetectedPeaks(idx_mag_raw, lag_mag, corr_mag);
Xwindow = m(i-window_size:i,3);
Xwindow_mean_ts_diff = mean(diff(lag_x(idx_x) * sample_rate_ms)); %2.5 ms is the time between two samples at 400hz
@@ -155,6 +174,20 @@ for file = files'
title(strcat(" ", m_label_ms, " ", m_label_bpm));
hold ("off");
%magnitude
Mwindow = magnitude(i-window_size:i);
Mwindow_mean_ts_diff = mean(diff(lag_mag(idx_mag)* sample_rate_ms));
Mwindow_mean_bpm = (60000 / (Mwindow_mean_ts_diff));
figure(14);
plot(lag_mag, corr_mag, lag_mag(idx_mag), corr_mag(idx_mag), 'r*', lag_mag(idx_mag_raw), corr_mag(idx_mag_raw), 'g*') %z
hold ("on")
m_label_ms = strcat(" mean ms: ", num2str(Mwindow_mean_ts_diff));
m_label_bpm = strcat(" mean bpm: ", num2str(Mwindow_mean_bpm));
title(strcat(" ", m_label_ms, " ", m_label_bpm));
hold ("off");
%breakpoints dummy for testing
if(length(idx_x) > length(idx_x_raw))