private void AnalysisVectorLength(EvaluationDataModel evaluationData, EvaluationResultModel evaluationResultModel) { var accelerometerList = evaluationData.AccelerometerSampleAnalysisList; var gyrometerList = evaluationData.GyrometerSampleAnalysisList; if (accelerometerList != null && accelerometerList.Count > 1 && gyrometerList != null && gyrometerList.Count > 1) { int minListsCount = Math.Min(accelerometerList.Count, gyrometerList.Count); for (int i = 0; i < minListsCount; i++) { // Vectorlength Accelerometer TimeSpan currentTimeSpan = accelerometerList.ElementAt(i).MeasurementTime; float currentAccelerometerX = accelerometerList.ElementAt(i).CoordinateX; float currentAccelerometerY = accelerometerList.ElementAt(i).CoordinateY; float currentAccelerometerZ = accelerometerList.ElementAt(i).CoordinateZ; // In kartesischen Koordinaten kann die Länge von Vektoren nach dem Satz des Pythagoras berechnet werden. float accelerometerVectorLength = Convert.ToSingle(Math.Sqrt(Math.Pow(currentAccelerometerX, 2d) + Math.Pow(currentAccelerometerY, 2) + Math.Pow(currentAccelerometerZ, 2))); // Vectorlength Gyrometer float currentGyrometerVelocityX = gyrometerList.ElementAt(i).VelocityX; float currentGyrometerVelocityY = gyrometerList.ElementAt(i).VelocityY; float currentGyrometerVelocityZ = gyrometerList.ElementAt(i).VelocityZ; // In kartesischen Koordinaten kann die Länge von Vektoren nach dem Satz des Pythagoras berechnet werden. float gyrometerVectorLength = Convert.ToSingle(Math.Sqrt(Math.Pow(currentGyrometerVelocityX, 2d) + Math.Pow(currentGyrometerVelocityY, 2) + Math.Pow(currentGyrometerVelocityZ, 2))); evaluationResultModel.EvaluationResultList.Add(new EvaluationSample(currentTimeSpan, accelerometerVectorLength, gyrometerVectorLength)); } } }
private EvaluationResultModel Run(EvaluationDataModel evaluationData, EvaluationSettingModel evaluationSetting) { EvaluationResultModel evaluationResult = new EvaluationResultModel(); AnalysisVectorLength(evaluationData, evaluationResult); AssumingAcceleromterSteps(evaluationResult, evaluationSetting); AssumingGyrometerSteps(evaluationResult, evaluationSetting); DetectSteps(evaluationResult, evaluationSetting); return evaluationResult; }
private void AssumingAcceleromterSteps(EvaluationResultModel evaluationResultModel, EvaluationSettingModel evaluationSetting) { double accelerometerThreshold = evaluationSetting.AccelermeterVectorLengthThreshold; var evaluationList = evaluationResultModel.EvaluationResultList; if (evaluationList != null && evaluationList.Count > 2) { // detect Steps for (int i = 1; i < evaluationList.Count - 1; i++) { double twicePreviousAccelerometerVectorLength = evaluationList.ElementAt(i).AccelerometerVectorLength; double previousAccelerometerVectorLength = evaluationList.ElementAt(i).AccelerometerVectorLength; double currentAccelerometerVectorLength = evaluationList.ElementAt(i).AccelerometerVectorLength; double nextAccelerometerVectorLength = evaluationList.ElementAt(i).AccelerometerVectorLength; double twiceNextAccelerometerVectorLength = evaluationList.ElementAt(i).AccelerometerVectorLength; // is evaluation value not the first one && is evaluation value not the last one if (i > 0) { previousAccelerometerVectorLength = evaluationList.ElementAt(i - 1).AccelerometerVectorLength; } if (i > 1) { twicePreviousAccelerometerVectorLength = evaluationList.ElementAt(i - 2).AccelerometerVectorLength; } if (i < evaluationList.Count - 1) { nextAccelerometerVectorLength = evaluationList.ElementAt(i + 1).AccelerometerVectorLength; } if (i < evaluationList.Count - 2) { twiceNextAccelerometerVectorLength = evaluationList.ElementAt(i + 2).AccelerometerVectorLength; } // Assume accelerometer step if (// find peak (currentAccelerometerVectorLength - previousAccelerometerVectorLength) * (currentAccelerometerVectorLength - nextAccelerometerVectorLength) > 0d && (currentAccelerometerVectorLength - twicePreviousAccelerometerVectorLength) * (currentAccelerometerVectorLength - twiceNextAccelerometerVectorLength) > 0d && // check threshold currentAccelerometerVectorLength.CompareTo(accelerometerThreshold) > 0) { // Set assumed step evaluationList.ElementAt(i).IsAssumedAccelerometerStep = true; } } } }
//################################################################################################################################## //################################################## Save Evaluation data ########################################################## //################################################################################################################################## internal static async Task SaveEvaluationDataToFileAsync(String filename, EvaluationResultModel evaluationResultModel) { if (filename != null && filename != String.Empty && evaluationResultModel.EvaluationResultList.Count > 0) { // convert data into byte array byte[] bytes = evaluationResultModel.ToEvaluationBytes(); if (bytes != null && bytes.Length > 0) { // find folder StorageFolder folder = await FileService.FindStorageFolder(FileService.GetEvaluationPath()); // delete old evaluationData await FileService.DeleteFileAsync(folder, filename); // save byte array await FileService.SaveBytesToEndOfFileAsync(bytes, folder, filename); } } return; }
private void DetectSteps(EvaluationResultModel evaluationResultModel, EvaluationSettingModel evaluationSetting) { TimeSpan stepTimeDistence = evaluationSetting.StepDistance; TimeSpan assumedStepsPairingThreshold = evaluationSetting.PeakJoinDistance; var evaluationList = evaluationResultModel.EvaluationResultList; if (evaluationList != null && evaluationList.Count > 0) { // detect Steps for (int i = 0; i < evaluationList.Count; i++) { // check timespan between to detected steps if (evaluationList.ElementAt(i).MeasurementTime.Subtract(_lastKnownStep) > stepTimeDistence) { // Set assumed accelerometer step if (evaluationList.ElementAt(i).IsAssumedAccelerometerStep) { lastAssumedAcclerometerStepTime = evaluationList.ElementAt(i).MeasurementTime; } // Set assumed gyrometer step if (evaluationList.ElementAt(i).IsAssumedGyrometerStep) { lastAssumedGyrometerStepTime = evaluationList.ElementAt(i).MeasurementTime; } // Vergleichen der zuletzt gefundenen peaks if (lastAssumedAcclerometerStepTime != TimeSpan.Zero && lastAssumedGyrometerStepTime != TimeSpan.Zero) { //Tritt ein, wenn der zuletzt vermutete Accelerometerschritt nach dem zuletzt vermuteten Gyrometerschritt liegt und kleiner als der Schwellwert ist. //oder //Tritt ein, wenn der zuletzt vermutete Acceleroemeterschritt vor dem zuletzt vermuteten Gyrometerschritt liegt und kleiner als der Schwellwert ist. if ((lastAssumedAcclerometerStepTime.CompareTo(lastAssumedGyrometerStepTime) >= 0 && lastAssumedAcclerometerStepTime.Subtract(lastAssumedGyrometerStepTime) < assumedStepsPairingThreshold) || (lastAssumedAcclerometerStepTime.CompareTo(lastAssumedGyrometerStepTime) < 0 && lastAssumedGyrometerStepTime.Subtract(lastAssumedAcclerometerStepTime) < assumedStepsPairingThreshold)) { evaluationList.ElementAt(i).IsDetectedStep = true; _lastKnownStep = evaluationList.ElementAt(i).MeasurementTime; lastAssumedGyrometerStepTime = TimeSpan.Zero; lastAssumedAcclerometerStepTime = TimeSpan.Zero; } // Tritt ein, wenn der zuletzt vermutete Acceleroemeterschritt nach dem zuletzt vermuteten Gyrometerschritt liegt und größer als der Schwellwert ist. else if (lastAssumedAcclerometerStepTime.CompareTo(lastAssumedGyrometerStepTime) > 0 && lastAssumedAcclerometerStepTime.Subtract(lastAssumedGyrometerStepTime) > assumedStepsPairingThreshold) { // Setzt den vermuteten Gyrometerschritt auf null zurück, weil der pairing Schwellwert überschritten wurde. lastAssumedGyrometerStepTime = TimeSpan.Zero; } //Tritt ein, wenn der zuletzt vermutete Acceleroemeterschritt vor dem zuletzt vermuteten Gyrometerschritt liegt und größer als der Schwellwert ist. else if (lastAssumedAcclerometerStepTime.CompareTo(lastAssumedGyrometerStepTime) < 0 && lastAssumedGyrometerStepTime.Subtract(lastAssumedAcclerometerStepTime) < assumedStepsPairingThreshold) { // Setzt den vermuteten Accelerometerschritt auf null zurück, weil der pairing Schwellwert überschritten wurde. lastAssumedAcclerometerStepTime = TimeSpan.Zero; } } } } } }
//################################################################################################################################## //################################################## Save Evaluation data ########################################################## //################################################################################################################################## /// <summary> /// /// </summary> /// <param name="evaluationResultModel"></param> /// <returns></returns> public static async Task AppendEvaluationDataToFileAsync(TaskArguments taskArguments, EvaluationResultModel evaluationResultModel) { if (taskArguments.IsUsedEvaluation && taskArguments.IsRecordSamplesEvaluation && taskArguments.Filename != null && taskArguments.Filename != String.Empty && evaluationResultModel.EvaluationResultList.Count > 0) { // convert data into byte array byte[] bytes = evaluationResultModel.ToEvaluationBytes(); if (bytes != null && bytes.Length > 0) { // find folder StorageFolder folder = await FindStorageFolder(_evaluationPath); // save byte array await SaveBytesToEndOfFileAsync(bytes, folder, taskArguments.Filename); } } return; }