www.mikrocontroller.net

Forum: PC-Programmierung Block in Simulink


Autor: Dominik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Aussengeländer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Dominik (Gast)
Datum:

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

Autor: Björn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: TOM (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Björn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Björn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
steht doch alles oben!

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.