Filtro Savitzky – Golay vs. filtro lineal IIR o FIR

11
  • Un filtro IIR / FIR tradicional (paso bajo para eliminar las oscilaciones de alta frecuencia), por ejemplo, promedio móvil,

  • o un filtro Savitzky-Golay

Todos pueden ser útiles para suavizar una señal, como una señal de envolvente:

ingrese la descripción de la imagen aquí

¿Para qué aplicación sería más interesante un filtro Savitzky-Golay que un paso bajo clásico?

¿Qué lo hace diferente de un filtro estándar y qué agrega en comparación con los filtros estándar?

¿Se adapta a los datos de entrada?

¿Es mejor para la conservación transitoria?


¿Alguna vez ha estado en una situación de ingeniería un día cuando decidió "Usemos un filtro SG en lugar de promedio móvil u otro paso bajo FIR! ¿Es mejor porque esto y esto y esto ..." ? ¡Entonces esta pregunta es para ti!

g6kxjv1ozn
fuente

Respuestas:

4

Dado que la discusión en las respuestas y comentarios existentes se ha centrado principalmente en lo que realmente son los filtros Savitzky-Golay (lo cual fue muy útil), intentaré agregar a las respuestas existentes proporcionando información sobre cómo elegir realmente un filtro de suavizado, que es, a mi entender, de qué se trata realmente la pregunta.

En primer lugar, me gustaría repetir lo que ha quedado claro en la discusión que se genera a partir de las otras respuestas: la categorización de los filtros de suavizado en la pregunta en filtros FIR / IIR lineales e invariantes en el tiempo (LTI) por un lado, y Los filtros Savitzky-Golay, por otro lado, son engañosos. Un filtro Savitkzy-Golay es solo un filtro FIR estándar diseñado de acuerdo con un criterio específico (aproximación polinómica local). Entonces, todos los filtros mencionados en la pregunta son filtros LTI.

La pregunta restante es cómo elegir un filtro de suavizado. Si la complejidad computacional y / o la memoria son un problema, los filtros IIR pueden ser preferibles a los filtros FIR, porque típicamente lograrán una supresión de ruido comparable (es decir, atenuación de banda de detención) con un orden de filtro mucho menor que los filtros FIR. Pero tenga en cuenta que si es necesario el procesamiento en tiempo real, una posible desventaja de los filtros IIR es que no pueden tener una respuesta de fase exactamente lineal. Entonces la señal deseada sufrirá algunas distorsiones de fase. Para el procesamiento fuera de línea, las distorsiones de fase se pueden evitar, incluso con filtros IIR, aplicando un filtro de fase cero .

Además de las consideraciones discutidas en el párrafo anterior, lo que importa es principalmente el criterio de diseño, no tanto si el filtro es FIR o IIR, porque cualquier filtro IIR (estable) puede ser aproximado con precisión arbitraria por un filtro FIR, y cualquier El filtro FIR puede aproximarse mediante un filtro IIR, aunque este último puede ser mucho más difícil. El criterio de diseño apropiado obviamente depende de las propiedades de los datos y el ruido. Cuando se trata de suavizar, generalmente asumimos datos suficientemente sobremuestreados (es decir, suaves). Si el ruido tiene principalmente componentes de alta frecuencia, es decir, si hay poca superposición espectral entre los datos y el ruido, queremos maximizar la atenuación de la banda de parada o minimizar la energía de la banda de parada, al tiempo que conservamos la señal deseada lo mejor posible. En este caso, podríamos elegir un filtro FIR de fase lineal diseñado de acuerdo con un criterio minimax utilizando el algoritmo Parks-McClellan. También podríamos minimizar la energía de la banda de parada (es decir, minimizar la potencia de ruido en la banda de parada) eligiendo un método de mínimos cuadrados. Una combinación entre los dos criterios (minimax y mínimos cuadrados) es posible eligiendo undiseño de mínimos cuadrados restringidos , que minimiza la energía de la banda de parada al tiempo que limita el error de aproximación máxima en la banda de paso.

