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.
InformationsquelleAutor Ryan R | 2012-05-01
Schreibe einen Kommentar