|
|
Startwert bei Filter festlegen |
|
Breningar |

Forum-Anfänger
|
 |
Beiträge: 40
|
 |
|
 |
Anmeldedatum: 04.11.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.11.2016, 15:32
Titel: Startwert bei Filter festlegen
|
 |
|
 |
|
Hi,
da es eben so schön geklappt hat, möchte ich gleich die nächste Frage in den Raum werfen.
Ich muss zunächst mal zugeben, dass ich die vorgegebenen Filter in Matlab nicht ganz so gut nachvollziehen kann, daher habe ich mir meinen Filter selber geschrieben.
Und zwar habe ich in Simulink ein kleines Modell gebastelt, dem ich nun den folgenden NLMS-Filter verpassen möchte:
So nun ist das Ganze mit Sicherheit nicht die eleganteste Lösung, aber für mich noch am ehesten nachvollziehbar. Aber kann ich das so schreiben? Rein logisch könnte ich die ganze if-Funktion ja auch weglassen, da A ja null ist, wenn theta_p null ist, aber ich bin mir eben nicht sicher, ob das ganze funktioniert, wenn ich zu Beginn nicht einmal sage A (oder theta_p) =0
Ich habe das schonmal irgendwo anders gesehen, aber leider finde ich nichts, das mir jetzt passend erscheint und ich bin auch nicht wirklich in dieser Materie drin.
Vielen Dank und LG Bren
|
|
|
|
|
Breningar |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 40
|
 |
|
 |
Anmeldedatum: 04.11.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.11.2016, 15:35
Titel:
|
 |
PS: Da kommt auch noch nen Kalmanfilter auf mich zu, wenn hier reinzufällig jemand mit Wissen über NLMS und Kalmanfilter gesegnet ist, wäre ich für Hilfe extrem dankbar.
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 08.11.2016, 17:17
Titel: Re: Startwert bei Filter festlegen
|
 |
Hallo Breningar,
Was ist Deine Frage?
Zitat: |
Aber kann ich das so schreiben? |
Ja, kannst Du. Es geht aber auch kompakter:
Grundsätzlich sollte man Code, der in beiden IF-Zweigen vorkommt, heraus ziehen, weil doppelter Code Fehler anzieht wie ein Magnet: Man findet einen oder ändert etwas, bedenkt aber nur einen der beiden Zweige.
Gruß, Jan
|
|
|
Breningar |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 40
|
 |
|
 |
Anmeldedatum: 04.11.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 10.11.2016, 10:21
Titel:
|
 |
|
 |
|
Ah das sieht mir tatsächlich nach ner klasse Lösung aus. Meine Frage war etwas schlecht formuliert. Da ich das an anderer Stelle noch brauchen werde, versuche ich sie nochmal anders zu stellen:
Wie werden Variablen am Programmstart von Matlab gesehen, bzw. mit welchem Wert?
Beispielsweise habe ich einen Filter, der mir pro Durchlauf einen Wert auswirft. Die Werte von 4 Durchläufen werden in einem Vektor gesammelt.
Bsp: Im Vektor X werden die Werte E(k) für 4 Durchläufe gesammelt.
Bevor aber der 4. Durchlauf abgeschlossen ist, habe ich ja nicht für alle E einen Wert. Nach dem ersten Durchlauf habe ich z.B. nur E(k), aber nicht E(k-1) E(k-2) E(k-3). Da ich aber einen 4-1 Vektor haben möchte, muss ich die fehlenden Werte mit 0 ansetzen. Und da kommt nun meine Frage: Macht Matlab da automatisch Nullen, wenn kein Wert vorhanden ist?
Im Fall des Vektors hier könnte ich zwar einen 4-1 Vektor mit Nullen erzeugen und dann mit den E(k) füllen, aber der Vektor ist ja nur ein Beispiel. Mich interessiert allgemein wie Matlab eine Variable ohne Wert handhabt, also dafür 0 schreibt oder "keinen Wert" und ich somit immer zuerst einen Wert 0, bzw. Startwert definieren muss.
Bis dahin aber schonmal (wieder) Danke für deine Hilfe und LG
Bren
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 10.11.2016, 10:38
Titel:
|
 |