Si el espectro de ruido se superpone significativamente con el espectro de la señal, se requiere un enfoque más cuidadoso, y la atenuación de la fuerza bruta no funcionará bien porque deja demasiado ruido (al elegir la frecuencia de corte demasiado alta) o distorsiona la deseada señal demasiado En este caso, los filtros Savitzky-Golay (SG) pueden ser una buena opción. El precio a pagar es la atenuación mediocre de la banda de detención, pero una ventaja es que algunas propiedades de la señal se conservan muy bien. Esto tiene que ver con el hecho de que los filtros SG tienen una respuesta de banda de paso plana, es decir,

(1)rekH(mijω)reωkEl |ω=0 0=0 0k=1,2,...,r

donde r es el orden del polinomio aproximado y H(mijω) es la respuesta de frecuencia del filtro. La propiedad (1) garantiza que los primeros r momentos de la señal de entrada se conservan en la salida, lo que significa que el ancho y la altura de los picos en la señal deseada se conservan bien.

Por supuesto, también hay un compromiso entre los dos tipos de filtros de suavizado discutidos anteriormente (alta atenuación de banda de detención y SG). Podríamos diseñar un filtro FIR con un cierto grado de planeidad en ω=0 0 y usar los grados de libertad restantes para maximizar la atenuación de la banda de parada o minimizar la energía de la banda de parada. En el caso de los filtros FIR, el problema de diseño resultante es suficientemente simple (y convexo), y las rutinas de optimización generales disponibles en varios paquetes de software se pueden utilizar para obtener el filtro óptimo para la aplicación dada.

Para los interesados ​​en la teoría de los filtros SG, las referencias más relevantes que puedo recomendar son las siguientes:

Matt L.
fuente
2

Como con cualquier cosa, a veces ciertas herramientas son mejores que otras.

Los filtros de promedio móvil (MA) se pueden usar para suavizar los datos y son FIR. Son prácticamente el filtro más simple que se te puede ocurrir, y funcionan bien para muchas tareas, siempre y cuando no intentes modelar saltos repentinos o tendencias polinómicas. Sin embargo, tenga en cuenta que estos son esencialmente solo filtros de paso bajo, por lo que funcionan mejor cuando los datos que le interesan en la señal son de baja frecuencia y de banda bastante estrecha.

Los filtros Savitzky-Golay (SG) son un grupo especial de filtros FIR que esencialmente se ajustan a un polinomio en su serie de tiempo a medida que la convolución se desliza a lo largo de la señal. Los filtros SG son útiles para señales donde las cosas que le interesan no son necesariamente de baja frecuencia y de banda bastante estrecha.

Creo que encontrará que si lee la página de Wikipedia que ha vinculado bastante, explica la diferencia entre los filtros SG y MA con bastante riguroso detalle. Sin embargo, tenga en cuenta: al final, ambos son solo herramientas para hacer cosas similares, depende de usted saber cuándo usar la herramienta adecuada

EDITAR :

Dado que parece haber cierta confusión de que los filtros SG son "adaptativos" de alguna manera en un nivel básico, he incluido un ejemplo simple de MATLAB. Como Dan señaló, estos pueden hacerse adaptativos, pero su implementación básica a menudo no lo es. Al inspeccionar el código, verá que esto es simplemente una búsqueda de matriz con un manejo especial. Nada sobre este filtro es "adaptativo" en el sentido tradicional, simplemente está eligiendo un ajuste polinómico y la longitud sobre la cual ese polinomio se ajustará a la señal mediante convolución; SG es esencial FIR. El guión que tengo a continuación produce esta trama: Comparación del filtro SG con MA

Mirando esta figura, puede ver que la MA y la SG esencialmente logran lo mismo, pero con algunas distinciones importantes:

  1. El MA hace un gran trabajo al suprimir el ruido, pero hace un mal trabajo al capturar los saltos transitorios en la señal. Podemos suprimir aún más ruido aumentando la longitud del filtro, pero luego funcionará aún peor en los transitorios; este efecto se verá como "difuminado" cerca de los transitorios, lo que debería poder ver en la figura que se muestra.
  2. El SG hace un gran trabajo al capturar los transitorios de la señal, pero no hace un gran trabajo al suprimir el ruido (al menos en comparación con un MA del mismo tamaño). Podemos mejorar la supresión de ruido cerca de los no transitorios aumentando la longitud de la trama, pero esto introducirá un sonido análogo al fenómeno de Gibb cerca de cualquier transitorio.

