Filterung Fernbedienung
Das Signal der Fernbedienung ist sehr stark von Störungen beeinflusst. Die Störungen führen dazu, dass das Signal außerhalb des Arbeitsbereichs liegt und somit die blaue LED angeschaltet wird, d.h. das der RC-Modus angezeigt wird. ( weitere Erläuterungen siehe Bibliothek Sensoren/Aktoren online Block SenFernb-Fernbedienung)
Daher sollte das Signal so gefiltert werden, dass die Störungen vermieden werden. Um zu prüfen, welcher Filter der geeignetste ist, wurden für das Signal SenRti_PwmBreiteGas_f64 mehrere Filter getestet. Es wurden ein einfacher Kalman-Filter, ein rekursiver Mittelwertfilter, die Filterung über die Ableitung und die Filterung über eine if-Bedingung betrachtet. Alle Modelle befinden sich unter ...\SVN_Unterlagen\Software\Filterung_PWM-Signal_Fernbedienung
Um das Signal in den Modellen nachzubilden wird der Block Signal Builder verwendet. Das gestörte Signal wird in einer Excel-Datei gespeichert und dann im Signal Builder geladen.
Rekursiver Mittelwert und Simple Kalman
Beim gewichteten rekursiven Mittelwert-Filter, bzw. Tiefpassfilter, wird der Mittelwert des vorherigen Werts und der aktuelle Wert berücksichtigt. Beide Werte werden über einen Gewichtungsfaktor Alpha gewichtet, d.h. es wird ihnen eine Bedeutung zugewiesen (mehr Vertrauen in Messwert oder Mittelwert). Die Funktion stammt aus der Vorlesung Multisensorsysteme WS2013/14 von Herrn Prof. Dr. Ing. Ulrich Schneider:
function PWM_Breite_Gas_filt_RM = RekursiverMittelwert(x) % % persistent fVorherigeMittelwert k persistent bErsterDurchlauf %% Initalisierung der Variablen bei ertsen Durchlauf if isempty(bErsterDurchlauf) k = 1; fVorherigeMittelwert = 0.0975; bErsterDurchlauf = 1; end alpha = (k - 1) / k; PWM_Breite_Gas_filt_RM = alpha*fVorherigeMittelwert + (1 - alpha)*x; fVorherigeMittelwert = PWM_Breite_Gas_filt_RM; k = k + 1;
Der Kalman-Filter ist deutlich komplexer als der gewichtete, rekursive Mittelwertfilter und kann mehrdimensionale und nicht lineare Systeme filtern. Für einfache eindimensionale Anwendungen ist der Filter dem gewichteten, rekursiven Mittelwertfilter sehr ähnlich. Wesentlicher Unterschied ist, dass beim Mittelwertfilter ein fester Gewichtungsfaktor angenommen wird und beim Kalman-Filter die Gewichtung zwischen Vorhersage und wahrem Wert dynamisch angepasst wird. Die Funktion stammt wiederum aus der Vorlesung Multisensorsysteme:
function PWM_Breite_Gas_filt = SimpleKalman(z) % % persistent A C Q R persistent x P persistent firstRun if isempty(firstRun) %% einmalige Initialisierung A = 1; % Systemmatrix der linearen Zustandsraumdarstellung C = 1; % Ausgangsmatrix der linearen Zustandsraumdarstellung Q = 0.01; % Kovarianzmatrix des Systemrauschens R = 10; % Kovarianzmatrix des Messrauschens x = 0.0975; % in V aktueller Wert P = 5; % Kovarianzmatrix des Schätzfehlers firstRun = 1; end %% Prädiktionsschritt % 1. Vorhersage des Zustandsvektors und der Kovarianz xp = A*x; % Prädiktion der Schätzung Pp = A*P*A' + Q; % Prädiktion der Fehlerkovarianz %% 2. Berechnung der Kalman Verstärkung K K = Pp*C'*inv(C*Pp*C' + R); %% 3. Korrektur der Zustandsschätzung x = xp + K*(z - C*xp); %% 4. Korrektur der Kovarianzschätzung P = Pp - K*C*Pp; %% Ausgang ist die Zustandsschätzung PWM_Breite_Gas_filt = x;
Die Ergebnisse der beiden Filter wurden in einem Scope dargestellt und sehen wie folgt aus:
Im oberen Scope ist das Ergebnis des gewichteten rekursiven Mittelwertfilters, im mittleren Scope das Ergebnis des Simple Kalman, jeweils mit der oberen und unteren Grenze des Arbeitsbereichs und das gestörte Signal und in unteren Scope ist das gestörte Signal allein dargestellt.
Beide Filter liefern nicht das gewünschte Ergebnis.
Ableitung
Das Signal wird abgeleitet. Wenn die Ableitung eines Signals zu groß ist, d.h. das Signal eine zu große Steigung besitzt, wird das Signal nicht weitergeleitet. Die steile Flanke besitzen meisten nur Störungen.
function [PWM_BreiteGas_filt , Zeit, PWM_BreiteGas_Hilfswert] = fcn(PWM_BreiteGas,PWM_BreiteGas_Ableitung,obereGrenze, untereGrenze, Zeitfaktor, Zeitzaehler, Zeitoffset, LetzterWert) if (PWM_BreiteGas_Ableitung < untereGrenze || PWM_BreiteGas_Ableitung > obereGrenze) % Betrachtung, ob der aktuelle Messwert außerhalb der Toleranzgrenze ist) Zeitzaehler = Zeitzaehler + Zeitfaktor; if (Zeitzaehler > Zeitoffset) % Wird die Aktivierungsdauer überschritten, so handelt es sich um keine Störung, sondern um die Betätigung der Fernbedienung PWM_BreiteGas_filt = PWM_BreiteGas; % Der gefilterte Wert enspricht dem Eingangswert; PWM_BreiteGas_Hilfswert = LetzterWert; % Die Hilfsvariable wird nicht benötigt und behält den letzten Wert, der innerhalb der Toleranz lag else PWM_BreiteGas_filt = LetzterWert; % Ist die Aktivierungsdauer noch nicht überschritten, wird der letzte Wert, der innerhalb der Toleranz lag an den gefilterten Wert übergeben PWM_BreiteGas_Hilfswert = LetzterWert; % Die Hilfvariable muss den letzten Wert innerhalb der Toleranz behalten end else % PWM-Signal liegt innerhalb der Toleranzgrenzen PWM_BreiteGas_filt = PWM_BreiteGas; % für gefilterten Wert wird aktueller Messwert übernommen PWM_BreiteGas_Hilfswert = PWM_BreiteGas; % Hilfswert wird hier angelegt Zeitzaehler = 0; end Zeit = Zeitzaehler;
Das sich ergebende Signal sieht wie folgt aus:
Der Filter erfüllt leider nur teilweise seinen Zweck. Er unterdrückt zwar die steigenden Flanken, wenn sich das Signal jedoch über mehrere Zeitschritte auf einer Stufe hält, wird die Steigung zu Null und das gefilterte Signal zieht dennoch der Störung nach.
if-Bedingung
function [PWM_BreiteGas_filt , Zeit, PWM_BreiteGas_Hilfswert] = fcn(PWM_BreiteGas, obereGrenze, untereGrenze, Zeitfaktor, Zeitzaehler, Aktivierungsdauer, LetzterWert)
if (PWM_BreiteGas < untereGrenze || PWM_BreiteGas> obereGrenze) % Betrachtung, ob der aktuelle Messwert außerhalb der Toleranzgrenze ist) Zeitzaehler = Zeitzaehler + Zeitfaktor; % Wenn ja, wird ein Zeitzaehler gestartet. Dieser wird bei jedem erneuten Durchgang um den Zeitfaktor mit dem das Programm läuft hochgesetzt if (Zeitzaehler > Aktivierungsdauer) % Wird die Aktivierungsdauer überschritten, so handelt es sich um keine Störung, sondern um die Betätigung der Fernbedienung PWM_BreiteGas_filt = PWM_BreiteGas; % Der gefilterte Wert enspricht dem Eingangswert; PWM_BreiteGas_Hilfswert = LetzterWert; % Die Hilfsvariable wird nicht benötigt und behält den letzten Wert, der innerhalb der Toleranz lag else PWM_BreiteGas_filt = LetzterWert; % Ist die Aktivierungsdauer noch nicht überschritten, wird der letzte Wert, der innerhalb der Toleranz lag an den gefilterten Wert übergeben PWM_BreiteGas_Hilfswert = LetzterWert; % Die Hilfvariable muss den letzten Wert innerhalb der Toleranz behalten end else % PWM-Signal liegt innerhalb der Toleranzgrenzen PWM_BreiteGas_filt = PWM_BreiteGas; % für gefilterten Wert wird aktueller Messwert übernommen PWM_BreiteGas_Hilfswert = PWM_BreiteGas; % Hilfswert wird hier angelegt Zeitzaehler = 0; % Hier wird der Zeitzähler wieder zurückgesetzt, sobald die Messwerte im Toleranzbereich liegen end Zeit = Zeitzaehler;
Autor: Julia Müller (Diskussion) 18:38, 6. Feb. 2014 (CET)