package org.spin.gaitlib.util; /** * This class interacts via the JNI (Java Native Interface) to the C code which performs the * spectral analysis. * * @author Bryan Stern, 2011 */ public class SpectralAnalyses { private static final String TAG = "SpectralAnalysis"; static { System.loadLibrary("spectral-analysis"); } // See jni/calcfreq.c for the implementation of this method public static native float[][] fasperArray(float hifac, float ofac, float[] x, float[] y, float[] z, float[] time, int size); public static float fasperResultsMaxFreq(float[][] results) { float max = Float.MAX_VALUE * -1; int index = 0; for (int i = 0; i < results.length; i++) { if (results[i][1] > max) { index = i; max = results[i][1]; } } return results[index][0]; } public static float fasperResultsMinFreq(float[][] results) { float min = Float.MAX_VALUE; int index = 0; for (int i = 0; i < results.length; i++) { if (results[i][1] < min) { index = i; min = results[i][1]; } } return results[index][0]; } /** * @return an array that contains the frequencies associated with the strongest, second * strongest and the weakest power. */ public static float[] fasperResultsMaxMinFreq(float[][] results) { float max = Float.MAX_VALUE * -1; float secondMax = Float.MAX_VALUE * -1; float min = Float.MAX_VALUE; int indexMax = 0; int indexSecondMax = 0; int indexMin = 0; for (int i = 0; i < results.length; i++) { if (results[i][1] > max) { indexSecondMax = indexMax; indexMax = i; secondMax = max; max = results[i][1]; } else if (results[i][1] > secondMax) { indexSecondMax = i; secondMax = results[i][1]; } if (results[i][1] < min) { indexMin = i; min = results[i][1]; } } float[] maxMinFreq = new float[3]; maxMinFreq[0] = results[indexMax][0]; maxMinFreq[1] = results[indexSecondMax][0]; maxMinFreq[2] = results[indexMin][0]; return maxMinFreq; } public static float fasperResultsWeightedAverageFreq(float[][] results) { float weightedSum = 0; float sumPower = 0; for (int i = 0; i < results.length; i++) { weightedSum += results[i][0] * results[i][1]; sumPower += results[i][1]; } return weightedSum / sumPower; } public static double[] fasperResultsFrequenciesAsDoubles(float[][] results) { double[] r = new double[results.length]; for (int i = 0; i < results.length; i++) { r[i] = results[i][0]; } return r; } public static double[] fasperResultsPowersAsDoubles(float[][] results) { double[] r = new double[results.length]; for (int i = 0; i < results.length; i++) { r[i] = results[i][1]; } return r; } public static float confidence(float[][] results) { for (int i = 0; i < results.length; i++) { if (results[i].length == 3) { return (float) 1.000000000000000000000 - results[i][2]; } } return -1; } }