public static double[] GetOscillationArrayUsingWpd(double[,] xCorrByTimeMatrix, double sensitivity, int binNumber) { int xCorrLength = xCorrByTimeMatrix.GetLength(0); int sampleCount = xCorrByTimeMatrix.GetLength(1); double[] oscillationsVector = new double[xCorrLength / 2]; for (int e = 0; e < sampleCount; e++) { var autocor = MatrixTools.GetColumn(xCorrByTimeMatrix, e); autocor = DataTools.DiffFromMean(autocor); var wpd = new WaveletPacketDecomposition(autocor); double[] spectrum = wpd.GetWPDEnergySpectrumWithoutDC(); // reduce the power in first coeff because it can dominate - this is a hack! spectrum[0] *= 0.5; spectrum = DataTools.SquareValues(spectrum); // get relative power in the three bins around max. double sumOfSquares = spectrum.Sum(); //double avPower = spectrum.Sum() / spectrum.Length; int maxIndex = DataTools.GetMaxIndex(spectrum); double powerAtMax = spectrum[maxIndex]; if (maxIndex == 0) { powerAtMax += spectrum[maxIndex]; } else { powerAtMax += spectrum[maxIndex - 1]; } if (maxIndex >= spectrum.Length - 1) { powerAtMax += spectrum[maxIndex]; } else { powerAtMax += spectrum[maxIndex + 1]; } double relativePower1 = powerAtMax / sumOfSquares; if (relativePower1 > sensitivity) { // check for boundary overrun if (maxIndex < oscillationsVector.Length) { // add in a new oscillation oscillationsVector[maxIndex] += powerAtMax; } } } return(LogTransformOscillationVector(oscillationsVector, sampleCount)); }
public static double[] GetOscillationArrayUsingWpd(double[,] xCorrByTimeMatrix, double sensitivity, int binNumber) { int xCorrLength = xCorrByTimeMatrix.GetLength(0); int sampleCount = xCorrByTimeMatrix.GetLength(1); double[] oscillationsVector = new double[xCorrLength / 2]; for (int e = 0; e < sampleCount; e++) { double[] autocor = MatrixTools.GetColumn(xCorrByTimeMatrix, e); // ##########################################################\ autocor = DataTools.DiffFromMean(autocor); WaveletPacketDecomposition wpd = new WaveletPacketDecomposition(autocor); double[] spectrum = wpd.GetWPDEnergySpectrumWithoutDC(); // reduce the power in first coeff because it can dominate - this is a hack! spectrum[0] *= 0.66; spectrum = DataTools.SquareValues(spectrum); // get relative power in the three bins around max. double sumOfSquares = spectrum.Sum(); //double avPower = spectrum.Sum() / spectrum.Length; int maxIndex = DataTools.GetMaxIndex(spectrum); double powerAtMax = spectrum[maxIndex]; if (maxIndex == 0) { powerAtMax += spectrum[maxIndex]; } else { powerAtMax += spectrum[maxIndex - 1]; } if (maxIndex >= spectrum.Length - 1) { powerAtMax += spectrum[maxIndex]; } else { powerAtMax += spectrum[maxIndex + 1]; } double relativePower1 = powerAtMax / sumOfSquares; //double relativePower2 = powerAtMax / avPower; if (relativePower1 > sensitivity) //if (relativePower2 > 10.0) { // check for boundary overrun if (maxIndex < oscillationsVector.Length) { // add in a new oscillation oscillationsVector[maxIndex] += powerAtMax; //oscillationsVector[maxIndex] += relativePower; } } } for (int i = 0; i < oscillationsVector.Length; i++) { // NormaliseMatrixValues by sample count oscillationsVector[i] /= sampleCount; // do log transform if (oscillationsVector[i] < 1.0) { oscillationsVector[i] = 0.0; } else { oscillationsVector[i] = Math.Log10(1 + oscillationsVector[i]); } } return(oscillationsVector); }