WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Startwert bei Filter festlegen

 

Breningar
Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 04.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.11.2016, 15:32     Titel: Startwert bei Filter festlegen
  Antworten mit Zitat      
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:

Code:
function theta_p_neu = NLMS(theta_p, phi_p, epsilon, Schrittweite, Vergessensfaktor)

if theta_p > 0
A= Vergessensfaktor * theta_p;
B= (phi_p * epsilon/ sqrt(norm(phi_p));
theta_p_neu = A+2*Schrittweite*B;
else
A=0;
B= (phi_p * epsilon/ sqrt(norm(phi_p));
theta_p_neu = A+2*Schrittweite*B;
end
end


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
Private Nachricht senden Benutzer-Profile anzeigen


Breningar
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 04.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.11.2016, 15:35     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.11.2016, 17:17     Titel: Re: Startwert bei Filter festlegen
  Antworten mit Zitat      
Hallo Breningar,

Was ist Deine Frage?

Zitat:
Aber kann ich das so schreiben?

Ja, kannst Du. Es geht aber auch kompakter:

Code:
function theta_p_neu = NLMS(theta_p, phi_p, epsilon, Schrittweite, Vergessensfaktor)

A= Vergessensfaktor * max(0, theta_p);
B= (phi_p * epsilon/ sqrt(norm(phi_p));
theta_p_neu = A+2*Schrittweite*B;
end

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Breningar
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 04.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2016, 10:21     Titel:
  Antworten mit Zitat      
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.
Code:
X=[E(k) E(k-1) E(k-2) E(k-3)]


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
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.11.2016, 10:38     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 10.11.2016, 11:57     Titel:
  Antworten mit Zitat      
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:
Code:
x = [];
for k = 1:4
  x(k) = k;
end

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:
Code:
x = zeros(1, 4);
for k = 1:4
  x(k) = k;
end

Und so kann man auch ein Array mit Nullen erstellen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Breningar
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 04.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2016, 10:54     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Breningar
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 04.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2016, 11:23     Titel:
  Antworten mit Zitat      
Ich fürchte, ich muss nochmal dazu fragen:

Also ich habe das ja als Block in Simulink:

Code:
function theta_p_neu = NLMS(theta_p, phi_p, epsilon, Schrittweite, Vergessensfaktor, nl)
theta_p=zeros(nl,1);
A=Vergessensfaktor*theta_p;
B=(phi_p*epsilon)/sqrt(norm(phi_p);
theta_p_neu=A+2*Schrittweite*B;
end
 


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:
Code:
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.11.2016, 17:32     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Breningar
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 04.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2016, 15:19     Titel:
  Antworten mit Zitat      
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.

Unbenannt.PNG
 Beschreibung:

Download
 Dateiname:  Unbenannt.PNG
 Dateigröße:  13.27 KB
 Heruntergeladen:  275 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Breningar
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 04.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2016, 15:45     Titel:
  Antworten mit Zitat      
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

Controller.slx
 Beschreibung:

Download
 Dateiname:  Controller.slx
 Dateigröße:  24.01 KB
 Heruntergeladen:  270 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Breningar
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 04.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2016, 13:33     Titel:
  Antworten mit Zitat      
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:

Code:
function theta_p_neu = NLMS(theta_p,init, phi_p, Schrittweite, Vergessensfaktor, epsilon)
if init > 0    
A=Vergessensfaktor*theta_p;
B=(phi_p*epsilon)/sqrt(norm(phi_p));
theta_p_neu=A+2*Schrittweite*B;
else
theta_p_neu=2*Schrittweite*((phi_p*epsilon)/sqrt(norm(phi_p)));
end
end

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 ¯\_(ツ)_/¯
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button 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.