Filtro Savitzky – Golay vs. IIR o filtro lineare FIR


11
  • Un filtro IIR / FIR tradizionale (passa basso per rimuovere le oscillazioni freq elevate), ad es. Media mobile,

  • o un filtro Savitzky-Golay

può essere utile per attenuare un segnale, come un segnale di inviluppo:

inserisci qui la descrizione dell'immagine

Per quale applicazione un filtro Savitzky-Golay sarebbe più interessante di un passa basso classico?

Cosa lo differenzia da un filtro standard e cosa aggiunge rispetto ai filtri standard?

Si adatta ai dati di input?

È meglio per la conservazione transitoria?


Un giorno ti sei mai trovato in una situazione ingegneristica quando hai deciso "Usiamo un filtro SG invece di spostare la media o un altro passa basso FIR! È meglio perché questo e questo e questo ..." ? Quindi questa domanda è per te!

Risposte:


4

Poiché la discussione nelle risposte e nei commenti esistenti si è concentrata principalmente su quali filtri Savitzky-Golay sono effettivamente (il che è stato molto utile), cercherò di aggiungere alle risposte esistenti fornendo alcune informazioni su come scegliere effettivamente un filtro di smoothing, che è, per la mia comprensione, di cosa si tratti effettivamente.

Prima di tutto, vorrei ripetere ciò che è diventato chiaro nella discussione che nasce dalle altre risposte: la categorizzazione dei filtri di smoothing nella domanda in filtri FIR / IIR lineari e invarianti nel tempo (LTI) da un lato, e I filtri Savitzky-Golay invece sono fuorvianti. Un filtro Savitkzy-Golay è solo un filtro FIR standard progettato secondo un criterio specifico (approssimazione polinomiale locale). Quindi tutti i filtri menzionati nella domanda sono filtri LTI.