Hallo,
grundsätzlich kannst du das alles ausprobieren und sehen, was passiert.
Wenn du versuchst auf nicht existierende Daten zuzugreifen, wirst du in MATLAB eine Fehlermeldung bekommen.
Die Funktion
filter
macht das Auffüllen mit Nullen je nach Option automatisch.
Generell würde ich eher versuchen, die von MATLAB und den Toolboxen zur Verfügung gestellten Funktionen zu verstehen als sie selbst zu schreiben.
Grüße,
Harald
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 10.11.2016, 11:57
Titel:
|
 |
Hallo Breningar,
Die Getting Started -Kapitel der Dokumentation klären diese Fragen. Es ist dringend empfohlen sie mal durch zu arbeiten.
Nicht definierte Variablen erzeugen in Matlab eine Fehlermeldung.
Man kann Arrays iterative wachsen lassen:
Das sollte man aber aus Effizienz-Gründen vermeiden, weil dann in jeder Iteration ein neues Array erzeugt wird. Eine "Pre-allocation" ist hier die richtige Lösung:
Und so kann man auch ein Array mit Nullen erstellen.
Gruß, Jan
|
|
|
Breningar |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 40
|
 |
|
 |
Anmeldedatum: 04.11.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 11.11.2016, 10:54
Titel:
|
 |
Hallo und mal wieder danke für die Hilfe.
Zitat: |
Generell würde ich eher versuchen, die von MATLAB und den Toolboxen zur Verfügung gestellten Funktionen zu verstehen als sie selbst zu schreiben. |
Ja das stimmt wohl, aber da die Filter/Algorithmen die ich verwenden möchte, mitunter von den Standartversionen abweichen, habe ich Probleme die Matlab-internen Funktionen so zu belegen, dass ich die nutzen kann. :/
Ich bin auch leider nicht unbedingt der geborene Regelungstechniker, daher versuche ich nach und nach zu verstehen, was ich hier eigentlich tue und bau mein Programm erst einmal ganz "blöd" auf, bevor ich versuche, das Ganze auch elegant zu gestalten.
|
|
|
Breningar |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 40
|
 |
|
 |
Anmeldedatum: 04.11.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 11.11.2016, 11:23
Titel:
|
 |
|
 |
|
Ich fürchte, ich muss nochmal dazu fragen:
Also ich habe das ja als Block in Simulink:
Ich starte nun mit theta_p als [0;0;0;0] Vektor. Außerhalb der Funktion wird dann theta_p_neu über ein Delay (z^-1) als nächster theta_p Wert zurück an die Funktion gegeben, sodass ich im Schritt k=0 für theta_p den Startwert 0 habe und im Schritt k=1 dann irgendeinen neuen Wert, der sich in der Funktion ergeben hat.
So, wenn ich das jetzt richtig erkenne, definiere ich auf diesem Weg aber jedes Mal zu Beginn der Funktion theta_p als [0;0;0;0] Vektor. Dabei möchte ich ja nur einmalig den Startwert Null und dann die Werte, die sich eben aus dem Spaß ergeben.
Und dazu dann gleich auch die Frage nach dem Rücksetzen, wenn ich jetzt einmal mein Programm habe laufen lassen, das Ganze ist fertig, ich starte den nächsten Prozess und möchte dann entsprechend das ganze Programm von vorne starten lassen.
Ganz simpel und einfach würde ich das Ende über ein Signal (Taste xyz oder Sensor xyz) auf einen Eingang legen und sagen:
dann sollten ja alle Werte gelöscht sein und beim nächsten Aufruf von Funktion NLMS (beispiel oben) wird theta_p wieder mit Null belegt und alles beginnt sauber von vorne.
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 11.11.2016, 17:32
Titel:
|
 |
