Berechnen von Moving Average Dieses VI berechnet und zeigt den gleitenden Durchschnitt mit einer vorgewählten Nummer an. Zuerst initialisiert das VI zwei Schieberegister. Das obere Schieberegister wird mit einem Element initialisiert und fügt dann den vorherigen Wert kontinuierlich mit dem neuen Wert hinzu. Dieses Schieberegister hält die Summe der letzten x Messungen. Nach dem Teilen der Ergebnisse der Additionsfunktion mit dem vorgewählten Wert berechnet das VI den gleitenden Mittelwert. Das untere Schieberegister enthält ein Array mit der Dimension Average. Dieses Schieberegister hält alle Werte der Messung. Die Ersatzfunktion ersetzt den neuen Wert nach jeder Schleife. Dieses VI ist sehr effizient und schnell, weil es die ersetzen Element-Funktion innerhalb der while-Schleife verwendet, und es initialisiert das Array, bevor es in die Schleife eintritt. Dieses VI wurde in LabVIEW 6.1 erstellt. Bookmark amp ShareSimple Moving Average VI Normalerweise, wenn Leute über einen Moving Average sprechen, bedeuten sie, ersetzen Punkt N mit dem Durchschnitt von M Punkten um Punkt N. Angenommen, ich habe 100 Punkte, deren Werte sind 1, 2, 3. 100, und ich möchte Mache einen 5-Punkt-Moving Average. Das erste, was zu beachten ist, dass es einen gleitenden Durchschnitt des dritten Punktes ist der Durchschnitt von 1, 2, 3, 4, 5 3. Der Durchschnitt des vierten Punktes ist der Durchschnitt von 2, 3, 4, 5, 6 4. Das ist aber vielleicht ein zu einfaches Beispiel. Wie wäre es mit dem Mittelwert einer Schrittfunktion, 0 von 1 bis 10, dann 20 danach. Wieder die Punkte 1 und 2 auswerfen. Der Durchschnitt der Punkte 1-5 (um in Punkt 3 zu gehen) 0 (da alle Punkte 0 sind). Ähnlich mit Punkt 4, 5, 6,7 und 8. Jedoch ist Punkt 9 der Durchschnitt von 0, 0, 0, 0, 20 4. Wie wäre es mit Punkt 10 Nun, es sollte der Durchschnitt von 0, 0, 0 sein , 20, 20 8, aber hast du dich daran erinnert, nicht Punkt 9 Hmm zu überschreiben, scheint, dass wir zwei Kopien des Array (das ist im Allgemeinen teuer) zu halten. Es gibt mehrere Möglichkeiten, wie du es vermeiden kannst. Verstehst du wo das Problem im vorherigen Absatz auftaucht. Wenn nicht, versuchen Sie es mit Bleistift und Papier (oder versuchen Sie es in LabVIEW zu codieren). Sie geben Ihnen die Antwort, damit Sie überprüfen können - der gleitende Durchschnitt der Schrittfunktion ist -, -, 0, 0, 0, 0, 0, 0, 0, 4, 8, 12, 16, 20, 20 , 20. -, - (wo - sind die leeren Werte an den Enden des Arrays, die Punkte, die du nicht genügend Nachbarn hast). P. S. - es würde mich nicht überraschen, wenn es eine LabVIEW-Funktion gibt, die das für dich tut. Aber wenn du LabVIEW lernst und ein besseres Verständnis dafür haben möchtest, wie die Algorithmen du in die Arbeit steckst, schmerzt es niemals, es zu spielen und es selbst auszuprobieren. Sie können sogar eine Verbesserung (einige von uns haben so getan haben). Danke für die Sensibilisierung in Bezug auf die feineren Punkte der Moving Average Methode. Dies ist ein statistisches Werkzeug, das hilft zu sehen, was Sie sehen wollen, um die Distraktoren zu abstrahieren. Also die Methode ist verpflichtet, einige Defizite in einigen Situationen oder Kontext haben. Aber ich denke, es eignet sich perfekt für meine Art dof Datenprotokollierung - es ist ein Druck oder Temperatur oder Flow-Signal - und ich erwerbe bei so etwas wie 400 Samples sek und benutze dann eine gemittelte Einzelprobe. Und der Prozess ist ziemlich langsam, da mein Hauptcode bei nicht mehr als 20 Hz läuft. Also, wenn ich eine 5 Probe maving Durchschnitt, meine erste Probe kommt 5 x 50ms später, dann für alle 50ms bekomme ich eine gültige Probe. Grundsätzlich bin ich mehr auf Trends und nicht Punkt Werte. Darin gibt es wenig Sorgen um verpasste Samples oder Schurkenwerte. Natürlich würde ich es nicht wagen, das für eine Step-Funktion zu benutzen. Das wäre grausam Raghunathan LV2012 zur Automatisierung von Hydraulikprüfständen. Nachricht 4 von 15 (1.023 Aufrufe) Re: Simple Moving Average VI 03-30-2016 11:58 PM Es gibt mittlere ptbypt was das selbe tut. Sie können den Code überprüfen, wenn Sie wollen. Ein großer Fehler in Ihrem Code ist die Tatsache, dass Sie ständig wachsen und schrumpfen eine bestehende Array. Sie sollten versuchen, eine Lösung zu finden, die an Ort und Stelle auf einem festen Größenarray arbeitet. Mai-Beispiele wurden auf dem Forum im Laufe der Jahre veröffentlicht (siehe hee zum Beispiel). Der Mittel kümmert sich nicht, wenn die Elemente außer Betrieb sind, also kannst du einfach das älteste Element ersetzen, egal wo es sich befindet. Sie setzen auch das neue Element an den Anfang eines bestehenden Arrays vor, das ist immer viel teurer als das Ende zu beenden. Ihre Stichprobengröße kann sich nicht ändern, sobald das VI läuft. Ihr Schieberegister sollte mit einem leeren Array initialisiert werden, kein Array enthält bereits ein einzelnes Element, das Null ist. (Diese extra Null gibt falsche Mittelwerte) Ihr Code sollte in einem SubVI gemacht werden, damit es wiederverwendet werden kann (ähnlich der ptbypt Version). Dein VI kann niemals gestoppt werden, nur abgebrochen. Gute Optimierungstipps Der Punkt bei der Initialisierung mit Zero hat mich vermisst. Und ja der Benutzer sollte die Stichprobengröße nicht ändern, sobald er läuft. Schließlich werde ich ein SubVI und behandeln Dinge wie Stoppen etc .. Was zum Zeitpunkt der Vorbereitung als Anhängen der neuen Wert zu Array, vielleicht gibt es eine Performance-Strafe aber angesichts der Größe von meinem Array Ich bin mir sicher, dass die CPU kümmert sich nicht anwyay . Aber für mich muss es so sein, wie ich die endgültigen Daten zum Plotten eines Trends eines physikalischen Parameters verwende. Dank für Ihre Zeit. Raghunathan LV2012 zur Automatisierung von Hydraulikprüfständen. Danke für die Sensibilisierung in Bezug auf die feineren Punkte der Moving Average Methode. Dies ist ein statistisches Werkzeug, das hilft zu sehen, was Sie sehen wollen, um die Distraktoren zu abstrahieren. Also die Methode ist verpflichtet, einige Defizite in einigen Situationen oder Kontext haben. Aber ich denke, es eignet sich perfekt für meine Art dof Datenprotokollierung - es ist ein Druck oder Temperatur oder Flow-Signal - und ich erwerbe bei so etwas wie 400 Samples sek und benutze dann eine gemittelte Einzelprobe. Und der Prozess ist ziemlich langsam, da mein Hauptcode bei nicht mehr als 20 Hz läuft. Also, wenn ich eine 5 Probe maving Durchschnitt, meine erste Probe kommt 5 x 50ms später, dann für alle 50ms bekomme ich eine gültige Probe. Aha Also willst du keinen gleitenden Durchschnitt, sondern nur einen einfachen Durchschnitt. Das ist viel einfacher. Heres die Idee (die mit einem ProducerConsumer Design viel besser funktioniert) - Sagen Sie, dass Sie bei 400Hz abtasten, die Daten bei 400 Hz speichern (dh alle Daten auf Festplatte speichern), aber bei 20 Hz anzeigen wollen (weil Sie Trends sehen wollen, eine längere Zeitbasis usw.). Richten Sie Ihr AD-System ein, um 20 Samples mit 400 Hz zu sammeln (Sie können N Kanäle gleichzeitig sammeln, so dass Sie ein 2D-Array von Samples erhalten können. Wie Sie die Daten (bei 20 Hz) von der AD (so dass der Produzent) , Dezitiere es an den Consumer, der Verbraucher beginnt mit dem Schreiben der Daten auf die Festplatte (sollte nicht viel Zeit). Jetzt hast du ein 2D-Array - in einem For Loop, auf einer Kanal-für-Kanal-Basis, durchschnittlich die 20 Punkte. Jetzt haben Sie ein 1D-Array mit einem Averaged Point für jeden Channel, gehen Sie vor und zeichnen Sie es auf. Beachten Sie, dass dieses Schema (a) alle Daten verwendet, (b) Handles Mehrkanal-Daten mit aplomb (und wenn Sie sind Aus dem Mittleren Osten, wo sie wachsen, können Sie auch Ihre Daten mit einer saftigen Pflaume behandeln), und (c) können Sie sammeln Sie Ihre Daten aus dem AD-Gerät, speichern Sie Ihre Daten auf Festplatte halten alle Punkte und zeigen Sie Ihre Daten auf Der Bildschirm mit all Ihren Punkten, aber auch Mittelwert, um die visuelle Signal-to-Noise-Verhältnis zu verbessern, alle ohne Datenverlust (Ive genau das mit 24 Kanälen bei 1KHz getan, wobei die Daten auf einem fernen System aufgenommen und an den PC gesendet wurden Über TCPIP, also haben wir auch TCP-Verarbeitung in der Schleife). Willkommen in der aufregenden Welt der Datenerfassung und - verarbeitung mit LabVIEW. Vertrauen Sie mir, das ist ein wunderbares System für diese Art von Arbeit Basierend auf dem Feedback, das ich auf meine ursprüngliche VI Ich habe den Moving Average Code in ein SubVI verfeinert. Ich habe es dann benutzt, um eine simulierte 10Channel Daten zu bezahlen - nur um die Dinge einfach zu halten, stellte ich sicher, dass alle10 Kanäle identische Daten hatten. Man würde dann erwarten, dasselbe gleitende Durchschnitt für alle 10 Kanäle zu bekommen. Ich bin überrascht über die kleine Varianz, die ich zwischen den Kanälen bemerke - im Allgemeinen sind sie nahe, aber nicht genau. Und nur um den Prozess zu erklären, den ich versuche, habe ich auch ein XLS beigelegt. Woher kommt die Variation. Das unitialisierte Schieberegister im Sub VI. Raghunathan LV2012 zur Automatisierung von Hydraulikprüfständen. Nachricht 9 von 15 (926 Ansichten) Re: Simple Moving Average VI altenbach 04-01-2016 10:25 AM Dein Code macht noch keinen Sinn. Setzen Sie den SubVI ein Skalar zu einer Zeit an, Sie bekommen nicht, was Sie wollen, weil das Schieberegister nur die letzten N Skalare erinnert, egal welcher Kanal es ist. Dein Code ist immer noch sehr ineffizient und gewunden. (ZB warum bist du noch mit Insert in Array zu append (beide in der Mani nad in der Sub). (Sie könnten ein reenetrant subVI und eine parallele innerste FOR-Schleife verwenden, aber das scheint auch übermäßig kompliziert) Wenn Sie wollen, um zu tun Nachricht 10 von 15 (910 Aufrufe) Gleitender Durchschnitt für 10 Werte aus einem Array Ich muss eine Anwendung aufbauen, in der ich kontinuierlich aufblickt. Ich habe ein 2D-Array im SubVI Erhalten Sie einen Wert, der in einem Array einer festen Größe 10 gespeichert ist. Für jedes neue Zeitintervall wird der letzte Wert gelöscht und ein neuer Wert wird dem Array hinzugefügt. Zu einer Zeit werden 10 Werte gelesen und der Mittelwert berechnet, sobald ich den Mittelwert bekomme Ich muss mit der Min - und Max-Abweichung vom Mittelwert vergleichen. Wenn der Wert jedes Arrays eines Satzes innerhalb des Bereichs liegt, dann muss ich eine Zählung angeben, die die Anzahl der Werte im Arraysatz von 10 anzeigt Als Anzahl von Werten außerhalb des Bereichs Ein Satz von 10 Werten für jedes Zeitintervall t0-t9 - 10 Werte. T2-t11 - 10 Werte .. für alle Sätze muss ich angeben, ob der Satz gültig ist oder nicht. Nachricht 1 von 8 (912 Ansichten) Re: Gleitender Durchschnitt für 10 Werte aus einem Array 12-02-2013 04:03 PM Hast du die Suche gemacht, die du dir vermochst solltest, bevor du deine Frage gefragt hast, die ich im gleitenden Durchschnitt und die Suche eingegeben habe Motor hat sofort 100 Nachrichten-Threads gefunden und hätte wahrscheinlich mehr gefunden, wenn ich ihm Zeit gegeben hätte. Viele auf der ersten Seite sahen aus wie genau das, was du fragst. Zu irren ist menschlich, aber um es wirklich zu vereiteln, benötigt man einen Computer. Der Optimist glaubt, dass wir in der besten aller möglichen Welten sind - der Pessimist befürchtet das ist wahr. Profanität ist die eine Sprache, die alle Programmierer am besten kennen. Ein Experte ist jemand, der alle möglichen Fehler gemacht hat. Um etwas über LabVIEW ohne zusätzliche Kosten zu lernen, arbeite die Online-LabVIEW-Tutorial (s): Nachricht 2 von 8 (883 Aufrufe) Re: Gleitender Durchschnitt für 10 Werte aus einem Array 12-03-2013 12:53 AM Ich habe das schon gemacht , Aber scheinen nicht eine richtige Lösung zu bekommen. Es tut mir leid, aber ich bin neu im Labor und arbeite für das akademische Projekt, das ich in wenigen Tagen ab sofort einreichen muss. Ich schätze Ihre Hilfe. Und ich werde versuchen, mich für viele andere Beiträge zu vertuschen. Nachricht 3 von 8 (863 Aufrufe) Re: Gleitender Durchschnitt für 10 Werte aus einem Array 12-03-2013 03:50 AM Du willst nur wissen, ob deine Methode gültig ist. Es ist, wenn das Array voll ist (10). Hatte nichts zu tun, so habe ich Ihre vi ein wenig geändert, entfernt die for-Schleife und Fallstruktur. Uncertified LabVIEW Student Mistakes sind für das Lernen, das ist, warum Vorschläge sind immer willkommen Nachricht 4 von 8 (836 Aufrufe) Re: Gleitender Durchschnitt für 10 Werte aus einem Array 12-03-2013 04:07 AM Ich schätze Ihre Hilfe. Was ich eigentlich schaue, ist, dass, sobald ich die ersten 10 (im Zeitintervall t0-t9 und Werte als a0-a9) Werte in der Array ich die Verarbeitung der Mittel und nicht bis die 10 Arrays mit dem gefüllt wurden Werte. Nachdem die ersten 10 Werte gefüllt sind, werde ich die Abweichung für jeden Array-Wert von a0-a9 überprüfen. Wenn im Bereich sollte es ja oder sonst nein anzeigen (das habe ich schon). Wenn dies verarbeitet wird, sollte ich den Datensatz fom t1-t10 nehmen, Werte als a1-a10. Das wird mein neuer Satz sein. Wieder werde ich dem Verfahren für die mittlere Kontrolle folgen. Gt Das geht ununterbrochen weiter. In der früheren vi von mir und in der späteren von Ihnen ist in beiden Fällen der Mittelwert aus dem ersten Wert selbst berechnet. Was für meinen Fall nicht benötigt wird. Es sollte nur verarbeitet werden, sobald alle 10 Werte eingegeben sind. Später für alle gesetzt sollte es kontinuierlich den Mittelwert verarbeiten. (Da für die laterale Zeit habe ich immer 10 Werte im Array). Ich habe versucht, nach diesem Querry zu suchen, konnte aber keine richtige Lösung finden. Ich würde mich sehr freuen, wenn mir geholfen werden kann. Danke im Voraus. Ich verstehe nicht wirklich Ihren Punkt. Sie wollen einen gleitenden Durchschnitt von 10 Punkten, das ist, was Sie bereits implementiert. Aber du willst es nicht beurteilen, bis du deine vollen 10 Punkte hast Wenn dies ist, was du willst, gibt es zwei Möglichkeiten. 1. Sie erstellen eine For-Loop infront der while-Schleifen, die 9-mal Ihren zufälligen Generator iteriert, dann verbinden Sie es mit dem Array-Shif-Register. 2. beginne mit einem leeren Array und lass den Mittelwert von weniger als 10 Punkten berechnen, bis das Array voll ist, dieser ist beigefügt. Unzertifizierte LabVIEW Student Mistakes sind zum Lernen, deshalb sind Anregungen immer willkommen
No comments:
Post a Comment