Matlab Moving Average Double
Ich versuche, einen gleitenden durchschnittlichen Filter in C-Sprache zu machen, Ive hat ein Matlab-Programm angepasst, das ordnungsgemäß funktioniert, der Eingang meines Filters ist ein. pcm-Archiv (ein Sweep-Audiosignal), das Problem für mich ist das Ausgabearchiv des Umzugs Durchschnitt in C-Sprache, die Ausgabe geht schief, das Signal sinkt nur um die Zeit (dont filtter). Unterhalb meines C-Codes: Das Bild unten ist die Ausgabe des Matlab-Programms zum gleitenden Durchschnitt mit der Länge 16: Dieses Bild ist die Ausgabe in C-Sprache mit gleitendem Durchschnitt mit Länge 16: Jemand weiß, was unter dem Code in Matlab sein kann, das Ive Angepasst: Update 1 (mit der obigen Antwort): Der Anfang des Signals noch mit Interferenz, aber von der Mitte bis zum Ende des Signals ist korrekt. Download movAv. m (siehe auch movAv2 - eine aktualisierte Version, die Gewichtung erlaubt) Beschreibung Matlab Enthält die Funktionen namens movavg und tsmovavg (Zeitreihen gleitender Durchschnitt) in der Financial Toolbox, movAv ist entworfen, um die grundlegende Funktionalität dieser zu replizieren. Der Code hier gibt ein schönes Beispiel für die Verwaltung von Indizes innerhalb Schleifen, die verwirrend sein können, um mit zu beginnen. Ive bewusst bewahrt den Code kurz und einfach, um diesen Prozess klar zu halten. MovAv führt einen einfachen gleitenden Durchschnitt durch, der in einigen Situationen verwendet werden kann, um laute Daten wiederherzustellen. Es funktioniert, indem man den Mittelwert der Eingabe (y) über ein gleitendes Zeitfenster nimmt, dessen Größe durch n angegeben ist. Je größer n ist, desto größer ist der Glanzgrad der Wirkung von n relativ zur Länge des Eingangsvektors y. Und effektiv (gut, Art von) schafft einen Tiefpass-Frequenz-Filter - siehe die Beispiele und Überlegungen Abschnitt. Da die Menge an Glättung, die durch jeden Wert von n gegeben wird, relativ zu der Länge des Eingangsvektors ist, ist es immer wert, verschiedene Werte zu testen, um zu sehen, was angemessen ist. Denken Sie auch daran, dass n Punkte in jedem Durchschnitt verloren gehen, wenn n 100 ist, die ersten 99 Punkte des Eingangsvektors enthalten nicht genügend Daten für einen 100pt Durchschnitt. Dies kann durch Stapeln von Durchschnittswerten etwas vermieden werden, z. B. der Code und das Diagramm unten vergleichen eine Anzahl unterschiedlicher Längenfensterdurchschnitte. 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 Rauschen rausschalten 4 Rausch repmat (randn (1, ceil (numel (x) noiseReps)), noiseReps, 1) Rauschumformung (Rauschen, 1, Länge (Rauschen) noiseReps) Generieren Sie ydata noise yexp ( (Y, 10) 10 pt y3 movAv (y2, 10) 1010 pt y4 movAv (y, 20) 20 pt y5 movAv (y, 40) 40 pt (X, y, y2, y3, y4, y5, y6) Legende (Rohdaten, 10pt gleitender Durchschnitt, 1010pt, 20pt, 40pt, 100pt) xlabel (x) ylabel (x, y, y2, y3, y4, y5, y6) Y) Titel (Vergleich der gleitenden Durchschnitte) movAv. m Code Durchlauffunktion Ausgang movAv (y, n) Die erste Zeile definiert den Funktionsnamen, Ein - und Ausgänge. Die Eingabe x sollte ein Vektor von Daten sein, um den Durchschnitt zu durchführen, 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. VorbereitungsausgangNaN (1, Numel (y)) Mittelpunkt von n midPoint Runde finden (n2) Die Hauptarbeit der Funktion erfolgt in der for-Schleife, aber vor dem Start werden zwei Dinge vorbereitet. Zuerst wird die Ausgabe als NaNs vorgegeben, dies diente zwei Zwecken. Zuerst ist die Vorveröffentlichung in der Regel gute Praxis, da es das Gedächtnis-Jonglieren reduziert, das Matlab zu tun hat, zweitens macht es es sehr einfach, die gemittelten Daten in eine Ausgabe zu bringen, die die gleiche 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 (Die Variable midPoint wird verwendet, um die Daten in den Ausgangsvektor auszurichten N 10, 10 Punkte werden verloren, weil für die ersten 9 Punkte des Eingangsvektors es nicht genügend Daten gibt, um einen 10-Punkt-Durchschnitt zu nehmen. Da 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 die Eingabe wird mit dem Ausgang durch die NaN-Puffer, die bei der Vorverteilung der Ausgabe erzeugt werden, mit einer Ausrichtung von 1: Länge (y) - n, (A: b) ban berechnen Mittelwert (amidPoint) Mittelwert (y (a: b)) Ende In der for-Schleife selbst wird ein Mittelwert über jedes aufeinanderfolgende Segment der Eingabe übernommen. Die Schleife läuft für a Definiert als 1 bis zur Länge des Eingangs (y), abzüglich der Daten, die verloren gehen (n) Wenn der Eingang 100 Punkte lang ist und n 10 ist, läuft die Schleife von (a) 1 bis 90. Dies ist möglich Bedeutet, dass der erste Index des zu gemittelten Segments bereitgestellt wird. Der zweite Index (b) ist einfach an-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 im Ausgang 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 eine Eingabe der Länge 100, a91. B 9010-1 100 so wird der Mittelwert über x (91: 100) übernommen und im Ausgang (95) gespeichert. Dies verlässt den Ausgang mit insgesamt n (10) NaN-Werten am Index (1: 5) und (96: 100). Beispiele und Überlegungen Umzugsdurchschnitte sind in manchen Situationen sinnvoll, aber sie sind 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 der Frequenz, aber wir können diese Variation mit den Kalibrierdaten korrigieren - die Ausgabe kann in der Höhe angepasst werden, um die Schwankungen der Kalibrierung zu berücksichtigen. Beachten Sie, dass die Rohdaten verrauscht sind - das bedeutet, dass eine kleine Frequenzänderung eine große, unberechenbare Änderung der Ebene zu berücksichtigen scheint. Ist das 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 dies nicht optimal in diesem Beispiel Mehr Daten wäre besser - Mehrere Kalibrierungen läuft gemittelt zusammen würde das Rauschen im System zerstören (solange es zufällig) und eine Kurve mit weniger subtilen Details verloren zu machen. Der gleitende Durchschnitt kann sich nur annähern, und kann einige höhere Frequenz Dips und Peaks aus der Kurve, die wirklich existieren zu entfernen. Sinuswellen Mit einem gleitenden Durchschnitt auf Sinuswellen hebt sich zwei Punkte hervor: Die allgemeine Frage der Wahl einer vernünftigen Anzahl von Punkten, um den Durchschnitt zu übertreffen. Es ist einfach, aber es gibt effektivere Methoden der Signalanalyse als die Mittelung von oszillierenden Signalen im Zeitbereich. In dieser Grafik ist die ursprüngliche Sinuswelle blau aufgetragen. Lärm wird hinzugefügt und als orangefarbene Kurve aufgetragen. Ein gleitender Durchschnitt wird an verschiedenen Punkten 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 Geräusch ganz, wo, wie eine größere Anzahl von Punkten beginnen, Amplitude Detail zu verlieren, wie der Durchschnitt erstreckt sich über verschiedene Phasen (denken Sie daran, die Welle oscilates um Null, und Mittel (-1 1) 0) . Ein alternativer Ansatz wäre, ein Tiefpassfilter zu konstruieren, als es auf das Signal im Frequenzbereich angewendet werden kann. Ich werde nicht ins Detail gehen, da es über den Rahmen dieses Artikels hinausgeht, aber da das Rauschen beträchtlich höhere Frequenz als die Wellen-Grundfrequenz ist, wäre es in diesem Fall ziemlich einfach, einen Tiefpassfilter zu konstruieren, als die Hochfrequenz zu entfernen Lärm. Ich muss einen gleitenden Durchschnitt über eine Datenreihe innerhalb einer for-Schleife berechnen. Ich muss den gleitenden Durchschnitt über N9 Tage bekommen. Das Array Im Computing in ist 4 Serien 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 darstellen. Ich googelte ein bisschen über bewegte Durchschnitte und den Conv-Befehl und fand etwas, was ich versucht habe, in meinem Code zu implementieren: Also grundsätzlich berechne ich meinen Mittel und plot es mit einem (falschen) gleitenden Durchschnitt. Ich habe den WTS-Wert direkt von der Mathworks-Website ausgewählt, also ist das falsch. (Quelle: mathworks. nlhelpeconmoving-average-trend-estimation. html) Mein Problem aber ist, dass ich nicht verstehe, 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 Werte werden gleich gewichtet. Und wenn ich das ganz falsch mache, könnte ich mir etwas helfen. Mein herzlichster Dank. Fragte am 23.09 um 19:05 Mit 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 erraten). Die Summe dieses Vektors sollte immer gleich eins sein. Wenn du deinen Wert gleichmäßig erwärmen möchtest und eine Größe N bewegter Filter machst, dann würdest du es tun wollen Mit dem gültigen Argument in conv wird es darum gekommen, weniger Werte in Ms zu haben, als du in M hast. Benutze das gleiche, wenn du die Auswirkungen von nicht beachtet hast Nullpolsterung. Wenn Sie die Signalverarbeitung Toolbox können Sie cconv verwenden, wenn Sie einen kreisförmigen gleitenden Durchschnitt versuchen wollen. Etwas wie Sie sollten die conv und cconv Dokumentation für weitere Informationen lesen, wenn Sie havent bereits haben. 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 im Spaltenvektor Y mit einem gleitenden durchschnittlichen Filter. Die Ergebnisse werden im Spaltenvektor yy zurückgegeben. Die Standardspanne für den gleitenden Durchschnitt ist 5.Double Moving Average Filter Beschreibung Der DoubleMovingAverageFilter implementiert einen Tiefpass doppelt gleitenden durchschnittlichen Filter. Der DoubleMovingAverageFilter ist Teil der Vorverarbeitungsmodule. Ein Beispiel für ein Signal (Sinuswellen-Zufallsrauschen), das unter Verwendung eines gleitenden Durchschnittsfilters gefiltert wurde Das rote Signal ist das ursprüngliche Signalrauschen, das grüne Signal ist das gefilterte Signal unter Verwendung eines gleitenden Durchschnittsfilters mit einer Fenstergröße von 5 und das blaue Signal ist das gefilterte Signal unter Verwendung eines gleitenden Durchschnittsfilters mit einer Fenstergröße von 20. DoubleMovingAverageFilterExampleImage1. Jpg Vorteile Der DoubleMovingAverageFilter eignet sich gut zum Entfernen einer kleinen Menge an Hochfrequenzrauschen aus einem N-dimensionalen Signal. Nachteile Der Hauptnachteil des DoubleMovingAverageFilters besteht darin, dass, um deutlich hochfrequentes Rauschen herauszufiltern, die Fenstergröße des Filters groß sein muss. Das Problem mit einem großen Filterfenster ist, dass dies eine große Latenz in jedem Signal, das durch den Filter, die möglicherweise nicht vorteilhaft für Echtzeit-Anwendungen. Wenn Sie feststellen, dass Sie ein großes Filterfenster benötigen, um Hochfrequenzrauschen herauszufiltern, und die Latenz, die durch diese Fenstergröße verursacht wird, eignet sich nicht für Ihre Echtzeitanwendung, dann möchten Sie vielleicht einen Tiefpassfilter ausprobieren. Beispiel Code GRT DoubleMovingAverageFilter Beispiel Dieses Beispiel veranschaulicht, wie das GRT DoubleMovingAverageFilter PreProcessing Module erstellt und verwendet wird. Der DoubleMovingAverageFilter implementiert einen Tiefpass-Double-Gleit-Durchschnitt-Filter. In diesem Beispiel erstellen wir eine Instanz eines DoubleMovingAverageFilters und verwenden diese, um einige Dummy-Daten zu filtern, die aus einem Sinuswellen-Zufallsrauschen erzeugt werden. Das Testsignal und die gefilterten Signale werden dann in einer Datei gespeichert (so können Sie die Ergebnisse in Matlab, Excel, etc. bei Bedarf aufzeichnen). Dieses Beispiel zeigt Ihnen, wie Sie: - Erstellen Sie eine neue DoubleMovingAverageFilter-Instanz mit einer bestimmten Fenstergröße für ein 1-dimensionales Signal - Filtern Sie einige Daten mit dem DoubleMovingAverageFilter - Speichern Sie die DoubleMovingAverageFilter-Einstellungen in einer Datei - Laden Sie die DoubleMovingAverageFilter-Einstellungen aus einer Datei mit dem Eintrag quotGRT. hquot Mit namespace GRT int main 40 int argc. Const char argv 91 93 41 123 Erstellen einer neuen Instanz eines doppelt gleitenden Durchschnittsfilters mit einer Fenstergröße von 5 für ein 1-dimensionales Signal DoubleMovingAverageFilter-Filter 40 5. 1 41 Erstellen und öffnen Sie eine Datei, um die Daten-Fstream-Datei zu speichern. Öffnen Sie 40 quotDoubleMovingAverageFilterData. txtquot. Fstream Out 41 Generieren Sie einige Daten (Sinuswellenrauschen) und filtern Sie es doppelt x 0 const UINT M 1000 Zufall zufällig für 40 UINT i 0 i lt M i 41 123 Doppelsignal sin 40 x 41 zufällig. GetRandomNumberUniform 40 - 0,2. 0,2 41 doppelt gefiltertValue Filter. Filter 40 Signal 41 Datei ltlt Signal ltlt tt ltlt filteredValue ltlt endl x TWOPI double 40 M 41 10 125 Schließen Sie die Datei Datei. Schließen 40 41 Speichern Sie die Filtereinstellungen in einem Dateifilter. SaveSettingsToFile 40 quotDoubleMovingAverageFilterSettings. txtquot 41 Wir können dann die Einstellungen später laden, wenn nötig Filter. LoadSettingsFromFile 40 quotDoubleMovingAverageFilterSettings. txtquot 41 return EXITSUCCESS 125 Der DoubleMovingAverageFilter arbeitet auch mit jedem N-dimensionalen Signal: Erstellen Sie eine neue Instanz des DoubleMovingAverageFilters mit einer Fenstergröße von 10 für ein dreidimensionales Signal DoubleMovingAverageFilter Filter 40 10. 3 41 Der Wert, den Sie filtern möchten Vektor lt double gt Daten 40 3 41 Daten 91 0 93 0. Wert aus den Sensordaten 91 1 93 0. Wert aus den Sensordaten erhalten 91 2 93 0. Wert vom Sensor abschneiden Filter den Signalvektor lt double gt filteredValue filter. Filter 40 Daten 41
Comments
Post a Comment