Hallo,
ich habe ein Array mit Double Werten. Alle sind positiv. der höchste Wert ist 320, der niedrigste bei 1. Die Verlauf ist nicht periodisch.
Im Grunde möchte ich alle Peaks auf am Besten 320 normalisieren. Also irgendwie eine Dynamic, die die kleinen Werte klein lässt, die mittelgroßen Peaks auf 320 hebt und die großen auch auf 320 anhebt oder da lässt.
Der folgende Code strecht nur linear alles hoch. Irgendeine Idee?
public static double[] NormalizeStretch(double[] array, double newMin, double newMax)
{
double minValue = double.MaxValue;
double maxValue = double.MinValue;
for (int index = 0; index < array.Length; index++)
{
if (array[index] < minValue) minValue = array[index];
if (array[index] > maxValue) maxValue = array[index];
}
double scaler = (newMax - newMin) / (maxValue - minValue);
for (int index = 0; index < array.Length; index++)
{
array[index] = (array[index] - minValue) * scaler + newMin;
}
return array;
}
Also so ganz verstehe ich deine Anforderung nicht, aber wieso machst du nicht einfach einen Schwellwert (könnte sich ja am Mittelwert orientieren, etc.) ab dem die Peaks auf 320 gehoben werden und ansonsten beschnitten?
Das ist schonmal eine tolle Idee. Mir wäre eine gewisse Dynamik noch lieber. Und alle einfach drüber zu erhöhen macht die Peaks auch irgendwie kaputt.
Ich habe mal ein Bild rangehangen. Was denkst du? Die roten Kringel sind nämlich nicht alle über dem Mittelwert.
Ach jetzt versteh ich was du meinst.
Mit dem Mittelwert müsstest du das Eingangssignal mit einem laufenden Fenster betrachten und kannst dann die Peaks so erkennen.
Ich glaube das ist was du suchst: peak-signal-detection-in-realtime-timeseries-data
Da ist so gar eine C# Implementierung dabei.