Tuesday 24 October 2017

Gleitende Durchschnittliche Filter Matlab Funktion


Erstellt am Mittwoch, den 08. Oktober 2008 um 20:04 Uhr Zuletzt aktualisiert am Donnerstag, den 14. März 2013 um 01:29 Uhr Geschrieben von: Batuhan Osmanoglu Zugriffe: 41077 Moving Average In Matlab Häufig finde ich mich in der Notwendigkeit der Mittelung der Daten, die ich habe, um das Rauschen ein wenig zu reduzieren Bit. Ich schrieb paar Funktionen, um genau das tun, was ich will, aber Matlabs in Filter-Funktion gebaut funktioniert auch ziemlich gut. Hier schreibe ich über 1D und 2D Mittelung von Daten. 1D-Filter kann mit der Filterfunktion realisiert werden. Die Filterfunktion erfordert mindestens drei Eingangsparameter: den Zählerkoeffizienten für den Filter (b), den Nennerkoeffizienten für den Filter (a) und natürlich die Daten (X). Ein laufender Mittelwertfilter kann einfach definiert werden: Für 2D-Daten können wir die Funktion Matlabs filter2 verwenden. Für weitere Informationen, wie der Filter funktioniert, können Sie eingeben: Hier ist eine schnelle und schmutzige Implementierung eines 16 von 16 gleitenden durchschnittlichen Filters. Zunächst müssen wir den Filter definieren. Da alles, was wir wollen, gleicher Beitrag aller Nachbarn ist, können wir einfach die Funktion verwenden. Wir teilen alles mit 256 (1616), da wir nicht den allgemeinen Pegel (Amplitude) des Signals ändern wollen. Um den Filter anzuwenden, können wir einfach Folgendes sagen: Unten sind die Ergebnisse für die Phase eines SAR-Interferogramms. In diesem Fall ist der Bereich in der Y-Achse und der Azimut auf der X-Achse abgebildet. Der Filter war 4 Pixel breit im Bereich und 16 Pixel breit in Azimuth. Download movAv. m (siehe auch movAv2 - eine aktualisierte Version ermöglicht Gewichtung) Beschreibung Matlab enthält Funktionen namens movavg und tsmovavg (Zeitreihen gleitenden Durchschnitt) in der Finanz-Toolbox, MovAv wurde entwickelt, 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 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 bequem ist, alternativ können die NaNs später in einer Zeile des Codes entfernt werden (Ausgabeausgabe (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 angemessenen 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. Moving Durchschnittliche Funktion resultmovingmean (data, window, dim, option) berechnet einen zentrierten gleitenden Durchschnitt der Datenmatrixdaten unter Verwendung einer Fenstergröße, die im Fenster in Dim Dimension angegeben ist, unter Verwendung des in Option angegebenen Algorithmus. Dim und Option sind optionale Eingänge und werden standardmäßig auf 1. Dim und option optionale Eingänge können ganz übersprungen werden oder können durch a ersetzt werden. Beispielsweise gibt movingmean (data, window) die gleichen Ergebnisse wie movingmean (data, window, 1,1) oder movingmean (data, window ,, 1). Die Größe und Dimension der Eingabedatenmatrix ist nur durch die maximale Matrixgröße für Ihre Plattform begrenzt. Das Fenster muss eine ganze Zahl sein und sollte ungerade sein. Wenn das Fenster gerade ist, wird es auf die nächstniedrigere ungerade Zahl abgerundet. Funktion berechnet den gleitenden Durchschnitt mit einem Mittelpunkt und (Fenster-1) 2 Elementen vor und nach der angegebenen Dimension. An den Rändern der Matrix wird die Anzahl der Elemente vor oder nachher reduziert, so dass die tatsächliche Fenstergröße kleiner als das angegebene Fenster ist. Die Funktion ist in zwei Teile, ein 1d-2d-Algorithmus und ein 3D-Algorithmus gebrochen. Dies wurde getan, um die Lösungsgeschwindigkeit zu optimieren, insbesondere in kleineren Matrizen (d. H. 1000 x 1). Ferner werden mehrere verschiedene Algorithmen für das Problem 1d-2d und 3d bereitgestellt, da in bestimmten Fällen der Standardalgorithmus nicht der schnellste ist. Dies geschieht typischerweise, wenn die Matrix sehr breit ist (d. h. 100 x 100000 oder 10 x 1000 x 1000), und der gleitende Durchschnitt wird in der kürzeren Dimension berechnet. Die Größe, bei der der Standardalgorithmus langsamer ist, hängt vom Computer ab. MATLAB 7.8 (R2009a) Tags für Diese Datei Bitte anmelden, um Tags zu speichern. Bitte melden Sie sich an, um einen Kommentar oder eine Bewertung hinzuzufügen. Kommentare und Bewertungen (8) Die Funktion befasst sich mit Enden, indem sie den nachlaufenden oder führenden Teil des Fensters beschneiden und zu einem anfänglichen oder nachlaufenden gleitenden Durchschnitt anstelle eines zentrierten Bildes übergehen. Um mit dem Beispiel zu gehen, das Sie in Ihrem Kommentar gegeben haben, wenn die Fenstergröße 3 ist, dann in einer Mitte von 1 die Funktion Mittelwerte von Daten von den Punkten 1 und 2 an einer Mitte von 2 Punkten 1, 2 und 3 werden in einer Mitte von 9 gemittelt Die Punkte 8, 9 und 10 werden gemittelt und in einer Mitte von 10 (angenommen, der Vektor hat 10 Einträge) werden die Punkte 9 und 10 gemittelt. Wie bewegt sich movingmean mit den Enden? Fängt es mit einer Fenstergröße an, die nur Punkt 1 bei 1, dann 3 Punkte bei Punkt 2, dann Erhöhung in Fenstergröße bis die Fenstergröße ist, die in der Funktionseingabe spezifiziert ist, beginnen Danke. Nett und einfach. Vielen Dank. Gute Arbeit Sehr nützlich, wie Stephan Wolf sagte. Gerade was ich lookin für war. Zentrierter gleitender Durchschnitt, der in der Lage ist, in einem Diagramm über die gesamte Breite zu arbeiten, ohne die Fenstergröße des Filters zu betrachten und den Anfang zu bewegen. Große Beschleunigung der Geschwindigkeit der Ingenieur-und Wissenschaft MathWorks ist der führende Entwickler der mathematischen Computing-Software für Ingenieure und Wissenschaftler.

No comments:

Post a Comment