Datum:
Hallo zusammen, ich habe einen kontinuierlichen Strom an Messwerten und möchte mir aus diesen einen gleitenden Durchschnitt errechnen. Habe mir dazu einen Vektor mit den Werten angelegt und bilde über diesen den Mittelwert - bei einem neuen Messwert wird der älteste entfernt und der neue hinzugefügt. So weit so gut. Da es aber eigentlich 3 Messdatenströme mit long Werten sind und die Mittelwerte am besten über ca. 500 Werte gebildet werden ist das schon eine Menge Speicherbedarf. Der MSP430FG439 hat 2kB RAM und da ich die Vektoren mit den Messwerten als globale Variablen speicher scheint es ein Problem mit dem RAM zu geben. Zumindest gibt mir die IAR Workbench ab ca. 150 Messwerten zur Mittelung beim Linken folgende Fehlermeldung:
Error[e16]: Segment DATA16_Z (size: 0xb18 align: 0x1) is too long for segment definition. At least 0x31a more bytes needed. The problem occurred while processing the segment placement command "-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=0200-09FF", where at the moment of placement the available memory ranges were "CODE:201-9ff" Reserved ranges relevant to this placement: 200-9ff DATA16_I |
Das beste wäre es den RAM zu entlasten - aber wie kann ich das machen? Auf andere Berechnungs-Methoden wie z.B.: MW(n+1) = ( MW(n) * (N-1) + x(n) ) / N möchte ich eigentlich nicht zurückgreifen. Wäre toll, wenn jemand eine Idee dazu hätte.
Datum:
Naja, 3x500 LWords = 6000Byte passen da einfach nicht rein ... 3x150 LWords = 1800Byte - ja, da ist irgendwo die Grenze. Benötigst Du einen kontinuierlichen Mittelwert, oder reicht einer alle 500 Samples? Gruß Jobst
Datum:
Hallo Dennis, schlage vor, vorausgesetzt dass die Umgebung es zulässt, und dazu noch Paar I/O frei sind, den gebrauch von Seriellen SRAM’s zu machen. Díese gibt’s beispielsweise von Microchip. http://www.microchip.com/stellent/idcplg?IdcServic... Eine Softwarelösung kann ich dir leider nicht bieten. Gruß gtf
Datum:
Dennis A. schrieb: > Auf andere Berechnungs-Methoden wie z.B.: > > MW(n+1) = ( MW(n) * (N-1) + x(n) ) / N > > möchte ich eigentlich nicht zurückgreifen. was spricht denn gegen den mittelwertsatz ? performance probleme oder sorgen um die genauigkeit ? normalerweise nimmt man den gerade für sowas
Datum:
Dennis A. schrieb: > möchte mir aus > diesen einen gleitenden Durchschnitt errechnen ... ziehe meine Frage zurück :-) Gruß Jobst
Datum:
Dennis A. schrieb: > So weit so gut. Da es aber eigentlich 3 Messdatenströme mit long Werten > sind und die Mittelwerte am besten über ca. 500 Werte gebildet werden > ist das schon eine Menge Speicherbedarf. Idee: Wie wäre es, wenn du jeweils zb 10 Messwerte zusammenfasst und von diesen den Mittelwert speicherst. Dann sampelst du erneut 10 Messwerte, bildest davon den Mittelwert, schmeisst den ältesten 10-er Mittelwert raus, den neuen rein und mittelst über diese 50 Mittelwerte. Anstelle von 500 Werten musst du nur 50 speichern und hast trotzdem über 500 Messwerte gemittelt, die du allerdings nur alle 10 Werte aktualisieren kannst.
Datum:
Mit ein wenig schummeln kann man sogar die Aktualisierungsrate gleich der Messrate halten: Einfach beim Messen+Aufsummieren der neuen 10 Werte noch die fehlenden Messwerte für den Mittelwert durch den Ältesten Mittelwert ersetzen. Gruß Anja
Datum:
Vielen Dank für eure Antworten, werde die Lösung von Karl heinz Buchegger implementieren, die könnte genau das sein was ich brauche. Wenn es dann zu langsam wird, dann ist zusätzlicher RAM sicher eine Überlegung wert.
Datum:
@ Andi D. Den Mittelwertsatz möchte ich nicht verwenden, da ich immer eine definierte Anzahl an vergangenen Messwerten betrachten möchte. Mein Messdatenstrom ändert sich mit der Zeit, und mit dem Mittelwertsatz gewichte ich ja über alle Messungen. Sprich wenn mein Pegel 100000 Messwerte auf 1 bleibt und dann für 100 Messwerte auf 2 springt, tut sich beim Mittelwert nicht viel und ich bekomme den Sprung somit nicht mit. Deswegen möchte ich eben nur die letzten Werte betrachten und nicht alle. Im Prinzip möchte ich nur den Noise in meinem Datenstrom etwas glätten.
Datum:
Du kannst ein IIR Filter nehmen. Je nach Ordnung / Grenzfrequenz filtert es dir dein Noise weg und den Sprung bekommst du auch mit. Gruss Helmi
Datum:
>und den Sprung bekommst du auch mit.
Da stellt sich dann die Frage, wie die Sprungantwort sein soll/darf :-)



