Friday 15 September 2017

Weighted Moving Average Filter Matlab


Ich muss einen gleitenden Durchschnitt über eine Datenreihe innerhalb einer for-Schleife berechnen. Ich muss den gleitenden Durchschnitt über N9 Tage erhalten. Das Array Im-Berechnen ist 4 Reihe 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 einem Diagramm darstellen. Ich googeln ein wenig über gleitende Durchschnitte und den conv Befehl und fand etwas, das ich versuchte, in meinem Code umzusetzen: So grundsätzlich berechne ich meinen Durchschnitt und plot ihn mit einem (falschen) gleitenden Durchschnitt. Ich wählte die wts Wert direkt an der Mathworks-Website, so dass ist falsch. (Quelle: mathworks. nlhelpeconmoving-average-trend-estimation. html) Mein Problem aber ist, dass ich nicht verstehe, was dieses 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 Werte werden gleich gewichtet. Und wenn ich das völlig falsch mache, könnte ich etwas Hilfe dabei haben Mein aufrichtigster Dank. Die Verwendung von conv ist eine hervorragende Möglichkeit, einen gleitenden Durchschnitt zu implementieren. In dem Code, den Sie verwenden, ist wts, wie viel Sie jeden Wert wiegen (wie Sie ahnen). Die Summe dieses Vektors sollte immer gleich Eins sein. Wenn Sie jeden Wert gleichmäßig gewichten und eine Größe N bewegten Filter dann tun möchten, würden Sie tun möchten Mit dem gültigen Argument in conv wird mit weniger Werten in Ms, als Sie in M ​​haben. Verwenden Sie diese, wenn Sie dont die Auswirkungen von Nullpolsterung. Wenn Sie die Signalverarbeitung Toolbox haben, können Sie cconv verwenden, wenn Sie einen kreisförmigen gleitenden Durchschnitt ausprobieren möchten. Etwas wie Sie sollten die conv und cconv Dokumentation für weitere Informationen lesen, wenn Sie havent 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 unter Verwendung 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 dem Spaltenvektor Y unter Verwendung eines gleitenden Durchschnittsfilters. Die Ergebnisse werden im Spaltenvektor yy zurückgegeben. Die voreingestellte Spanne für den gleitenden Durchschnitt ist 5.Download movAv. m (siehe auch movAv2 - eine aktualisierte Version, die eine Gewichtung erlaubt) Beschreibung Matlab enthält Funktionen, die movavg und tsmovavg (Zeitreihenbewegungsdurchschnitt) in der Financial Toolbox genannt werden. MovAv wurde entwickelt, um zu replizieren Die grundlegende Funktionalität dieser. Der Code hier bietet ein schönes Beispiel für die Verwaltung von Indizes innerhalb Schleifen, die zu Beginn verwirrend sein kann. Ive bewusst hielt den Code kurz und einfach zu halten diesen Prozess klar. MovAv führt einen einfachen gleitenden Durchschnitt aus, der verwendet werden kann, um in einigen Situationen verrauschte Daten wiederherzustellen. Es funktioniert, indem man den Mittelwert der Eingabe (y) über ein gleitendes Zeitfenster nimmt, dessen Größe durch n spezifiziert ist. Je größer n ist, desto größer ist die Glättung der Wirkung von n in Bezug auf die Länge des Eingangsvektors y. Und effektiv (gut, Art von) schafft ein Tiefpass-Frequenz-Filter - siehe die Beispiele und Überlegungen Abschnitt. Da die Menge an Glättung, die von jedem Wert von n bereitgestellt wird, relativ zu der Länge des Eingangsvektors ist, ist es immer wert, verschiedene Werte zu testen, um zu sehen, was passend ist. Denken Sie auch daran, dass n Punkte in jedem Durchschnitt verloren gehen, wenn n 100 ist, enthalten die ersten 99 Punkte des Eingangsvektors nicht genug Daten für einen Durchschnitt von 100pt. Dies kann durch Stapeln von Durchschnitten etwas vermieden werden, zum Beispiel, wenn der Code und das Diagramm unten eine Anzahl von unterschiedlichen Längenfensterdurchschnitten vergleichen. Beachten Sie, wie glatt 1010pt mit einem einzigen 20pt Durchschnitt verglichen wird. In beiden Fällen gehen insgesamt 20 Datenpunkte verloren. Erstellen Sie xaxis x1: 0.01: 5 Erzeugen Sie RauschenRauschen 4 Rauschen repmat (randn (1, ceil (numel (x) noiseReps)), noiseReps, 1) Rauschform (Rauschen, 1, Länge (Rauschen) noiseReps) Generieren Sie ydata Rauschen yexp (Y, 20) 20 pt y5 movAv (y, 40) 40 pt (y, 10) 10 & ndash; (X, y2, y3, y4, y5, y6) Legende (Rohdaten, 10pt gleitender Durchschnitt, 1010pt, 20pt, 40pt, 100pt) xlabel (x) ylabel Y) title (Vergleich der gleitenden Mittelwerte) movAv. m Code Durchlauffunktion output movAv (y, n) Die erste Zeile definiert die Funktionen name, inputs und output. Der Eingang x sollte ein Vektor von Daten, um den Durchschnitt auf, n sollte die Anzahl der Punkte, um die durchschnittliche über die Ausgabe werden die gemittelten Daten, die von der Funktion zurückgegeben werden. Ausgangspunkt NAN vorgeben (1, numel (y)) Mittelpunkt von n finden midPoint round (n2) Die Hauptfunktion der Funktion wird in der for-Schleife ausgeführt, aber vor dem Start werden zwei Dinge vorbereitet. Zuerst wird die Ausgabe als NaNs vorgegeben, dies diente zwei Zwecken. Zuerst ist die Vorverteilung allgemein gute Praxis, da sie das Gedächtnis-Jonglieren, das Matlab zu tun hat, reduziert, zweitens macht es es sehr einfach, die gemittelten Daten in einen Ausgang einzustellen, der dieselbe Größe wie der Eingangsvektor hat. Dies bedeutet, dass die gleiche Xaxis später für beide verwendet werden kann, was für das Plotten zweckmßig ist, alternativ können die NaNs später in einer Zeile des Codes entfernt werden (Ausgangsausgang (Der variable midPoint wird verwendet, um die Daten in dem Ausgangsvektor auszurichten N 10, werden 10 Punkte verloren gehen, da für die ersten 9 Punkte des Eingangsvektors nicht genügend Daten vorhanden sind, um einen 10-Punkte-Durchschnitt zu nehmen. Wenn die Ausgabe kürzer als die Eingabe ist, muss sie ordnungsgemäß ausgerichtet werden Verwendet werden, so dass eine gleiche Menge an Daten am Anfang und am Ende verloren geht und der Eingang mit den Ausgangssignalen von den NaN-Puffern ausgerichtet bleibt, die erzeugt werden, wenn eine Ausgabe vorangestellt wird, für einen Indexwert von 1: Länge (y) (A: b) ban Berechnung des Mittelwerts (amidPoint) Mittelwert (y (a: b)) Ende In der for-Schleife wird ein Mittelwert über jedes aufeinanderfolgende Segment des Eingangs übernommen Definiert als 1 bis zur Länge des Eingangs (y), abzüglich der Daten, die verloren gehen (n) Wenn die Eingabe 100 Punkte lang ist und n 10 ist, wird die Schleife von (a) 1 bis 90 laufen Bedeutet a liefert den ersten Index des zu mittelnden Segments. Der zweite Index (b) ist einfach ein-1. Also auf der ersten Iteration, a1. N10. So b 11-1 10. Der erste Durchschnitt wird über y (a: b) übernommen. Oder x (1:10). Der Durchschnitt dieses Segments, das ein einzelner Wert ist, wird in der Ausgabe am Index amidPoint gespeichert. Oder 156. Auf der zweiten Iteration, a2. B 210-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, a91. B 9010-1 100, so daß der Mittelwert x (91: 100) übernommen und im Ausgang (95) gespeichert wird. Dies verlässt den Ausgang mit insgesamt n (10) NaN-Werten am Index (1: 5) und (96: 100). Beispiele und Überlegungen Gleitende Durchschnitte sind in einigen Situationen nützlich, aber theyre nicht immer die beste Wahl. Hier sind zwei Beispiele, wo sie nicht unbedingt optimal sind. Mikrofonkalibrierung Dieser Datensatz 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 der Frequenz, aber wir können diese Abweichung mit den Kalibrierdaten korrigieren - der Ausgang kann in Pegel eingestellt werden, um die Schwankungen der Kalibrierung zu berücksichtigen. Beachten Sie, dass die Rohdaten verrauscht sind - dies bedeutet, dass eine kleine Änderung der Frequenz eine große, unregelmäßige Änderung des Pegels erforderlich macht. Ist dies realistisch oder ist dies ein Produkt der Aufzeichnungsumgebung ist es sinnvoll, in diesem Fall einen gleitenden Durchschnitt anzuwenden, der die Pegelfrequenzkurve ausgleicht, um eine Eichkurve zu liefern, die etwas weniger unregelmäßig ist. Aber warum ist dies nicht optimal in diesem Beispiel Mehr Daten wäre besser - mehrere Kalibrierungen läuft gemittelt würde das Rauschen im System zerstören (so lange wie seine zufällige) und bieten eine Kurve mit weniger subtilen Details verloren. Der gleitende Durchschnitt kann nur annähern, 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: Die allgemeine Frage der Auswahl einer vernünftigen Anzahl von Punkten, um den Durchschnitt über. Seine einfache, aber es gibt effektivere Methoden der Signalanalyse als Mittelung oszillierender Signale im Zeitbereich. In diesem Diagramm ist die ursprüngliche Sinuswelle blau aufgetragen. Rauschen wird hinzugefügt und als die orange Kurve aufgetragen. Ein gleitender Durchschnitt wird bei verschiedenen Punktzahlen durchgeführt, um zu sehen, ob die ursprüngliche Welle wiederhergestellt werden kann. 5 und 10 Punkte liefern vernünftige Ergebnisse, aber entfernen Sie nicht das Rauschen vollständig, wo die größeren Punktezahlen beginnen, Amplitudendetails zu verlieren, da sich der Mittelwert über verschiedene Phasen erstreckt (erinnern Sie sich an die Welle oscilates um Null und Mittelwert (-1 1) 0) . Ein alternativer Ansatz wäre, ein Tiefpaßfilter aufzubauen, als es auf das Signal im Frequenzbereich angewendet werden kann. Im nicht gehen ins Detail gehen, wie es geht über den Rahmen dieses Artikels, aber da das Rauschen ist wesentlich höhere Frequenz als die Wellen Grundfrequenz, wäre es ziemlich einfach in diesem Fall ein Tiefpassfilter als die Hochfrequenz zu entfernen Rauschen. Was ist Glättung und wie kann ich es tun Ich habe ein Array in Matlab, die das Magnitude-Spektrum eines Sprachsignals (die Größe von 128 Punkten FFT) ist. Wie glätte ich dieses mit einem gleitenden Durchschnitt Von dem, was ich verstehe, sollte ich ein Fenster Größe einer bestimmten Anzahl von Elementen nehmen, durchschnittlich, und dies wird das neue 1. Element. Dann verschieben Sie das Fenster nach rechts um ein Element, nehmen Sie den Durchschnitt, der das 2. Element wird, und so weiter. Ist das wirklich, wie es funktioniert Ich bin mir nicht sicher, da, wenn ich das tun, in meinem Endergebnis werde ich weniger als 128 Elemente haben. Also, wie funktioniert es und wie es hilft, um die Datenpunkte zu glätten Oder gibt es eine andere Art und Weise kann ich tun, Glättung der Daten gefragt Okt 15 12 at 6:30 migriert von stackoverflow Okt 15 12 at 14:51 Diese Frage kam von unserem Website für professionelle und enthusiast Programmierer. Für ein Spektrum möchten Sie wahrscheinlich gemeinsam (in der Zeitdimension) mehrere Spektren eher als ein laufender Durchschnitt entlang der Frequenzachse eines einzigen Spektrums ndash Endolith sind beide gültige Techniken. Die Mittelung im Frequenzbereich (manchmal auch als Danielle-Periodogramm bezeichnet) ist die gleiche wie das Fenstern im Zeitbereich. Die Mittelung von mehreren Periodogrammen (quotspectraquot) ist ein Versuch, die Ensemble-Mittelung des wahren Periodogramms nachzuahmen (dies wird als Welch-Periodogramm bezeichnet). Auch als eine Frage der Semantik würde ich argumentieren, dass quotsmoothingquot nicht-causual Tiefpaß-Filterung ist. Siehe Kalman Filterung vs Kalman Glättung, Wiener Filterung v Wiener Glättung, etc. Es gibt eine nichttriviale Unterscheidung und it39s Umsetzung abhängig. Ndash Bryan 12-18 um 19:18 Glättung kann in vielerlei Hinsicht getan werden, aber in sehr grundlegende und allgemeine Begriffe bedeutet es, dass Sie sogar ein Signal, indem sie ihre Elemente mit ihren Nachbarn. Sie smearblur das Signal ein wenig, um loszuwerden, Lärm. Zum Beispiel wäre eine sehr einfache Glättungsmethode, jedes Signal-Element f (t) auf 0,8 des ursprünglichen Wertes plus 0,1 jeder seiner Nachbarn neu zu berechnen: Beachten Sie, wie sich die Multiplikationsfaktoren oder - gewichte zu eins addieren. Also, wenn das Signal ist ziemlich konstant, Glättung nicht viel ändern. Aber wenn das Signal einen plötzlichen ruckartigen Wechsel enthielt, wird der Beitrag seiner Nachbarn dazu beitragen, das Rauschen ein wenig aufzuklären. Die Gewichte, die Sie in dieser Rekalkulationsfunktion verwenden, können als Kernel bezeichnet werden. Eine eindimensionale Gaußsche Funktion oder irgendein anderer Grundkern sollte in Ihrem Fall tun. Schönes Beispiel für eine besondere Art von Glättung: Oben: Ungelöstes Signal Unten: geglättetes Signal Beispiele für einige Kerne: Neben der netten Antwort von Junuxx möchte ich noch ein paar Notizen machen. Glättung bezieht sich auf die Filterung (leider ziemlich vage Wikipedia-Artikel) - Sie sollten die glatte wählen, basierend auf seinen Eigenschaften. Einer meiner Favoriten ist der Medianfilter. Dies ist ein Beispiel eines nicht-linearen Filters. Es hat einige interessante Eigenschaften, es bewahrt Kanten und ist sehr robust unter großen Lärm. Wenn Sie ein Modell haben, wie Ihr Signal verhält sich ein Kalman-Filter ist einen Blick wert. Seine Glättung ist tatsächlich eine Bayessche Maximum-Likelihood-Schätzung des Signals basierend auf Beobachtungen. Beantwortet Okt 15 12 am 11:07 1 für die Erwähnung der kalman Filter ndash Die Glättung impliziert die Verwendung von Informationen aus benachbarten Proben, um die Beziehung zwischen benachbarten Proben zu ändern. Für endliche Vektoren gibt es an den Enden keine benachbarten Informationen auf einer Seite. Ihre Entscheidungen sind: dont smoothfilter die Enden, akzeptieren Sie einen kürzeren resultierenden geglättet Vektor, machen Sie Daten und glatt mit dem (abhängig von der Genauigkeit aller Vorhersagen von den Enden), oder vielleicht mit verschiedenen asymmetrischen Glättung Kerne an den Enden (die am Ende Verkürzen den Informationsgehalt im Signal sowieso). Antwort # 2 am: Mai 15, 2010, 04:31:25 am »Andere haben erwähnt, wie Sie Glättung tun, Id wie zu erwähnen, warum Glättung funktioniert. Wenn Sie Ihr Signal richtig überspielen, variiert es relativ wenig von einer Probe zur nächsten (Beispielzeitpunkte, Pixel usw.) und es wird erwartet, dass sie ein insgesamt glattes Aussehen haben. Mit anderen Worten enthält Ihr Signal wenige hohe Frequenzen, d. H. Signalkomponenten, die mit einer Rate ähnlich zu Ihrer Abtastrate variieren. Messungen werden oft durch Rauschen verfälscht. In erster Näherung betrachten wir in der Regel das Rauschen einer Gaußschen Verteilung mit mittlerem Nullpunkt und einer bestimmten Standardabweichung, die einfach über dem Signal addiert wird. Um das Rauschen in unserem Signal zu reduzieren, machen wir gewöhnlich die folgenden vier Annahmen: Rauschen ist zufällig, nicht korreliert unter Samples, hat einen Mittelwert von Null, und das Signal ist ausreichend überabgetastet. Mit diesen Annahmen können wir einen gleitenden Mittelwertfilter verwenden. Man betrachte beispielsweise drei aufeinanderfolgende Proben. Da das Signal stark überabgetastet wird, kann angenommen werden, dass das darunterliegende Signal sich linear ändert, was bedeutet, dass der Mittelwert des Signals an den drei Abtastwerten dem wahren Signal am mittleren Abtastwert entspricht. Im Gegensatz dazu weist das Rauschen einen Mittelwert von Null auf und ist unkorreliert, was bedeutet, daß sein Durchschnitt zu Null neigen sollte. Somit können wir einen Gleitfilter mit drei Stichproben anwenden, wobei wir jede Probe mit dem Mittelwert zwischen sich und seinen zwei benachbarten Nachbarn ersetzen. Natürlich, je größer wir das Fenster, desto mehr Rauschen wird auf Null, aber desto geringer unsere Annahme der Linearität des wahren Signals hält. So müssen wir einen Kompromiss machen. Eine Möglichkeit, das Beste aus beiden Welten zu erhalten, besteht darin, einen gewichteten Mittelwert zu verwenden, wobei wir kleinere Gewichte weiter weggeben, sodass wir die Rauscheffekte von größeren Bereichen mitteln, während wir das wahre Signal nicht zu groß gewichten, wo es von unserer Linearität abweicht Annahme. Wie Sie die Gewichte setzen sollte, hängt von dem Rauschen, dem Signal und der Rechenleistung ab, und natürlich von dem Kompromiss zwischen dem Beseitigen von Rauschen und dem Schneiden in das Signal. Beachten Sie, dass in den letzten Jahren eine Menge Arbeit geleistet wurde, um einige der vier Annahmen zu lösen, zum Beispiel durch Entwerfen von Glättungsschemata mit variablen Filterfenstern (anisotrope Diffusion) oder Schemata, die überhaupt keine Fenster verwenden (Nichtlokale Mittel). Beantwortet Dec 27 12 at 15:10

No comments:

Post a Comment