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

NLMS Filter Dimensionsproblem bei Eingangsvariablen.

 

Breningar
Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 04.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.01.2017, 13:30     Titel: NLMS Filter Dimensionsproblem bei Eingangsvariablen.
  Antworten mit Zitat      
Moin,

ich habe gerade das Problem, dass ich den NLMS Filter nicht zufriedenstellend zum Laufen bekomme.

Ich hatte eigentlich vorgehabt den fertigen Simulink-Block zu benutzen. Da ich aber einen skalaren Wert für den Desired bekomme und eine 1x4-Matrix als Input, bekomme ich beim Testen folgende Fehlermeldung:
Zitat:
Error in port widths or dimensions. Output port 1 of 'Test_NLMS_04_01_17/Real-Imag to Complex' is a [1x4] matrix.
Component:Simulink | Category:Modelerror

Error in port widths or dimensions. Input port 1 of 'Test_NLMS_04_01_17/LMS Filter' is a one dimensional vector with 1 elements.


Also wird hier bemängelt, dass am Inputport des LMS Filters ein nichtkomplexer Vektor mit einem Element, also ein Skalar erwartet wird, davor aber ein komplexer 1x4 Vektor ausgegeben wird. Also heißt das, dass der Desired mir die Dimension des Inputs vorgibt? Ok nicht ganz unlogisch, eigentlich.
So gebe ich testweise einen komlexen 1x4 Vektor als Desired vor, funktioniert der Block, aber ich habe nunmal nur einen nichtkomplexen (ok, dass lässt sich ändern), skalaren Wert als Desired.

Wenn ich nun die Beschreibung von mathsworks mir ansehe, fällt mir folgender Satz Gleichungen auf:
 y(n)= w^{T} (n-1)  \vec{u}(n)

e(n) = d(n)-y(n)

\vec{w}(n) = \alpha\vec{w}(n-1)+ my e(n) \frac{\vec{u}*(n)}{epsilon+\vec{u}^{H}(n) \vec{u}(n)}

Die Umsetzung hier über Formel ist ein bisschen unglücklich, kann aber unter dem oben genannten Link nachgeschaut werden. Der dortigen Darstellung entnehme ich, dass fettgedruckte Variablen für Vektoren stehen.

So da sehe ich jetzt dann für "y(n) = filtered output" einen skalaren Wert, was für mich daraus schließt, dass die Vektoren w(n-1) und u(n) das Skalarprodukt y(n) ergeben.

Demnach sollte doch auch keinerlei Problematik entstehen, wenn ich für Desired einen skalaren Wert, für Input aber einen Vektor nutze.

Ich habe bei meiner Aufgabe eben auch das Problem, dass ich einen Vektor als Inputsignal bekomme (Kosinus/Sinus Serie einer Umdrehungsgeschwindigkeit), als Desired aber den Wert eines Beschleunigungssensors.

Ich habe bereits versucht den NLMS Filter selber nachzubauen, allerdings ohne Erfolg. Eine gewisse Zeit lang sieht der Wert des Errors ganz gut aus, dann aber schießt er in die Höhe, bis die Berechnung bei 10^400 an seine Grenzen kommt :/

Code:
function epsilon= NLMS(a,phi_p)
persistent w
if isempty(w)
    w=[0+0i;
        0+0i;
         0+0i;
          0+0i];
end
y=dot(w,phi_p);
epsilon=a-y;
if phi_p==0
      w=[0+0i;
        0+0i;
         0+0i;
          0+0i];
else
w=0.5*w+0.99995*epsilon*phi_p'/(norm(phi_p)); %hier bin ich mir unsicher, ob es nur epsilon*norm(phi_p) heißen sollte.
end


Im Grunde erstmal stumpf abgeschrieben, aber ich glaube da fehlt auch noch die Filterlänge? Wenn ja, wie und wo? Wird w hier bei einer Filterlänge 10 dann 10 mal berechnet, ehe y und epsilon mit dem neuen Wert berechnet werden? Und wird dann w resetet? So ganz verstehe ich das Ganze leider noch nicht :/

Nun habe ich gedacht, ich gehe das ganze nochmals von vorne an und schaue, ob ich den fertigen Block nicht doch irgendwie für meine Zwecke nutzen kann. Aber da stoße ich eben auf das Problem mit den Dimensionen. Solange der desired skalar ist, kann ich keinen Inputvektor nehmen Sad

Ich hoffe sehr, dass ihr mir helfen könnt dafür eine Lösung zu finden. Leider komme ich damit nicht viel weiter.

Ich habe auch schon mit dem NLMS Filter gespielt und eine Sinuswelle mit einem zufälligen Rauschen belegt. Dies hat der Filter (der vorgefertigte) gut hinbekommen, meiner eher schlecht, aber auch noch erkennbar. Aber dabei war der Input auch nur ein skalarer Eingangswert.

Vielleicht verstehe ich meinen Text aber auch falsch. Ich habe mal einen Ausschnitt hochgeladen. Ich bin der Ansicht, dass u1=\begin{pmatrix} u_1_c_o_s \\ u_1_s_i_n \end{pmatrix} , u2=\begin{pmatrix} u_2_c_o_s \\ u_2_s_i_n \end{pmatrix} usw. ist und phi_p am Ende dann \begin{pmatrix} u_1_c_o_s \\ u_1_s_i_n \\ u_2_c_o_s \\ u_2_s_i_n \\  \\ usw... \end{pmatrix} entspricht.
Vielleicht liege ich hier aber auch schon falsch?

Ich hoffe ihr könnte mir weiterhelfen und vielen Dank

LG Bren

Unbenannt.png
 Beschreibung:

Download
 Dateiname:  Unbenannt.png
 Dateigröße:  50.02 KB
 Heruntergeladen:  402 mal
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 - 2024 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.