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

Gleitender Maximalwert?

 

Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.08.2009, 09:24     Titel: Gleitender Maximalwert?
  Antworten mit Zitat      
Moin!

Ich stehe vor einem ziemlich kniffligen Problem, das eigentlich gar nicht so knifflig sein sollte, wie es ist...

Und zwar möchte ich in Echtzeit einen gleitenden Maximalwert von einem Signal erhalten. Das Zeitfenster, über das das Signal betrachtet werden soll, sollte dabei einstellbar sein. Es muss aber nicht zwingend während der Simulation veränderbar sein.

Das dümmste, was mir eingefallen ist, ist eine Konstruktion aus zigtausend Unit-Delays in Reihe. Da bestimme ich dann den Maximalwert aller Ausgangswerte der Unit-Delay-Blöcke. Das funktioniert auch, ist allerdings ziemlich langsam. Und schlecht einstellbar noch dazu.

Gibt es da vielleicht eine etwas clevere Lösung?

Markus
Private Nachricht senden Benutzer-Profile anzeigen


Tim
Forum-Century

Forum-Century



Beiträge: 140
Anmeldedatum: 03.11.07
Wohnort: Stuttgart
Version: 2011b+aktuellstes Release
     Beitrag Verfasst am: 10.08.2009, 11:53     Titel:
  Antworten mit Zitat      
Den "weighted moving average"-block mit Vektor
Code:


Mit (zur Laufzeit) variabler Länge wird das ein wenig aufwändiger. Auch das obige ließe sich wohl performanter lösen, aber für den ersten Schuss sollte das ausreichen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.08.2009, 12:32     Titel:
  Antworten mit Zitat      
Hallo Tim,

danke erstmal für die Antwort! Ich suche den Maximalwert in einem Zeitfenster von z.B. "jetzt-30s" bis "jetzt", nicht den Mittelwert. Das ganze soll zur Normierung eines Signals dienen, das ich vor der Simulation noch nicht kenne.

Hatte beim Mittagessen aber gerade noch eine gute Idee. Und zwar ein Function-Block der den aktuellen Wert an einen Vektor anhängt und den ältesten Wert aus dem Vektor löscht. Also sozusagen ein Schieberegister in einem Vektor statt mit lauter 1/z-Gliedern.
Wie das mit der definierten Zeit hinhaut, muss ich mal gucken...
Private Nachricht senden Benutzer-Profile anzeigen
 
Tim
Forum-Century

Forum-Century



Beiträge: 140
Anmeldedatum: 03.11.07
Wohnort: Stuttgart
Version: 2011b+aktuellstes Release
     Beitrag Verfasst am: 10.08.2009, 14:05     Titel:
  Antworten mit Zitat      
Peinlich, da hab ich mich total verlesen Embarassed

Das Problem klingt interessant. Spontan fällt mich auch kein besserer Algorithmus ein als immer wieder das Max aus dem Vektor rauszusuchen. Ich werde mir da mal interessehalber Gedanken machen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.08.2009, 14:16     Titel:
  Antworten mit Zitat      
Habe es jetzt mit einem eingebautem m-file zusammengefrickelt. Ist schon bedeutend schneller, aber immernoch nicht wirklich überzeugend.

Code:

    persistent werte;
    if isempty(werte)
        werte = zeros(1000,1); %1000 Schritte aufzeichnen
    end
    werte = [werte(2:end); neuer_wert];
    maximum = max(abs(werte(:)));
 


Ist nicht sonderlich schön mit der persistent-variablen. Hatte zuvor eine Schleife um die Funktionsbox rumgelegt und dort ein Initial-Condition-Block drin zur Initialisierung des Vektors. Da hat er dann wegen algebraic loop gemeckert. Das tut er in der aktuellen Lösung auch, habe es dann aber nicht wieder zurückgebaut.

Auch, wenn ich das ganze als s-function (m-file) anlege, ist es nicht wirklich schnell. Zumal die 1000 Werte noch um Faktor 10 zu wenig sind...
Private Nachricht senden Benutzer-Profile anzeigen
 
Volker81k
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 12.05.09
Wohnort: Zürich
Version: R2006a
     Beitrag Verfasst am: 11.08.2009, 09:06     Titel:
  Antworten mit Zitat      
Hallo Martin,

ich habe einen Lösungsansatz für dich, der aber vorraussetzt, dass du ein Signal hast was während deines Zeitfensters anliegt.

Dabei wird dein Signal in einem Max-Block verglichen, der sich das grössere Signal selbst über einen speichernden Loop zuführt. Das ganze wird hübsch in ein Subsystem gepackt, das mit einem Enable-Eingang versehen ist, um den Zeitpunkt der Max-Wertbestimmung festzulegen.

Hilft dir das?

Viele Grüsse
Volker

GleitenderMax.mdl
 Beschreibung:
Maximalwertermittlung für einen einstellbaren Zeitraum

Download
 Dateiname:  GleitenderMax.mdl
 Dateigröße:  27.72 KB
 Heruntergeladen:  738 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.08.2009, 09:29     Titel:
  Antworten mit Zitat      
Markus, nicht Martin ;)

Mein Zeitfenster wandert über meine Messwerte. Ich möchte also immer den Maximalwert aus den letzten (z.B. 10) Sekunden. Wenn ein Maximalwert länger als 10 Sekunden zurückliegt, wird er nicht mehr beachtet und es gilt ein neuer.
In der Anwendung soll das ganze eine dynamische Normierung eines Signals werden.

Wenn ich das richtig sehe, ist bei Deiner Lösung das Zeitfenster über den Impuls oben fix, wandert also nicht mit. Im Prinzip wäre die Startzeit für den Impuls bei mir immer "aktuelle Zeit - Fenstergröße" und die Endzeit "aktuelle Zeit" - kann man aber in dem Modell leider nicht so einbauen. Oder vertu ich mich da?
Private Nachricht senden Benutzer-Profile anzeigen
 
HansWerner
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 21.03.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.08.2009, 20:47     Titel:
  Antworten mit Zitat      
Hallo Epfi,

beim Stichwort gleitender Maximalwert fällt mir sofort der Buffer-Block ein. Einstellung Überlappend. Nun aus den im Buffer befindlichen Werten den Maximalwert raussuchen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Tim
Forum-Century

Forum-Century



Beiträge: 140
Anmeldedatum: 03.11.07
Wohnort: Stuttgart
Version: 2011b+aktuellstes Release
     Beitrag Verfasst am: 11.08.2009, 20:55     Titel:
  Antworten mit Zitat      
Wäre es eventuell denkbar den Ansatz abzuändern und nicht eine gleitende Maximalwertsuche zu machen, sondern sowas wie eine kontinuierliche Spitzenwertmessung? Das wäre deutlich performanter und weniger Speicherlastig.

Ansonsten ist HansWerners Tip goldrichtig. Wusste gar nicht, dass es sowas fertig in SL gibt. In TL hab ich mir das immer selbst zusammengebaut Very Happy
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.