Hallo Breningar,
Brrrr.
clear all
löscht nun wirklich alles aus dem Speicher, was Matlab mühsam dort aufgebaut hat. Danach müssen alle M-Files, Java-Files, Funktionen und persistente Variablen wieder neu von der Platte gelesen bzw. erstellt werden. Sehr lästig und reine Zeitverschwendung.
Lösche immer nur das, was Du wirklich löschen willst.
In Deiner Funktion wird "theta_p" als Input übergeben, dann aber überschrieben. Welche Werte stehen denn in dem Input?
Zitat: |
So, wenn ich das jetzt richtig erkenne, definiere ich auf diesem Weg aber jedes Mal zu Beginn der Funktion theta_p als [0;0;0;0] Vektor. |
Richtig. Sinnvoller wäre es, das außerhalb der Funktion nur einmal zu machen. Da das aber der Teil in Simulink ist, weiß ich nicht, wie und wo du das machst.
Wenn Du zum Start des Simulink-Teils einmal den Vektor mit Nullen definierst, brauchst Du ihn weder zu clearen noch in jeder Iteration neu zu erstellen.
Gruß, Jan
|
|
|
Breningar |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 40
|
 |
|
 |
Anmeldedatum: 04.11.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 15.11.2016, 15:19
Titel:
|
 |
Ich bin mir leider nicht sicher, ob ich dir jetzt 100% folgen konnte.
Das clear all ist zu radikal, ja das mag sein. Ich werde dann am Programmende nur die entsprechenden Variablen löschen.
Welche Werte nachher in theta_p stehen, kann ich noch gar nicht vorhersagen, das ist ein Vektor aus Kosinus- und Sinusserien.
Ich habe im Anhang den Teil von Simulink, in dem der NLMS sitzt als Bild angefügt. theta_p_neu entspricht theta_p (k+1) während theta_p dann theta_p (k) heißt.
In Simulink gebe ich einfach über das Delay z^-1 den voherigen Wert wieder zurück.
Der Block theta_p_Startwert ist leer, den habe ich mir nur als Erinnerung eingebaut und steht dafür, dass ich noch nicht weiß, wie ich den Startvektor für theta_p da einbaue.
Beschreibung: |
|
 Download |
Dateiname: |
Unbenannt.PNG |
Dateigröße: |
13.27 KB |
Heruntergeladen: |
275 mal |
|
|
|
Breningar |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 40
|
 |
|
 |
Anmeldedatum: 04.11.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 15.11.2016, 15:45
Titel:
|
 |
Ich denke, dass es eventuell hilfreich wäre, das Simulink model hoch zu laden. Ich hoffe, dann wird etwas klarer, was ich da versuche.
LG Bren
Beschreibung: |
|
 Download |
Dateiname: |
Controller.slx |
Dateigröße: |
24.01 KB |
Heruntergeladen: |
270 mal |
|
|
|
Breningar |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 40
|
 |
|
 |
Anmeldedatum: 04.11.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 16.11.2016, 13:33
Titel:
|
 |
Ich denke, ich habe jetzt eine unschöne, aber funktionierende Lösung gefunden:
Ich mache einfach einen logischen Vergleich, wenn theta_p größer als Null ist, kommt am init Eingang eine 1 an.
Im Matlab Block habe ich dann:
Wenn also theta_p was hat, wird ganz normal gerechnet, wenn theta_p noch keinen Wert hat, wird einfach der Part A ausgelassen (da ja Vergessensfaktor*0=0 --> logisch^^) und der erste Schritt wird berechnet.
Damit bekomme ich dann am Ende für t=0 ein epsilon von 100 (= Konstante a(k)) und für theta_p einen 6x1-Vektor mit Nullen und dann fortlaufend immer neue Werte, die sich dann entsprechend des Algorithmus berechnen.
Besser als garnix würde ich mal behaupten ¯\_(ツ)_/¯
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2025
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|