puhh. this is a big commit
- change the complete file sending / receiving process between phone and watch, we now use channels instead of simple messages. this is recommentad by google, due to some changes in google play services. - made some smaller changes in the ui, for file saving and saving of sensordata for evaluation purposes - edited the manifest and gradle script for play store. - made some change for a better performance for he huawei watch
This commit is contained in:
@@ -16,7 +16,8 @@ import java.util.stream.IntStream;
|
||||
public class Main {
|
||||
|
||||
public static void main(String [ ] args) {
|
||||
File folder = new File("/home/toni/Documents/programme/dirigent/measurements/wearR");
|
||||
//File folder = new File("/home/toni/Documents/programme/dirigent/measurements/lgWear");
|
||||
File folder = new File("/home/toni/Documents/programme/dirigent/measurements/peter_failed");
|
||||
File[] listOfFiles = folder.listFiles();
|
||||
|
||||
Utils.ShowPNG windowRaw = new Utils.ShowPNG();
|
||||
@@ -30,7 +31,8 @@ public class Main {
|
||||
for (File file : listOfFiles) {
|
||||
if (file.isFile() && file.getName().contains(".csv")) {
|
||||
|
||||
AccelerometerWindowBuffer accWindowBuffer = new AccelerometerWindowBuffer(1024, 256);
|
||||
//TODO: mach Fenster genau 6 sekunden groß. Egal wie viele Samples.
|
||||
AccelerometerWindowBuffer accWindowBuffer = new AccelerometerWindowBuffer(6000, 1500);
|
||||
BpmEstimator bpmEstimator = new BpmEstimator(accWindowBuffer, 0, 5000);
|
||||
|
||||
//read the file line by line
|
||||
@@ -40,7 +42,7 @@ public class Main {
|
||||
String[] measurement = line.split(";");
|
||||
|
||||
//if linear acc
|
||||
if(measurement[1].equals("2")){
|
||||
if(measurement[1].equals("10")){
|
||||
long ts = Long.parseLong(measurement[0]);
|
||||
double x = Double.parseDouble(measurement[2]);
|
||||
double y = Double.parseDouble(measurement[3]);
|
||||
@@ -54,8 +56,9 @@ public class Main {
|
||||
double curBpm = bpmEstimator.estimate();
|
||||
//System.out.println("BPM: " + curBpm);
|
||||
|
||||
|
||||
AccelerometerInterpolator acInterp = new AccelerometerInterpolator(accWindowBuffer, 5);
|
||||
double sampleRate = 20;
|
||||
AccelerometerInterpolator acInterp = new AccelerometerInterpolator(accWindowBuffer, sampleRate);
|
||||
int peakWidth = (int) Math.round(250 / sampleRate);
|
||||
|
||||
//print raw x,y,z
|
||||
double[] dTs = IntStream.range(0, accWindowBuffer.getTs().length).mapToDouble(i -> accWindowBuffer.getTs()[i]).toArray();
|
||||
@@ -70,9 +73,9 @@ public class Main {
|
||||
windowRaw.set(plotRaw.draw());
|
||||
|
||||
//auto corr
|
||||
double[] xAutoCorr = new AutoCorrelation(acInterp.getX(), 512).getCorr();
|
||||
double[] yAutoCorr = new AutoCorrelation(acInterp.getY(), 512).getCorr();
|
||||
double[] zAutoCorr = new AutoCorrelation(acInterp.getZ(), 512).getCorr();
|
||||
double[] xAutoCorr = new AutoCorrelation(acInterp.getX(), accWindowBuffer.size()).getCorr();
|
||||
double[] yAutoCorr = new AutoCorrelation(acInterp.getY(), accWindowBuffer.size()).getCorr();
|
||||
double[] zAutoCorr = new AutoCorrelation(acInterp.getZ(), accWindowBuffer.size()).getCorr();
|
||||
|
||||
//print autocorr
|
||||
int[] tmp = IntStream.rangeClosed(-((xAutoCorr.length - 1)/2), ((xAutoCorr.length - 1)/2)).toArray();
|
||||
@@ -86,10 +89,11 @@ public class Main {
|
||||
|
||||
windowAuto.set(plotCorr.draw());
|
||||
|
||||
Peaks pX = new Peaks(xAutoCorr, 50, 0.1f, 0, false);
|
||||
Peaks pX = new Peaks(xAutoCorr, peakWidth, 0.1f, 0, false);
|
||||
int xOffset = xAutoCorr.length / 2;
|
||||
LinkedList<Integer> peaksX = pX.getPeaksIdx();
|
||||
|
||||
double[] dPeaksXX = IntStream.range(0, peaksX.size()).mapToDouble(i -> (peaksX.get(i) - 512)).toArray();//peaks.stream().mapToDouble(i->i).toArray();
|
||||
double[] dPeaksXX = IntStream.range(0, peaksX.size()).mapToDouble(i -> (peaksX.get(i) - xOffset)).toArray();//peaks.stream().mapToDouble(i->i).toArray();
|
||||
double[] dPeaksXY = IntStream.range(0, peaksX.size()).mapToDouble(i -> (xAutoCorr[peaksX.get(i)])).toArray();
|
||||
Plot plotPeaksX = Plot.plot(Plot.plotOpts().
|
||||
title("Peak Detection on X").
|
||||
@@ -100,10 +104,11 @@ public class Main {
|
||||
|
||||
windowPeaksX.set(plotPeaksX.draw());
|
||||
|
||||
Peaks pY = new Peaks(yAutoCorr, 50, 0.1f, 0, false);
|
||||
Peaks pY = new Peaks(yAutoCorr, peakWidth, 0.1f, 0, false);
|
||||
int yOffset = yAutoCorr.length / 2;
|
||||
LinkedList<Integer> peaksY = pY.getPeaksIdx();
|
||||
|
||||
double[] dPeaksYX = IntStream.range(0, peaksY.size()).mapToDouble(i -> (peaksY.get(i) - 512)).toArray();//peaks.stream().mapToDouble(i->i).toArray();
|
||||
double[] dPeaksYX = IntStream.range(0, peaksY.size()).mapToDouble(i -> (peaksY.get(i) - yOffset)).toArray();//peaks.stream().mapToDouble(i->i).toArray();
|
||||
double[] dPeaksYY = IntStream.range(0, peaksY.size()).mapToDouble(i -> (yAutoCorr[peaksY.get(i)])).toArray();
|
||||
Plot plotPeaksY = Plot.plot(Plot.plotOpts().
|
||||
title("Peak Detection on Y").
|
||||
@@ -114,10 +119,11 @@ public class Main {
|
||||
|
||||
windowPeaksY.set(plotPeaksY.draw());
|
||||
|
||||
Peaks pZ = new Peaks(zAutoCorr, 50, 0.1f, 0, false);
|
||||
Peaks pZ = new Peaks(zAutoCorr, peakWidth, 0.1f, 0, false);
|
||||
int zOffset = zAutoCorr.length / 2;
|
||||
LinkedList<Integer> peaksZ = pZ.getPeaksIdx();
|
||||
|
||||
double[] dPeaksZX = IntStream.range(0, peaksZ.size()).mapToDouble(i -> (peaksZ.get(i) - 512)).toArray();//peaks.stream().mapToDouble(i->i).toArray();
|
||||
double[] dPeaksZX = IntStream.range(0, peaksZ.size()).mapToDouble(i -> (peaksZ.get(i) - zOffset)).toArray();//peaks.stream().mapToDouble(i->i).toArray();
|
||||
double[] dPeaksZY = IntStream.range(0, peaksZ.size()).mapToDouble(i -> (zAutoCorr[peaksZ.get(i)])).toArray();
|
||||
Plot plotPeaksZ = Plot.plot(Plot.plotOpts().
|
||||
title("Peak Detection on Z").
|
||||
@@ -142,10 +148,10 @@ public class Main {
|
||||
}
|
||||
// line is not visible here.
|
||||
|
||||
double meanBPM = bpmEstimator.getMeanBpm();
|
||||
double medianBPM = bpmEstimator.getMedianBPM();
|
||||
//double meanBPM = bpmEstimator.getMeanBpm();
|
||||
//double medianBPM = bpmEstimator.getMedianBPM();
|
||||
//System.out.println("MEAN BPM: " + Math.round(meanBPM));
|
||||
System.out.println("MEDIAN BPM: " + Math.round(medianBPM));
|
||||
//System.out.println("MEDIAN BPM: " + Math.round(medianBPM));
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
|
||||
@@ -8,14 +8,14 @@ import java.util.ArrayList;
|
||||
*/
|
||||
public class AccelerometerWindowBuffer extends ArrayList<AccelerometerData> {
|
||||
|
||||
private static int mWindowSize;
|
||||
private static int mOverlapSize;
|
||||
private int mOverlapCounter;
|
||||
private static int mWindowSize; // in ms
|
||||
private static int mOverlapSize; // in ms
|
||||
private long mOverlapCounter;
|
||||
|
||||
public AccelerometerWindowBuffer(int windowSize, int overlap){
|
||||
mWindowSize = windowSize;
|
||||
mOverlapSize = overlap;
|
||||
mOverlapCounter = 1;
|
||||
mOverlapCounter = 0;
|
||||
}
|
||||
|
||||
//TODO: add exception handling. falseArgument if ad has no numeric x,y,z
|
||||
@@ -26,20 +26,33 @@ public class AccelerometerWindowBuffer extends ArrayList<AccelerometerData> {
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean r = super.add(ad);
|
||||
if (size() > mWindowSize){
|
||||
removeRange(0, size() - mWindowSize);
|
||||
// current - last to increment overlap time
|
||||
if(!isEmpty()){
|
||||
mOverlapCounter += ad.ts - getYongest().ts;
|
||||
}
|
||||
|
||||
++mOverlapCounter;
|
||||
//add element
|
||||
boolean r = super.add(ad);
|
||||
if ((getYongest().ts - getOldest().ts) > mWindowSize){
|
||||
|
||||
long oldestTime = getYongest().ts - mWindowSize;
|
||||
for(int i = 0; i < size(); ++i) {
|
||||
if (get(i).ts > oldestTime) {
|
||||
break;
|
||||
}
|
||||
remove(i);
|
||||
}
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
public boolean isNextWindowReady(){
|
||||
if((size() > mWindowSize / 2) && mOverlapCounter > mOverlapSize){
|
||||
mOverlapCounter = 1;
|
||||
if(!isEmpty()){
|
||||
if(((getYongest().ts - getOldest().ts) > mWindowSize / 2) && mOverlapCounter > mOverlapSize){
|
||||
mOverlapCounter = 0;
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -51,13 +51,15 @@ public class BpmEstimator {
|
||||
|
||||
AccelerometerInterpolator interp = new AccelerometerInterpolator(mBuffer, sampleRate);
|
||||
|
||||
double[] xAutoCorr = new AutoCorrelation(interp.getX(), 1024).getCorr();
|
||||
double[] yAutoCorr = new AutoCorrelation(interp.getY(), 1024).getCorr();
|
||||
double[] zAutoCorr = new AutoCorrelation(interp.getZ(), 1024).getCorr();
|
||||
double[] xAutoCorr = new AutoCorrelation(interp.getX(), mBuffer.size()).getCorr();
|
||||
double[] yAutoCorr = new AutoCorrelation(interp.getY(), mBuffer.size()).getCorr();
|
||||
double[] zAutoCorr = new AutoCorrelation(interp.getZ(), mBuffer.size()).getCorr();
|
||||
|
||||
Peaks pX = new Peaks(xAutoCorr, 50, 0.1f, 0, false);
|
||||
Peaks pY = new Peaks(yAutoCorr, 50, 0.1f, 0, false);
|
||||
Peaks pZ = new Peaks(zAutoCorr, 50, 0.1f, 0, false);
|
||||
//find a peak within range of 250 ms
|
||||
int peakWidth = (int) Math.round(250 / sampleRate);
|
||||
Peaks pX = new Peaks(xAutoCorr, peakWidth, 0.1f, 0, false);
|
||||
Peaks pY = new Peaks(yAutoCorr, peakWidth, 0.1f, 0, false);
|
||||
Peaks pZ = new Peaks(zAutoCorr, peakWidth, 0.1f, 0, false);
|
||||
|
||||
mBpmHistory_X.add(pX.getBPM(sampleRate));
|
||||
mBpmHistory_Y.add(pY.getBPM(sampleRate));
|
||||
@@ -80,9 +82,12 @@ public class BpmEstimator {
|
||||
mResetCounter = 0;
|
||||
}
|
||||
else {
|
||||
int resetAfter = (int) Math.round(mResetLimit_ms / (mBuffer.getOverlapSize() * sampleRate));
|
||||
int resetAfter = (int) Math.round(mResetLimit_ms / (mBuffer.getOverlapSize()));
|
||||
if(++mResetCounter > resetAfter){
|
||||
mBpmHistory.clear();
|
||||
|
||||
mBuffer.clear();
|
||||
mMvg.clear();
|
||||
mResetCounter = 0;
|
||||
}
|
||||
return -1;
|
||||
|
||||
@@ -30,4 +30,9 @@ public class MovingFilter {
|
||||
public double getMedian() {
|
||||
return Utils.median(mSamples);
|
||||
}
|
||||
|
||||
public void clear(){
|
||||
mSamples.clear();
|
||||
mTotal = 0d;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user