90 lines
3.3 KiB
C#
90 lines
3.3 KiB
C#
|
|
using DTS.Common.Utilities;
|
|||
|
|
using DTS.Common.Utilities.SaeJ211;
|
|||
|
|
using System.Linq;
|
|||
|
|
|
|||
|
|
namespace DTS.Utilities
|
|||
|
|
{
|
|||
|
|
public static class DataConditioning
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// returns an integer part of a string that might contain a decimal
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="o"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static int GetIntegerIfPossible(object o)
|
|||
|
|
{
|
|||
|
|
if (null == o) { throw new System.Exception("expected non null input parameter"); }
|
|||
|
|
var s = o.ToString();
|
|||
|
|
var index = s.IndexOf(".");
|
|||
|
|
if (index == 0) { return 0; }
|
|||
|
|
if (index > 0) { s = s.Substring(0, index); }
|
|||
|
|
return int.Parse(s);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// Gets Zered EU data given a time window to average
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="euData"></param>
|
|||
|
|
/// <param name="sampleRate"></param>
|
|||
|
|
/// <param name="triggerSample"></param>
|
|||
|
|
/// <param name="startTime"></param>
|
|||
|
|
/// <param name="endTime"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static double[] GetAverageOverTimeEuData(
|
|||
|
|
double[] euData,
|
|||
|
|
double sampleRate,
|
|||
|
|
double triggerSample,
|
|||
|
|
double startTime,
|
|||
|
|
double endTime)
|
|||
|
|
{
|
|||
|
|
double[] zeroedEuData;
|
|||
|
|
var duration = endTime - startTime; //.3 - .2 = .1
|
|||
|
|
var startSample = (int)(triggerSample + (startTime * sampleRate));
|
|||
|
|
var endSample = (int)(startSample + (duration * sampleRate));
|
|||
|
|
var numSamples = endSample - startSample;
|
|||
|
|
if (numSamples <= 0) return euData;
|
|||
|
|
if (numSamples > euData.Length) return euData;
|
|||
|
|
var averagingSamples = new double[numSamples];
|
|||
|
|
var i = 0;
|
|||
|
|
for (var sampleNum = startSample; sampleNum < endSample; sampleNum++)
|
|||
|
|
{
|
|||
|
|
averagingSamples[i] = euData[sampleNum];
|
|||
|
|
i++;
|
|||
|
|
}
|
|||
|
|
var average = averagingSamples.Average();
|
|||
|
|
|
|||
|
|
var zeroedDataIndex = 0;
|
|||
|
|
zeroedEuData = new double[euData.Length];
|
|||
|
|
foreach (var sample in euData)
|
|||
|
|
{
|
|||
|
|
zeroedEuData[zeroedDataIndex] = sample - average; //If average is a negative number, the sample will be increased
|
|||
|
|
zeroedDataIndex++;
|
|||
|
|
}
|
|||
|
|
return zeroedEuData;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static double[] GetFilteredZeroedEUData(
|
|||
|
|
double[] euData,
|
|||
|
|
int filterRate,
|
|||
|
|
double sampleRate,
|
|||
|
|
double triggerSample,
|
|||
|
|
double startTime,
|
|||
|
|
double endTime)
|
|||
|
|
{
|
|||
|
|
return GetFilteredEUData(GetAverageOverTimeEuData(euData, sampleRate, triggerSample, startTime, endTime), filterRate, sampleRate);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static double[] GetFilteredEUData(double[] euData, int filterRate, double sampleRate)
|
|||
|
|
{
|
|||
|
|
if (filterRate <= 0) return euData;
|
|||
|
|
var filterUtility = new FilterUtility
|
|||
|
|
{
|
|||
|
|
Cfc = ChannelFilter.AdHoc,
|
|||
|
|
AdHocFrequency = filterRate,
|
|||
|
|
SampleRate = sampleRate
|
|||
|
|
};
|
|||
|
|
var filteredData = filterUtility.ApplyFilter(euData);
|
|||
|
|
return filteredData;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|