Hysterese Runde zu lösen "flackern" die Werte aufgrund von Rauschen
Hintergrund:
Wir haben ein embedded system und wandelt die lineare Positionen (0 mm - 40 mm) aus einem potentiometer-Spannung zu seiner digitalen Wert mit einer 10-bit-analog-zu-digital-Wandler.
------------------------
0mm | | 40 mm
------------------------
Zeigen wir dem Benutzer die lineare position in 1 mm-Schritten. Ex. 1mm, 2mm, 3mm, etc.
Das problem:
Unser system verwendet werden kann in elektromagnetisch verrauschten Umgebungen, die dazu führen können die lineare position zu "flimmern" wegen Lärmbelästigung der ADC. Zum Beispiel, wir werden sehen Werte wie: 39,40,39,40,39,38,40 etc. wenn das potentiometer bei 39 mm.
Da wir die Rundung an jedem 1 mm, wir werden sehen, flimmern zwischen 1 und 2, wenn der Wert wechselt zwischen 1,4 und 1,6 mm zum Beispiel.
Vorgeschlagenen software-Lösung:
Vorausgesetzt, wir können nicht die hardware ändern, ich möchte etwas Hysterese um die Rundung der Werte zu vermeiden, dieses flackern. So dass:
Wenn der Wert liegt derzeit bei 1mm, kann es nur gehen um 2mm iff der raw-Wert von 1,8 oder höher.
Ebenso, wenn der aktuelle Wert 1mm es kann nur gehen, 0mm iff der raw-Wert ist 0,2 oder geringer.
Schrieb ich die folgende einfache app zu testen meine Lösung. Bitte lassen Sie mich wissen, wenn ich bin auf dem richtigen Weg sind, oder wenn Sie eine Beratung haben.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PDFSHysteresis
{
class Program
{
static void Main(string[] args)
{
double test = 0;
int curr = 0;
Random random = new Random();
for (double i = 0; i < 100; i++)
{
test = test + random.Next(-1, 2) + Math.Round((random.NextDouble()), 3);
curr = HystRound(test, curr, 0.2);
Console.WriteLine("{0:00.000} - {1}", test, curr);
}
Console.ReadLine();
}
static int HystRound(double test, int curr, double margin)
{
if (test > curr + 1 - margin && test < curr + 2 - margin)
{
return curr + 1;
}
else if (test < curr - 1 + margin && test > curr - 2 + margin)
{
return curr - 1;
}
else if (test >= curr - 1 + margin && test <= curr + 1 - margin)
{
return curr;
}
else
{
return HystRound(test, (int)Math.Floor(test), margin);
}
}
}
}
Beispiel-Ausgabe:
Raw HystRound
====== =========
00.847 1
00.406 1
01.865 2
01.521 2
02.802 3
02.909 3
02.720 3
04.505 4
06.373 6
06.672 6
08.444 8
09.129 9
10.870 11
10.539 11
12.125 12
13.622 13
13.598 13
14.141 14
16.023 16
16.613 16
- Ich könnte mir vorstellen, dass simple time domain averaging wäre eine bessere Möglichkeit zur Verringerung der Auswirkungen von Lärm.
- Außerdem: was ist Ihre Frage?
- Frage: Ist dies eine gute Lösung für das Lärm-problem?
- Es ist keins von der Art, die Sie fordern. Das signal ist tatsächlich laut, können Sie nicht-stick, die unter der Matte. Wenn es springt zwischen 1.49 und 1,51, dann kein Betrag der Filterung wird um ihn zu stoppen, spiegeln hin und her zwischen 1 und 2. Können Sie nur verlangsamen. Und zeigt eine zusätzliche Ziffer, damit Ihre Benutzer versteht, warum.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie wäre es mit dem Durchschnitt der Messwerte der letzten N Sekunden, wobei N konnten ziemlich klein /sub-Sekunden-je nach sample-rate?
Können Sie eine einfache lineare Mittelwert, oder etwas komplizierter, je nach Ihren Bedürfnissen. Mehrere moving average algorithmen sind detailliert in der Wikipedia:
http://en.wikipedia.org/wiki/Moving_average
Je nach Empfindlichkeit /Reaktionsfreudigkeit Bedürfnisse, könnten Sie einen reset der Durchschnitt, wenn eine neue Lesung übersteigt der laufende Durchschnitt um X%.
Ich zu tun hatte etwas ähnliches vor einiger Zeit, wo ich Lesen musste Ausgangsspannung aus einer Schaltung und Anzeige von Grafik auf einem computer-Bildschirm. Die bottom line ist, das hängt wirklich von Ihrem system-Anforderungen. Wenn die Anforderung ist "1mm" Genauigkeit dann gibt es nichts, was Sie wirklich tun konnten. Ansonsten, wie oben erwähnt, könnten Sie gehen mit mehrere Methoden, die Ihnen helfen kann zu vermindern die flackern. Sie können:
39, 40, 39, 38
Lesen würde als39mm
Ich denke, Gareth Rees gab eine ausgezeichnete Antwort auf eine sehr ähnliche Frage:
wie Sie verhindern, dass Reihe von zahlen haben den gleichen Wert zu oft