Forum: PC-Programmierung Block in Simulink


von Dominik (Gast)


Lesenswert?

Hallo Leute,

hoffe hier haben auch ein paar Ahnung von MATALAB...

Mein Problem: Ich will in Simulink von Signalen laufend den Mittelwert 
von den LETZTEN 100 Werten bilden.
Es gibt einen RMS-Block, der aber nur den RMS-Wert ALLER Eingangswerte 
berechnen kann und sich nicht verstellen lässt. Wenn ich eine Funktion 
in Simulink programmiere wollte, die diese 100 werte speichert, 
aufsummiert und dan einfach durch 100 teilt müsste ich die Werte ja auch 
laufend in den Workspace exportieren und wieder importieren, was 
natürlich nicht sehr sinnvoll ist.
Hat jemand eine Ahnung wie ich mit einer "Embedded Function" in Simulink 
die 100 Werte anders laufend speichern kann oder wie ich das Problem 
sonst lösen könnte?
Vielen Dank schonmal.
Gruß Dominik

von Aussengeländer (Gast)


Angehängte Dateien:

Lesenswert?

Sorry, aber ich habe von Matlab + Simulink keine Ahnung, fange gerade 
damit frisch an. Aber ich schicke dir eine Skript hoch, die ich im 
Internet gefunden gabe. Ich glaube da findest du eine Antwort.

von Dominik (Gast)


Lesenswert?

Danke,
leider steht da auch nichts zu meinem Problem drin. Aber gute 
Einführung.

von Björn (Gast)


Lesenswert?

Das was du da vor hast, ist ja nichts anderes als ein FIR-Filter, bei 
dem Alle Koeffizienten 1/N sind. Das lässt sich in Simulink sehr leicht 
mit den Standard-Toolboxen aufbauen.

von TOM (Gast)


Lesenswert?

Es gibt wie immer mehrere Möglichkeiten:

1. Es gibt einen passenden Block:
   Discrete --> Weighted Moving Average

2. Es gibt Möglichkeiten, dies über ein Filter zu machen. FIR mit 
Standardblöcken wird aufwändig. Aber mit Rückkopplung sollte es doch 
einfach gehen.

3. Mit einer S-Funktion geht das, was du vor hast auch ganz einfach. 
Vergess hin- und herschieben in den Workspace. Eine S-Function kennt 
private static Variablen.

von Björn (Gast)


Lesenswert?

FIR mit Standardblöcken ist nicht aufwendig und vor allen Dingen sehr 
schnell.

Discrete Filter - Block -> (Numerator 1/100 .* ones(1,100)) und 
Denominator [1]

einfacher geht es doch nicht. S-Function - in welcher Sprache auch immer 
- lohnt sich hier nicht.

Weighted Moving Average is natürlich auch ne Möglichkeit

Björn

von michael (Gast)


Lesenswert?

hallo... ich habe das selbe problem und muss auch von den letzen 10 
werten ständig den mittelwert auswerten... quasi wie ein speicher, der 
sich die letzten 10 werte merkt, immer den letzten rausschmeißt, wenn 
der nächste vorne rein kommt und dabei ständig den mittelwert ausgibt. 
welcher simulink block kann das? running rms? bitte um hilfe... lg 
michael

von Björn (Gast)


Lesenswert?

steht doch alles oben!

von Markus (Gast)


Lesenswert?

An Björn,
bei der Verwendung des Filters gibt es allerdings das Problem, dass ich 
den Anfangszustand nicht vorgeben kann.
Ich bin gerade auf deinen Eintrag gestoßen, da ich mit dem Moving 
Average das Problem hab, dass die Ausgangsgröße nicht exakt dem 
Anfangswert entspricht.
Ich nehme an, das ließe sich durch die Angabe der Datentypen beheben, 
was mir bis jetzt allerdings noch nicht gelungen ist.
Hättest du einen anderen Tip?
Diskret nachbauen ist mir zu aufwendig, da ich die letzten 550 Werte 
mitteln möchte.
lg
Markus

von Martin (Gast)


Lesenswert?

An Björn,

ist es möglich, den discrete filter Block auch so zu verwenden, dass der 
Input auch ein Vektor sein kann. Ziel wäre es, die einzelnen Größen des 
Eingangsvektors über die identische Anzahl an Zeitschritten zu mitteln, 
ohne n mal einen block in das Modell ziehen zu müssen.

Vielen Dank schon mal im Voraus,

Martin.

von Basti (Gast)


Lesenswert?

hi,

ich hab mir das alles mal genau durchgelesen, allerdings funktioniert 
mein nachbau nicht so, wie ichs gern hätte.
ich möchte nämlich quasi das absolute maximum meines arrays mit 3000 
stellen, und hab das über den filter probiert.
irgendwas hohes findet er zwar, aber das absolute maximum findet der 
trotzdem nicht.. irgendwelche ideen, könnte sehr gut hilfe brauchen ^^

grüße

von Basti (Gast)


Lesenswert?

bin ich bescheuert.. mittelwert, nicht maximum..
wobeis natürlich gut wär, wenn man das auch noch finden könnte irgendwie 
(wenn wer ideen hat) :D

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.