Wie bei allem sind manchmal bestimmte Werkzeuge besser als andere.
Filter mit gleitendem Durchschnitt (MA) können zum Glätten von Daten verwendet werden und sind FIR. Sie sind so ziemlich der einfachste Filter, den Sie sich vorstellen können, und sie eignen sich gut für viele Aufgaben, solange Sie nicht versuchen, plötzliche Sprünge oder Polynomtrends zu modellieren. Beachten Sie jedoch, dass es sich im Wesentlichen nur um Tiefpassfilter handelt. Sie funktionieren daher am besten, wenn die Daten, die Sie im Signal interessieren, niederfrequent und ziemlich schmalbandig sind.
Savitzky-Golay (SG) -Filter sind eine spezielle Gruppe von FIR-Filtern, die im Wesentlichen ein Polynom zu Ihrer Zeitreihe passen, wenn die Faltung entlang des Signals gleitet. SG-Filter sind nützlich für Signale, bei denen die Dinge, die Sie interessieren, nicht unbedingt niederfrequent und ziemlich schmalbandig sind.
Ich denke, Sie werden feststellen, dass wenn Sie die Wikipedia-Seite, die Sie verlinkt haben, ziemlich gründlich lesen, dies den Unterschied zwischen SG- und MA-Filtern sehr genau erklärt. Denken Sie jedoch daran: Letztendlich sind beide nur Werkzeuge, um ähnliche Dinge zu tun. Es liegt an Ihnen, herauszufinden, wann Sie das richtige Werkzeug verwenden müssen
EDIT :
Da es einige Verwirrung zu geben scheint, dass SG-Filter auf einer grundlegenden Ebene in irgendeiner Weise "adaptiv" sind, habe ich ein einfaches MATLAB-Beispiel beigefügt. Wie Dan betonte, können diese anpassungsfähig gemacht werden, ihre grundlegende Implementierung jedoch häufig nicht. Wenn Sie den Code überprüfen, werden Sie feststellen, dass dies einfach nur eine Matrix-Suche mit einer speziellen Behandlung ist. Nichts an diesem Filter ist im herkömmlichen Sinne "adaptiv". Sie wählen einfach eine Polynomanpassung und die Länge, über die dieses Polynom durch Faltung auf das Signal angepasst wird. SG ist wesentlich FIR. Das Skript, das ich unten habe, erzeugt diese Handlung:
Wenn Sie sich diese Abbildung ansehen, können Sie sehen, dass MA und SG im Wesentlichen dasselbe erreichen, jedoch mit einigen wichtigen Unterschieden:
- Der MA kann das Rauschen hervorragend unterdrücken, aber die vorübergehenden Sprünge im Signal werden schlecht erfasst. Wir können noch mehr Rauschen unterdrücken, indem wir die Länge des Filters erhöhen, aber dann wird es bei den Transienten noch schlechter abschneiden. Dieser Effekt wird als "Verschmieren" in der Nähe von Transienten angesehen, die Sie in der gezeigten Abbildung sehen sollten.
- Der SG erfasst die Transienten des Signals hervorragend, unterdrückt jedoch nicht so gut das Rauschen (zumindest im Vergleich zu einem MA gleicher Größe). Wir können die Rauschunterdrückung in der Nähe von Nicht-Transienten verbessern, indem wir die Rahmenlänge erhöhen. Dies führt jedoch zu einem Klingeln analog zum Gibb-Phänomen in der Nähe von Transienten.
Um ein besseres Verständnis der Funktionsweise dieser Filter zu erhalten, empfehlen wir Ihnen, den Code hier zu verwenden und zu bearbeiten und zu sehen, wie alle einzelnen Teile des SG-Filters funktionieren.
Code für das MATLAB-Beispiel:
% Generate a signal "s" that has square waves, and scale it with a
% polynomial of order 5
up = 1*ones(1,100);
down = zeros(1,150);
s = [down down up up down up down up down up up up down down down down down];
n = numel(s);
nn = linspace(0,4,numel(s));
s = s .* (nn .^5);
sn = (s + 4*randn(size(s))).';
% smooth it with SMA of length 15
sz = 15;
h = 1/sz * ones(1,sz);
sn_sma = conv(sn,h,'same');
% smooth it with sgolay of frame length 15
m = (sz-1)/2;
% look up the SG matrix for this order and size
B = sgolay(5, sz);
% compute the steady state response for the signal, i.e. everywhere that
% isnt the first or last "frame" for the SG filter
steady = conv(sn, B(m+1,:), 'same');
% handle the transiet portion at the start of the signal
y_st = B(1:m,:)*sn(1:sz);
% handle the transient portion at the end of the signal
y_en = B(sz -m+1 : sz, :) * sn(n - sz+1:n);
% combine our results
sn_sg = steady;
sn_sg(1:m) = y_st;
sn_sg(n-m+1:n) = y_en;
% plots
figure(1);
hold off;
plot(sn,'Color',[0.75 0.75 0.75]);
hold on;
plot(sn_sma,'b');
plot(sn_sg,'r');
legend('Noisy Signal','MA Smoothing','SG Smoothing, order 5','Location','NorthWest');
HINWEIS
Meine vorherige Antwort (vor dieser Bearbeitung), in der der Savitzky-Golay (SG) -Filter als nichtlineares, zeitvariables Eingabedaten abhängig bezeichnet wurde, war falsch, da vorzeitig falsch interpretiert wurde, wie ein Savitzky-Golay (SG) -Filter seine Ausgabe berechnet gemäß dem bereitgestellten Wiki-Link. Jetzt korrigiere ich es zum Nutzen derer, die auch sehen würden, wie SG-Filter durch FIR-LTI-Filterung implementiert werden können. Danke an @MattL. für seine Korrektur, die großartige Verbindung, die er bereitgestellt hat, und die Geduld, die er (die ich niemals hätte zeigen können) während meiner Untersuchung des Problems hatte. Obwohl ich ehrlich gesagt einen ausführlicheren Einwand vorziehen würde, der dennoch eindeutig nicht notwendig ist. Bitte beachten Sie auch, dass die richtige Antwort die andere ist. Diese dient nur zur zusätzlichen Verdeutlichung der LTI-Eigenschaft von SG-Filtern.
Nun ist es nicht verwunderlich, dass jemand, der (der diese Filter noch nie zuvor verwendet hat) der Definition des SG-Filters als LSE-Polynom niedriger Ordnung für bestimmte Daten gegenübersteht, sofort zu dem Schluss kommt, dass diese datenabhängig, nichtlinear und sind zeitvariable, adaptive Filter.
Das Polynomanpassungsverfahren wird jedoch von SG selbst geschickt interpretiert, so dass es eine vollständig datenunabhängige, zeitinvariante, lineare Filterung ermöglicht, wodurch SG als festes LTI-FIR-Filter möglich wird.
Das ist eine kürzeste Zusammenfassung von der Verbindung von mattl zur Verfügung gestellt. Für Details, die zu fehlen scheinen, konsultieren Sie bitte das Originaldokument oder bitten Sie um Klärung. Aber ich möchte hier nicht das gesamte Dokument nachproduzieren.
Betrachten Sie nun Eingabedatenwerte die um zentriert sind und in die wir ein Polynom der Ordnung wollen , wobei die ganzzahligen :2M+1 x[−M],x[−M+1],...,x[0],x[1],...,x[M] n=0 p[n] N n=−M,−M+1,...,−1,0,1,...M
Das klassische LSE-Polynomanpassungsverfahren berechnet diese Koeffizienten , um das optimale Polynom Ordnung herauszufinden, das die Summe der Fehlerquadrate minimiertak Nth p[n]
über den gegebenen Datenvektor .x=[x[−M],x[−M+1],...,x[0],x[1],...,x[M]]T
Diese optimalen Polynomkoeffizienten werden erhalten, indem die Ableitung von auf Null gesetzt wird:ak E
Für diejenigen, die mit dem LSE-Polyfit-Verfahren vertraut sind, schreibe ich einfach die resultierende Matrixgleichung (aus dem Link), die den optimalen Koeffizientensatz definiert:
Jetzt lehnen wir uns für einen Moment zurück und diskutieren hier einen Punkt.
Wie aus Gleichung (2) klar hervorgeht, sind die optimalen LSE-Polynomkoeffizienten von den Eingabedaten abhängig , obwohl und unabhängig von den Eingabedaten sind und nur von den Zeitindizes abhängen. Darüber hinaus hängen sie auch von der Größe des Fensters und der Reihenfolge des Polynoms . Wenn das Fenster entlang der Eingabedaten gleitet , sollte der Koeffizient neu berechnet (aktualisiert) werden und ist daher auch zeitabhängig. Genau so wird der SG-Filter im Link auf der Seite definiert, die unten aufgeführt ist:A H n ak M N x[n] ak 2nd
... Dies (das LSE-Polyfit) kann bei jedem Abtastwert der Eingabe wiederholt werden, wobei jedes Mal ein neues Polynom und ein neuer Wert der Ausgabesequenz y [n] erzeugt werden ...
Wie überwinden wir diese rätselhafte Überraschung? Durch Interpretieren und Definieren der SG-Filterausgabe wie folgt:
Das SG-Filter der Ordnung akzeptiert für jede Zeitabtastung einen Eingabesatz und erzeugt eine einzelne Ausgangsabtastung , die als das bei bewertete Polynom definiert ist ; dhN n x[n] y[n] p[n] n=0
Das heißt, für jeden Eingangssatz von Abtastwerten von (zentriert um ) erzeugt das SG-Filter die mit bezeichnete Ausgabe, die dem einzelnen Koeffizienten der optimalen LSE entspricht Polynom , das diesem bestimmten Fenster der Abtastwerte . Während das Fenster entlang der Eingangsdatenlänge gleitet, wird übrigens zu jedem Zeitpunkt eine neue Ausgangsabtastung gemäß dem Fenster der Abtastwerte berechnet. . Hier ist dies ein Nancusal-Filter.2M+1 x[n] n=d y[n] a0 p[n] x[n] n=d y[d] x[d−M],x[d−M+1],...,x[d−1],x[d],x[d+1],...x[d+M]
Es ist nun an der Zeit zu zeigen, dass der Koeffizient als lineare Kombination von Eingangssignalwerten im Fenster erhalten wird und der Filterausgang daher eine lineare Kombination von Eingangswerten . Und dies ist genau die Definition der (LTI) -Faltung über ein FIR-Filter; Die Ausgabe zum Zeitpunkt ist die lineare Kombination ihrer Eingabe und der Filterkoeffizienten . Aber was sind dann die Filterkoeffizienten für diesen SG-Filter? Mal sehn.a0 x[n] y[n] x[n] n x[n] h[n]
Betrachten Sie noch einmal die Berechnung von :ak
woraus wir sehen können, dass der einzelne Koeffizient durch das Punktprodukt der ersten Zeile von mit dem Eingabedatenvektor ; dha0 H x
wo in der letzten Gleichheit wir die Punktproduktsumme als die Faltungssumme interpretiert haben, indem wir die Impulsantwort des SG-Filters als ,h[n]=H(0,−n)
Insbesondere ist es die Impulsantwort des SG-Filters der Ordnung mit einer Fensterlänge von .N 2M+1
Und die vollständige Ausgabe des SG-Filters N-ter Ordnung mit einer Fenstergröße von für eine Eingabe der Länge wird durch eine einzelne LTI-Faltung mit der Impulsantworty[n] 2M+1 x[n] L hN[n]
KOMMENTAR
Die Tatsache, dass die Polynomkoeffizienten von den Eingabedaten abhängen, verhindert nicht, dass der Filter eine LTI-FIR ist. Weil eine Impulsantwort definiert werden kann, um den Ausgang darzustellen , der aus einer linearen Kombination von Eingangsabtastwerten berechnet werden soll. Die linearen Kombinationen von Eingangsabtastwerten werden von Natur aus durch das Matrixprodukt impliziert , das die optimalen Koeffizienten von . Daher würde jede lineare Kombination von auch dazu führen, dass ein FIR-LTI-Filter dargestellt wird das LSE-Polynomanpassungsverfahren.ak h[n] y[n] x a=Hx ak p[n] ak h[n]
MATLAB / OKTVE-CODE
Das folgende einfache MATLAB / OCTAVE kann verwendet werden, um diese SG-Filter-Impulsantworten zu berechnen (Beachten Sie, dass der eingebaute SG-Designer möglicherweise einen anderen Satz von wie im verknüpften PDF beschrieben).h[n] h[n]
Die Ausgabe ist:
Hoffe, das klärt das Problem.
quelle