Ich habe einen Vektor und ich möchte den gleitenden Durchschnitt von ihm mit einem Fenster der Breite 5.Für Beispiel, wenn der Vektor in Frage ist 1,2,3,4,5,6,7,8 dann. das erste Eintragung des resultierenden Vektors sollte die Summe aller Einträge in 1,2,3,4,5 dh 15.die zweite Eintragung des resultierenden Vektors sollte die Summe aller Einträge in 2,3,4,5,6 sein 20. Am Ende sollte der daraus resultierende Vektor 15,20,25,30 sein. Wie kann ich das machen. Die Conv-Funktion ist gleich Ihre Gasse. Drei Antworten, drei verschiedene Methoden Hier ist ein schneller Benchmark verschiedene Eingabegrößen, feste Fenster Breite von 5 mit timeit fühlen sich frei, Löcher in es in den Kommentaren zu stoßen, wenn Sie denken, es muss raffiniert werden. conv taucht als der schnellste Ansatz es s etwa doppelt so schnell wie Münze Ansatz mit Filter und etwa viermal so schnell wie Luis Mendo s Ansatz mit cumsum. Here ist ein weiterer Benchmark feste Eingangsgröße von 1e4 verschiedenen Fensterbreiten Hier Luis Mendo s cumsum Ansatz taucht als der klare Sieger, weil seine Komplexität ist in erster Linie Geregelt durch die Länge der Eingabe und ist unempfindlich auf die Breite des Fensters. Um zusammenzufassen, sollten Sie die conv-Ansatz, wenn Ihr Fenster relativ klein ist. Verwenden Sie die Cumsum-Ansatz, wenn Ihr Fenster relativ groß ist. Code für Benchmarks Notwendigkeit, einen gleitenden Durchschnitt über eine Datenreihe zu berechnen, innerhalb einer for-Schleife muss ich den gleitenden Durchschnitt über N 9 Tage erhalten. Das Array I m, das in 1 ist, ist 4 Serie von 365 Werten M, die selbst Mittelwerte eines anderen Satzes von Daten sind Ich möchte die Mittelwerte meiner Daten mit dem gleitenden Durchschnitt in einer Handlung zeichnen. Ich googelte ein bisschen über bewegte Durchschnitte und den Conv-Befehl und fand etwas, was ich versucht habe, in meinem Code zu implementieren. So grundsätzlich berechne ich meinen Mittel und plot es Mit einem falschen gleitenden Durchschnitt habe ich den WTS-Wert direkt von der Mathworks-Website, so dass ist falsche Quelle Mein Problem aber ist, dass ich nicht verstehen, was diese wts ist Könnte jemand erklären Wenn es etwas mit den Gewichten der Werte zu tun hat Das ist in diesem Fall ungültig. Alle valu Es sind gleich gewichtet. Und wenn ich das ganz falsch mache, könnte ich etwas Hilfe mit ihm bekommen. Mein aufrichtigsten Dank. Schicht Sep 23 14 am 19 05.Using conv ist eine hervorragende Möglichkeit, einen gleitenden Durchschnitt zu implementieren In den Code Sie Verwenden Sie, wts ist, wie viel Sie wiegen jeden Wert, wie Sie erraten, die Summe von diesem Vektor sollte immer gleich Eins Wenn Sie möchten, um jeden Wert gleichmäßig Gewicht und eine Größe N bewegenden Filter dann möchten Sie tun. Using die Gültiges Argument in Conv wird dazu führen, dass weniger Werte in Ms als Sie haben in M Verwenden Sie das gleiche, wenn Sie don t mind die Auswirkungen der Null-Polsterung Wenn Sie die Signalverarbeitung Toolbox können Sie cconv verwenden, wenn Sie einen kreisförmigen gleitenden Durchschnitt versuchen wollen etwas Etwas Like. You sollte die conv und cconv-Dokumentation für weitere Informationen lesen, wenn Sie bereits t bereits. Sie können Filter verwenden, um einen laufenden Durchschnitt zu finden, ohne eine for-Schleife zu verwenden Dieses Beispiel findet den laufenden Durchschnitt eines 16-Element-Vektors, mit einer Fenstergröße Von 5,2 glatt als Teil der Curve Fitting Toolbox Die in den meisten Fällen verfügbar ist. yy glatt y glättet die Daten in der Spalte Vektor y mit einem gleitenden Durchschnitt Filter Ergebnisse werden in der Spalte Vektor zurückgegeben yy Die Standard-Spanne für den gleitenden Durchschnitt ist 5.Download movAv m siehe auch movAv2 - eine aktualisierte Version, die Gewichtung erlaubt. Beschreibung Matlab enthält Funktionen namens movavg und tsmovavg Zeitreihe gleitenden Durchschnitt in der Financial Toolbox, movAv ist entworfen, um die grundlegende Funktionalität dieser zu replizieren Der Code hier bietet ein schönes Beispiel für die Verwaltung von Indizes innerhalb Schleifen, die verwirrend sein können Beginne ich habe bewusst den Code kurz und einfach gehalten, um diesen Prozess clear. movAv führt einen einfachen gleitenden Durchschnitt, der verwendet werden kann, um laute Daten in einigen Situationen wiederherzustellen. Es funktioniert, indem sie den Mittelwert der Eingabe y über ein Schiebezeitfenster , Deren Größe durch n angegeben ist. Je größer n ist, desto größer ist der Glanzgrad der Wirkung von n ist relativ zur Länge des Eingangsvektors y und wirksam gut, Art c Gibt einen Tiefpass-Frequenz-Filter - siehe die Beispiele und Überlegungen Abschnitt. Weil die Menge der Glättung von jedem Wert von n ist relativ zu der Länge des Eingangs-Vektor, es ist immer wert testen verschiedene Werte, um zu sehen, was s geeignet Denken Sie auch, dass n Punkte sind in jedem Durchschnitt verloren, wenn n 100 ist, die ersten 99 Punkte des Eingangsvektors don t enthalten genügend Daten für einen 100pt Durchschnitt. Dies kann durch Stapeln von Durchschnittswerten etwas vermieden werden, zum Beispiel der Code und das Diagramm unten vergleichen eine Anzahl von verschiedenen Länge Fensterdurchschnitte Beachten Sie, wie glatt 10 10pt mit einem einzigen 20pt Durchschnitt verglichen wird. In beiden Fällen sind 20 Datenpunkte insgesamt verloren. Erstellen Sie xaxis x 1 0 01 5 erzeugen Rauschen Rauschen 4 Rauschen repmat randn 1, ceil numel x noiseReps, noiseReps, 1 Rauschen Reshape Rauschen, 1, Lärm Lärm Raps erzeugen ydata Rauschen y exp x 10 Rauschen 1 Länge x Perfrom Mittelwerte y2 movAv y, 10 10 pt y3 movAv y2, 10 10 10 pt y4 movAv y, 20 20 pt y5 movAv y, 40 40 pt y6 movAv y, 100 100 pt Plot Abbildung Plot x, y, y2, y3, y4, y5, y6 Legende Raw Daten, 10pt gleitender Durchschnitt, 10 10pt, 20pt, 40pt, 100pt xlabel x ylabel y title Vergleich der bewegten Durchschnitte. movAv m Code Durchlauffunktion Ausgang movAv y, n Die erste Zeile definiert die Funktion s Name, Ein - und Ausgänge Die Eingabe X sollte ein Vektor von Daten sein, um den Durchschnitt einzutragen, n sollte die Anzahl der Punkte sein, um den Durchschnitt über die Ausgabe auszuführen, wird die gemittelten Daten enthalten, die von der Funktion zurückgegeben werden. Vorausgabe der Ausgabeausgabe NaN 1, numel y Find mid point of n midPoint round N 2 Die Hauptarbeit der Funktion ist in der for-Schleife durchgeführt, aber vor dem Start zwei Dinge sind vorbereitet Fir Stly die Ausgabe ist vorab zugewiesen als NaNs, dies diente zwei Zwecken Erstens Vorbereitung ist in der Regel gute Praxis, da es reduziert das Gedächtnis jongliert Matlab zu tun hat, zweitens macht es es sehr einfach, die gemittelten Daten in eine Ausgabe die gleiche Größe wie Der Eingangsvektor Dies bedeutet, dass die gleiche Xaxis später für beide verwendet werden kann, was für das Plotten bequem ist, alternativ können die NaNs später in einer Zeile der Codeausgabeausgabe entfernt werden. Der variable MidPoint wird verwendet, um die Daten im Ausgangsvektor auszurichten Wenn n 10, 10 Punkte verloren gehen, weil für die ersten 9 Punkte des Eingangsvektors gibt es nicht genug Daten, um einen 10-Punkt-Durchschnitt zu nehmen Da die Ausgabe kürzer als die Eingabe ist, muss sie richtig ausgerichtet werden Verwendet werden, so dass eine gleiche Menge an Daten am Anfang und Ende verloren geht, und die Eingabe wird mit dem Ausgang durch die NaN-Puffer, die bei der Vorverteilung der Ausgabe erstellt werden, ausgerichtet. Für eine 1-Länge y - n Find-Indexbereich, um den Durchschnitt über den Urban zu berechnen Mittlere Ausgabe a MidPoint bedeutet yab end In der for-Schleife selbst wird ein Mittelwert über jedes aufeinanderfolgende Segment des Eingangs übernommen. Die Schleife läuft für eine, die als 1 bis zur Länge des Eingangs y definiert ist, abzüglich der Daten, die verloren werden sollen Die Eingabe ist 100 Punkte lang und n ist 10, die Schleife läuft von einem 1 bis 90. Dies bedeutet, dass a liefert den ersten Index des Segmentes gemittelt werden Der zweite Index b ist einfach ein n-1 Also bei der ersten Iteration, A 1 n 10 so b 11-1 10 Der erste Durchschnitt wird über yab oder x 1 10 übernommen. Der Durchschnitt dieses Segments, das ein einzelner Wert ist, wird in der Ausgabe bei Index a midPoint oder 1 5 6 gespeichert. Bei der zweiten Iteration , A 2 b 2 10-1 11 so wird der Mittelwert über x 2 11 übernommen und im Ausgang 7 gespeichert. Bei der letzten Iteration der Schleife für einen Eingang der Länge 100 wird ein 91 b 90 10-1 100, so dass der Mittelwert genommen wird Über x 91 100 und im Ausgang 95 gespeichert Diese verlässt die Ausgabe mit insgesamt n 10 NaN-Werten bei Index 1 5 und 96 100.Beispiele und Überlegungen Bewegliche Mittelwerte sind in einigen Situationen nützlich, aber sie Nicht immer die beste Wahl Hier sind zwei Beispiele, wo sie nicht unbedingt optimal sind. Mikrofonkalibrierung Dieser Satz von Daten repräsentiert die Pegel jeder Frequenz, die von einem Lautsprecher erzeugt und von einem Mikrofon mit einer bekannten linearen Antwort aufgezeichnet wird. Der Ausgang des Lautsprechers variiert mit Frequenz, aber wir können diese Variation mit den Kalibrierdaten korrigieren - die Ausgabe kann in der Höhe angepasst werden, um die Schwankungen in der Kalibrierung zu berücksichtigen. Nichts, dass die Rohdaten verrauscht sind - das bedeutet, dass eine kleine Frequenzänderung ein Erfordernis erfordert Groß, unregelmäßig, Veränderung in der Ebene zu berücksichtigen Ist dies realistisch Oder ist dies ein Produkt der Aufzeichnungsumgebung Es ist in diesem Fall sinnvoll, einen gleitenden Durchschnitt anzuwenden, der die Pegelfrequenzkurve glättet, um eine Eichkurve zu liefern, die etwas weniger unregelmäßig ist Aber warum ist das nicht optimal in diesem Beispiel. Mehrere Daten wären besser - Mehrere Kalibrierungen laufen gemittelt zusammen würden das Rauschen im System zerstören, solange es lief Dom und geben eine Kurve mit weniger subtilen Detail verloren Der gleitende Durchschnitt kann nur annähernd dies, und kann einige höhere Frequenz Dips und Peaks aus der Kurve, die wirklich existieren zu entfernen. Sine Wellen Mit einem gleitenden Durchschnitt auf Sinus Wellen hebt zwei Punkte. Der General Problem der Auswahl einer vernünftigen Anzahl von Punkten, um den Durchschnitt über. It s einfach, aber es gibt effektivere Methoden der Signalanalyse als Mittelung oszillierende Signale im Zeitbereich. In diesem Diagramm ist die ursprüngliche Sinuswelle in blau aufgezeichnet Lärm ist Hinzugefügt und geplottet als die orange Kurve Ein gleitender Durchschnitt wird bei verschiedenen Punkten durchgeführt, um zu sehen, ob die ursprüngliche Welle wiederhergestellt werden kann 5 und 10 Punkte liefern vernünftige Ergebnisse, aber don t entfernen das Lärm ganz, wo eine größere Anzahl von Punkten beginnen Verlieren Amplitude Detail, wie der Durchschnitt erstreckt sich über verschiedene Phasen erinnern die Welle oscilates um Null, und bedeuten -1 1 0.Ander alternativen Ansatz wäre, um ein Tiefpass-Filter zu konstruieren, als es sein kann Angewendet auf das Signal im Frequenzbereich Ich werde nicht ins Detail gehen, da es über den Rahmen dieses Artikels hinausgeht, aber da das Rauschen ist deutlich höhere Frequenz als die Wellen Grundfrequenz, wäre es ziemlich einfach in diesem Fall zu konstruieren Ein Tiefpassfilter als das Hochfrequenzrauschen zu entfernen.
No comments:
Post a Comment