La domanda rimanente è come scegliere un filtro di smoothing. Se la complessità computazionale e / o la memoria sono un problema, i filtri IIR possono essere preferibili ai filtri FIR, perché in genere raggiungeranno una soppressione del rumore comparabile (cioè l'attenuazione della banda di arresto) con un ordine filtro molto inferiore rispetto ai filtri FIR. Tuttavia, se è necessaria l'elaborazione in tempo reale, uno dei possibili svantaggi dei filtri IIR è che non possono avere una risposta di fase esattamente lineare. Quindi il segnale desiderato subirà alcune distorsioni di fase. Per l'elaborazione offline, è possibile evitare le distorsioni di fase, anche con i filtri IIR, applicando il filtro a fase zero .

A parte le considerazioni discusse nel paragrafo precedente, è principalmente il criterio di progettazione che conta, non tanto se il filtro è FIR o IIR, perché qualsiasi filtro IIR (stabile) può essere approssimato con precisione arbitraria da un filtro FIR e qualsiasi Il filtro FIR può essere approssimato da un filtro IIR, anche se quest'ultimo può essere molto più difficile. Il criterio di progettazione appropriato dipende ovviamente dalle proprietà dei dati e dal rumore. Quando si tratta di smoothing, di solito assumiamo dati sufficientemente sovra-campionati (ovvero, smooth). Se il rumore ha principalmente componenti ad alta frequenza, cioè se c'è poca sovrapposizione spettrale tra i dati e il rumore, vogliamo massimizzare l'attenuazione della banda di arresto o minimizzare l'energia della banda di arresto, preservando il segnale desiderato nel miglior modo possibile. In questo caso potremmo scegliere un filtro FIR a fase lineare progettato secondo un criterio minimax usando l'algoritmo Parks-McClellan. Potremmo anche minimizzare l'energia della banda di arresto (cioè minimizzare la potenza del rumore nella banda di arresto) scegliendo un metodo dei minimi quadrati. È possibile un mix tra i due criteri (minimax e minimi quadrati) scegliendo aprogettazione dei minimi quadrati vincolati , che riduce al minimo l'energia della banda di arresto limitando al contempo l'errore di approssimazione massima nella banda di passaggio.

Se lo spettro del rumore si sovrappone significativamente con lo spettro del segnale, è necessario un approccio più attento e l'attenuazione della forza bruta non funzionerà bene perché si lascia troppo rumore (scegliendo una frequenza di taglio troppo alta) o si distorce il desiderato segnale troppo. In questo caso i filtri Savitzky-Golay (SG) possono essere una buona scelta. Il prezzo da pagare è un'attenuazione mediocre della banda di arresto, ma un vantaggio è che alcune proprietà del segnale vengono conservate molto bene. Ciò ha a che fare con il fatto che i filtri SG hanno una risposta in banda passante piatta, ovvero

(1)dkH(ejω)dωk|ω=0=0k=1,2,,r

dove è l'ordine del polinomio approssimativo e è la risposta in frequenza del filtro. La proprietà garantisce che i primi momenti del segnale di ingresso siano preservati nell'uscita, il che significa che la larghezza e l'altezza dei picchi nel segnale desiderato sono ben conservate.rH(ejω)(1)r

Naturalmente c'è anche un compromesso tra i due tipi di filtri di smoothing discussi sopra (attenuazione della banda di arresto elevata e SG). Potremmo progettare un filtro FIR con un certo grado di planarità a e usare i restanti gradi di libertà per massimizzare l'attenuazione della banda di arresto o minimizzare l'energia della banda di arresto. Nel caso dei filtri FIR, il problema di progettazione risultante è sufficientemente semplice (e convesso) e le routine di ottimizzazione generale disponibili in diversi pacchetti software possono essere utilizzate per ottenere il filtro ottimale per la specifica applicazione.ω=0

Per quelli interessati alla teoria dei filtri SG, i riferimenti più rilevanti che posso consigliare sono i seguenti:


2

Come per qualsiasi cosa, a volte alcuni strumenti sono migliori di altri.

I filtri a media mobile (MA) possono essere utilizzati per rendere più fluidi i dati e sono FIR. Sono praticamente il filtro più semplice che puoi inventare e funzionano bene per molte attività purché non cerchi di modellare salti improvvisi o tendenze polinomiali. Tieni presente, tuttavia, che si tratta essenzialmente di un filtro passa-basso, quindi funzionano meglio quando i dati che ti interessano nel segnale sono a bassa frequenza e piuttosto a banda stretta.

I filtri Savitzky-Golay (SG) sono un gruppo speciale di filtri FIR che essenzialmente adattano un polinomio alle serie temporali mentre la convoluzione scorre lungo il segnale. I filtri SG sono utili per segnali in cui le cose a cui tieni non sono necessariamente bassa frequenza e banda abbastanza stretta.

Penso che scoprirai che se leggi la pagina di Wikipedia che hai collegato abbastanza a fondo, spiega la differenza tra i filtri SG e MA con dettagli abbastanza rigorosi. Ricorda però: alla fine, sono entrambi solo strumenti per fare cose simili, sta a te scoprire quando usare lo strumento giusto

MODIFICA :

Dato che sembra esserci un po 'di confusione sul fatto che i filtri SG siano "adattativi" in qualche modo a livello di base, ho incluso un semplice esempio MATLAB. Come ha sottolineato Dan, questi possono essere resi adattivi, ma la loro implementazione di base spesso non lo è. Ispezionando il codice, vedrai che questa è semplicemente una matrice di ricerca con una gestione speciale. Nulla di questo filtro è "adattivo" nel senso tradizionale, stai semplicemente scegliendo un adattamento polinomiale e la lunghezza su cui quel polinomio verrà adattato al segnale tramite convoluzione; SG è FIR essenziale. Lo script che ho di seguito produce questa trama: Confronto del filtro SG con MA

Guardando questa figura, puoi vedere che MA e SG essenzialmente realizzano la stessa cosa, ma con alcune importanti distinzioni:

  1. Il MA fa un ottimo lavoro nel sopprimere il rumore, ma fa un cattivo lavoro catturando i salti transitori nel segnale. Siamo in grado di sopprimere ancora più rumore aumentando la lunghezza del filtro, ma poi funzionerà ancora peggio sui transitori; questo effetto sarà visto come "sbavatura" vicino a qualsiasi transitorio, che dovresti essere in grado di vedere nella figura mostrata.
  2. L'SG fa un ottimo lavoro nel catturare i transienti del segnale, ma fa un lavoro non eccezionale nel sopprimere il rumore (almeno in confronto a un MA delle stesse dimensioni). Possiamo migliorare la soppressione del rumore vicino a non transitori aumentando la lunghezza del frame, ma ciò introdurrà un suono simile al fenomeno di Gibb vicino a qualsiasi transitorio.

Per capire meglio come funzionano questi filtri, ti incoraggio a prendere il codice qui e manipolarlo, e vedere come funzionano tutte le singole parti del filtro SG.

Codice per l'esempio MATLAB:

% 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');

1
Il punto sembra essere (vedendo l'altra risposta) che il filtro SG è un " filtro variabile non temporale completamente dipendente dai dati, i cui coefficienti sono ricalcolati per ciascun segmento corto del suo input".
g6kxjv1ozn,

1
Il filtro SG, a quanto ho capito implementandolo più volte, non è affatto un filtro adattativo, soprattutto in confronto al tuo filtro adattativo medio come un LMS o RLS. Non sarei completamente d'accordo con l'affermazione secondo cui i pesi del filtro variano nel tempo. I filtri SG sono essenzialmente una ricerca nella tabella, si filtra con i valori della tabella per calcolare una risposta transitoria, quindi si torna indietro e si gestiscono i casi limite all'inizio / alla fine del segnale. Modificherò il mio post con un esempio MATLAB per mostrartelo.
matthewjpollard,

2
@matthewjpollard Da notare, personalmente non ho una significativa esperienza nell'uso di questo filtro, ma per me il filtro SG come meglio implementato sembra molto un'implementazione del filtro adattivo, con coefficienti variabili nel tempo. Il modo in cui hai applicato il filtro nel tuo codice non è (poiché hai trattato l'intera sequenza come il "sottoinsieme" di dati), ma il modo specificamente descritto in Wikipedia en.wikipedia.org/wiki/Savitzky%E2%80% 93Golay_filter e nel documento stesso di Savitzky e Golay sono davvero adattivi: pdfs.semanticscholar.org/4830/…
Dan Boschen

2
@matthewjpollard Nei tuoi sistemi in tempo reale i tuoi dati sono sempre in streaming continuo, in modo da ricalcolare i coefficienti su intervalli più brevi o lavori sempre in piccoli blocchi di dati?
Dan Boschen,

2
Grazie Matt. Quindi forse potremmo associare ciò che stai facendo come adattativo / che varia nel tempo nel senso che i coefficienti sono calcolati per ogni raccolta di dati (gli stessi coefficienti all'interno di una raccolta di dati tuttavia con un trattamento adeguato di inizio e fine ma che variano da una raccolta all'altra- se io capire correttamente). Grazie per aver condiviso il codice e l'applicazione di esempio.
Dan Boschen,

2

NOTA

la mia risposta precedente (prima di questa modifica) che indicava il filtro Savitzky-Golay (SG) come un input di dati non lineare, variabile nel tempo e dipendente era errata, a causa di un'interpretazione errata prematura di come un filtro Savitzky-Golay (SG) calcola il suo output secondo il link wiki fornito. Quindi ora lo sto correggendo a beneficio di coloro che vedrebbero anche come i filtri SG sono implementabili dal filtro FIR-LTI. Grazie a @MattL. per la sua correzione, l'ottimo collegamento che ha fornito e la pazienza che aveva (che non avrei mai potuto dimostrare) durante le mie indagini sulla questione. Sebbene io onestamente preferisco un'obiezione più dettagliata che non è chiaramente necessaria comunque. Si noti inoltre che la risposta corretta è l'altra, questa è solo per ulteriori chiarimenti sulla proprietà LTI dei filtri SG.

Ora non sorprende che quando qualcuno (che non ha mai usato quei filtri prima) affronti la definizione del filtro SG come un adattamento polinomiale LSE di ordine basso a determinati dati , salterebbe immediatamente alla conclusione che questi sono dipendenti dai dati, non lineari e filtri adattativi variabili nel tempo (shift).

Tuttavia, la procedura di adattamento polinomiale viene interpretata abilmente dagli stessi SG, in modo da consentire un filtro lineare completamente indipendente dai dati, invariante nel tempo, rendendo così SG come un filtro LTI-FIR fisso.

Di seguito è riportato un riepilogo più breve dal collegamento fornito da MattL. Per eventuali dettagli che sembrano mancare, consultare il documento originale o chiedere di chiarire. Ma non vorrei riprodurre qui l'intero documento.

2M+1x[M],x[M+1],...,x[0],x[1],...,x[M]n=0p[n]Nn=M,M+1,...,1,0,1,...M

p[n]=k=0Naknk=a0+a1n+a2n2+...+aNnN

akNthp[n]

E=MM(p[n]x[n])2

x=[x[M],x[M+1],...,x[0],x[1],...,x[M]]T

akE

(1)Eai=0   ,   for    i=0,1,..,N

Ora per coloro che hanno familiarità con la procedura polyfit LSE, scriverò semplicemente l'equazione della matrice risultante (dal collegamento) che definisce il set di coefficienti ottimale:

(2)a=(ATA)1ATx=Hx
x(2M+1)×1H2M+1NAnAHA

A=[αn,i]=[(M)0(M)1...(M)N(M+1)0(M+1)1...(M+1)N...(0)0(0)1...(0)N...(M)0(M)1...(M)N]

Ora lasciamoci indietro per un momento e discutere un punto qui.

AHnakMNx[n]ak2nd

... Questo (LSE polyfit) può essere ripetuto ad ogni campione dell'ingresso, producendo ogni volta un nuovo polinomio e un nuovo valore della sequenza di uscita y [n] ...

Quindi, come possiamo superare questa sconcertante sorpresa? Interpretando e definendo l'output del filtro SG come segue:

Nnx[n]y[n]p[n]n=0

y[n]=y[0]=m=0Namnm=a0

2M+1x[n]n=dy[n]a0p[n]x[n]n=dy[d]x[dM],x[dM+1],...,x[d1],x[d],x[d+1],...x[d+M]

a0x[n]y[n]x[n]nx[n]h[n]. Ma allora, quali sono i coefficienti di filtro per questo filtro SG? Vediamo.

ak

a=Hx

[a0a1aN]=[h(0,0)h(0,1)...h(0,2M)h(1,0)h(1,1)...h(1,2M)...h(N,0)h(0,1)...h(0,2M)][x[M]x[M+1]...x[M]]

a0Hx

a0=H(0,n)x=H(0,k)x[k]=H(0,n)x[n]

h[n]=H(0,n)

N2M+1

y[n]2M+1x[n]LhN[n]

y[n]=x[n]hN[n]

COMMENTO

akh[n]y[n]xa=Hxakp[n]akh[n]

MATLAB / CODICE OCTVE

h[n]h[n]

% Savitzky-Golay Filter
% 
clc; clear all; close all;

N = 3;                      % a0,a1,a2,a3 : 3rd order polynomial
M = 4;                      % x[-M],..x[M] . 2M + 1 data

A = zeros(2*M+1,N+1);
for n = -M:M
    A(n+M+1,:) = n.^[0:N];
end

H = (A'*A)^(-1)* A';        % LSE fit matrix

h = H(1,:);                 % S-G filter impulse response (nancausal symmetric FIR)

figure,subplot(2,1,1)
stem([-M:M],h);
title(['Impulse response h[n] of Savitzky-Golay filter of order N = ' num2str(N), ' and window size 2M+1 =  ' , num2str(2*M+1)]);

subplot(2,1,2)
plot(linspace(-1,1,1024), abs(fftshift(fft(h,1024))));
title('Frequency response magnitude of h[n]');

L'output è:

inserisci qui la descrizione dell'immagine

Spero che questo chiarisca il problema.


2
@ Fat32 Penso che sia perché era un lungo elenco di commenti avanti e indietro, quindi per mantenere pulito il forum lo spostano in genere "per chattare". È ancora tutto lì, semplicemente non ingombrando la pagina principale. Questo è il motivo per cui il sistema suggerisce di spostarlo in chat quando avanti e indietro diventa troppo lungo. Per non preoccuparti, tutti ti amano ancora.
Dan Boschen,

1
@ g6kxjv1ozn Sono arrivato a quel punto ... per favore aspetta ...
Fat32,

2
@ Fat32 Ottimo lavoro! L'ho letto, ma dovrò leggerlo ed è scritto in modo molto chiaro, dovrò solo seguire passo dopo passo con carta e matita per vederlo totalmente come fai ora. Grazie per aver messo tutto qui.
Dan Boschen,

4
1ω=0

2
akh[n]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.