Para que comprenda mejor cómo funcionan estos filtros, le animo a que tome el código aquí y lo manipule, y vea cómo funcionan todas las partes individuales del filtro SG.

Código para el ejemplo de 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');
matthewjpollard
fuente
1
El punto parece ser (al ver la otra respuesta) que el filtro SG es un " filtro que varía en el tiempo no lineal totalmente dependiente de datos cuyos coeficientes se vuelven a calcular para cada segmento corto de su entrada".
g6kxjv1ozn
1
El filtro SG, según tengo entendido, al implementarlo varias veces, no es un filtro adaptativo en absoluto, especialmente en comparación con su filtro adaptativo promedio como un LMS o RLS. Estoy completamente en desacuerdo con la afirmación de que los pesos de los filtros varían en el tiempo. Los filtros SG son esencialmente una búsqueda en la tabla, usted filtra con valores de la tabla para calcular una respuesta transitoria, y luego regresa y maneja los casos de borde al inicio / final de la señal. Editaré mi publicación con un ejemplo de MATLAB para mostrarte esto.
matthewjpollard
2
@matthewjpollard Para tener en cuenta, personalmente no tengo una experiencia significativa en el uso de este filtro, pero para mí el filtro SG, como el mejor implementado, parece ser una implementación de filtro adaptativo, con coeficientes que varían en el tiempo. La forma en que aplicó el filtro en su código no es (ya que trató toda la secuencia como el "subconjunto" de datos), sino específicamente como se describe en Wikipedia en.wikipedia.org/wiki/Savitzky%E2%80% 93Golay_filter y en el propio documento de Savitzky y Golay es de hecho adaptable: pdfs.semanticscholar.org/4830/…
Dan Boschen
2
@matthewjpollard En sus sistemas en tiempo real, ¿sus datos se transmiten continuamente de manera continua, de modo que está volviendo a calcular los coeficientes en intervalos más cortos o siempre trabaja en pequeños bloques de datos?
Dan Boschen
2
Gracias Matt Entonces, podríamos asociar lo que está haciendo como adaptativo / variable en el tiempo en el sentido de que se calculan los coeficientes para cada recopilación de datos (los mismos coeficientes dentro de una recopilación de datos, sin embargo, con el tratamiento adecuado de inicio y finalización, pero varían de una recopilación a la siguiente, si yo entender correctamente). Gracias por compartir su código y aplicación de ejemplo.
Dan Boschen
2

NOTA

mi respuesta anterior (antes de esta edición) denotaba que el filtro Savitzky-Golay (SG) como un dato de entrada no lineal y variable en el tiempo era incorrecto, debido a una interpretación errónea prematura de cómo un filtro Savitzky-Golay (SG) calcula su salida de acuerdo con el enlace wiki proporcionado. Así que ahora lo estoy corrigiendo para beneficio de aquellos que también verían cómo los filtros SG son implementables mediante el filtrado FIR-LTI. Gracias a @MattL. para su corrección, el gran vínculo que ha brindado y la paciencia que tuvo (que nunca podría haber mostrado) durante mi investigación del problema. Aunque honestamente preferiría una objeción más detallada que claramente no es necesaria, sin embargo. También tenga en cuenta que la respuesta correcta es la otra, esta es solo para una aclaración adicional de la propiedad LTI de los filtros SG.

Ahora no es sorprendente que cuando alguien (que nunca ha usado esos filtros antes) se enfrenta a la definición del filtro SG como un ajuste polinomial LSE de bajo orden a los datos dados, él / ella saltaría inmediatamente a la conclusión de que son dependientes de datos, no lineales y Tiempo (cambio) variable, filtros adaptativos.

Sin embargo, el procedimiento de ajuste polinomial es interpretado hábilmente por los propios SG, de modo que permite un filtrado lineal completamente independiente de datos, invariante en el tiempo, lo que hace que SG sea un filtro LTI-FIR fijo.

El siguiente es un resumen más breve del enlace proporcionado por MattL. Para cualquier detalle que parezca faltar, consulte el documento original o solicite aclaraciones. Pero no me gustaría volver a producir el documento completo aquí.

2METRO+1X[-METRO],X[-METRO+1],...,X[0 0],X[1],...,X[METRO]norte=0 0pags[norte]nortenorte=-METRO,-METRO+1,...,-1,0 0,1,...METRO

pags[norte]=k=0 0norteunknortek=un0 0+un1norte+un2norte2+...+unnortenortenorte

unknortethpags[norte]

mi=-METROMETRO(pags[norte]-X[norte])2

X=[X[-METRO],X[-METRO+1],...,X[0 0],X[1],...,X[METRO]]T

unkmi

(1)miunyo=0 0   ,   para    yo=0 0,1,..,norte

Ahora, para aquellos que están familiarizados con el procedimiento LSE polyfit, simplemente escribiré la ecuación matricial resultante (del enlace) que define el conjunto de coeficientes óptimo:

(2)un=(UNTUN)-1UNTX=HX
X(2METRO+1)×1H2METRO+1norteUNnorteUNHUN

UN=[αnorte,yo]=[(-METRO)0 0(-METRO)1...(-METRO)norte(-METRO+1)0 0(-METRO+1)1...(-METRO+1)norte...(0 0)0 0(0 0)1...(0 0)norte...(METRO)0 0(METRO)1...(METRO)norte]

Ahora recostémonos un momento y discutamos un punto aquí.

UNHnorteunkMETROnorteX[norte]unk2nortere

... Esto (el polyfit LSE) puede repetirse en cada muestra de la entrada, produciendo cada vez un nuevo polinomio y un nuevo valor de la secuencia de salida y [n] ...

Entonces, ¿cómo superamos esta sorprendente sorpresa? Al interpretar y definir la salida del filtro SG para que sea la siguiente:

nortenorteX[norte]y[norte]pags[norte]norte=0 0

y[norte]=y[0 0]=metro=0 0norteunmetronortemetro=un0 0

2METRO+1X[norte]norte=rey[norte]un0 0pags[norte]X[norte]norte=rey[re]X[re-METRO],X[re-METRO+1],...,X[re-1],X[re],X[re+1],...X[re+METRO]

un0 0X[norte]y[norte]X[norte]norteX[norte]h[norte]. Pero entonces, ¿cuáles son los coeficientes de filtro para este filtro SG? Veamos.

unk

un=HX

[un0 0un1unnorte]=[h(0 0,0 0)h(0 0,1)...h(0 0,2METRO)h(1,0 0)h(1,1)...h(1,2METRO)...h(norte,0 0)h(0 0,1)...h(0 0,2METRO)][X[-METRO]X[-METRO+1]...X[METRO]]

un0 0HX

un0 0=H(0 0,norte)X=H(0 0,k)X[k]=H(0 0,-norte)X[norte]

h[norte]=H(0 0,-norte)

norte2METRO+1

y[norte]2METRO+1X[norte]Lhnorte[norte]

y[norte]=X[norte]hnorte[norte]

COMENTARIO

unkh[norte]y[norte]Xun=HXunkpags[norte]unkh[norte]

CODIGO MATLAB / OCTVE

h[norte]h[norte]

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

El resultado es:

ingrese la descripción de la imagen aquí

Espero que esto aclare el problema.

Grasa32
fuente
2
@ Fat32 Creo que es porque era una larga lista de comentarios de ida y vuelta, por lo que para mantener el tablero limpio, generalmente lo mueven "para chatear". Todo sigue ahí, solo que no abarrota la página principal. Es por eso que el sistema sugiere moverlo para chatear cuando el tiempo de ida y vuelta es demasiado largo. No te preocupes, todos aún te quieren.
Dan Boschen
1
@ g6kxjv1ozn Estoy llegando a ese punto ... por favor espere ...
Fat32
2
@ Fat32 ¡Buen trabajo! Lo leí, pero tendré que leerlo y está escrito muy claramente, solo tendré que seguirlo con lápiz y papel paso a paso para verlo totalmente como lo haces ahora. Gracias por poner todo esto aquí.
Dan Boschen
44
1ω=0 0
2
unkh[norte]