Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

sgolay

Diseño de filtros de Savitzky-Golay

Descripción

ejemplo

b = sgolay(order,framelen) diseña un filtro de suavizado FIR de Savitzky-Golay con orden polinomial order y longitud de cuadro framelen.

b = sgolay(order,framelen,weights) especifica un vector de ponderación, weights, que contiene las ponderaciones reales de valor positivo que se usarán durante la minimización de mínimos cuadrados.

ejemplo

[b,g] = sgolay(___) devuelve la matriz g de los filtros de diferenciación. Puede utilizar estos argumentos de salida con cualquiera de las sintaxis de entrada anteriores.

Ejemplos

contraer todo

Genere una señal que consiste en una sinusoide de 0,2 Hz integrada en ruido blanco gaussiano y muestreada cinco veces por segundo durante 200 segundos.

dt = 1/5;
t = (0:dt:200-dt)';

x = 5*sin(2*pi*0.2*t) + randn(size(t));

Utilice sgolay para suavizar la señal. Utilice marcos de 21 muestras y polinomios de cuarto orden.

order = 4;
framelen = 21;

b = sgolay(order,framelen);

Calcule la parte de estado estable de la señal convolucionándola con la fila central de b.

ycenter = conv(x,b((framelen+1)/2,:),'valid');

Calcule los transitorios. Utilice las últimas filas de b para el inicio y las primeras filas de b para el fin.

ybegin = b(end:-1:(framelen+3)/2,:) * x(framelen:-1:1);
yend = b((framelen-1)/2:-1:1,:) * x(end:-1:end-(framelen-1));

Concatene los transitorios y la parte de estado estable para generar la señal suavizada completa. Represente la señal original y la estimación de Savitzky-Golay.

y = [ybegin; ycenter; yend];
plot([x y])
legend('Noisy Sinusoid','S-G smoothed sinusoid')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Noisy Sinusoid, S-G smoothed sinusoid.

Genere una señal que consiste en una sinusoide de 0,2 Hz integrada en ruido blanco gaussiano y muestreada cuatro veces por segundo durante 20 segundos.

dt = 0.25;
t = (0:dt:20-1)';

x = 5*sin(2*pi*0.2*t)+0.5*randn(size(t));

Estime las tres primeras derivadas de la sinusoide utilizando el método de Savitzky-Golay. Utilice marcos de 25 muestras y polinomios de quinto orden. Divida las columnas por potencias de dt para escalar las derivadas correctamente.

[b,g] = sgolay(5,25);

dx = zeros(length(x),4);
for p = 0:3
  dx(:,p+1) = conv(x, factorial(p)/(-dt)^p * g(:,p+1), 'same');
end

Represente la señal original, la secuencia suavizada y las estimaciones de las derivadas.

plot(x,'.-')
hold on
plot(dx)
hold off

legend('x','x (smoothed)','x''','x''''', 'x''''''')
title('Savitzky-Golay Derivative Estimates')

Figure contains an axes object. The axes object with title Savitzky-Golay Derivative Estimates contains 5 objects of type line. These objects represent x, x (smoothed), x', x'', x'''.

Argumentos de entrada

contraer todo

Orden del polinomio, especificado como un entero positivo. El valor de order debe ser menor que framelen. Si order = framelen – 1, el filtro diseñado no suaviza.

Longitud del cuadro, especificada como entero impar positivo. El valor de framelen debe ser mayor que order.

Vector de ponderación, especificado como un vector real positivo. El vector de ponderación tiene la misma longitud que framelen y se utiliza para llevar a cabo la minimización de mínimos cuadrados.

Argumentos de salida

contraer todo

Coeficientes de filtro FIR variables en el tiempo, especificados como una matriz de framelen por framelen. En una implementación de filtro de suavizado (por ejemplo, sgolayfilt), las últimas filas (framelen-1)/2 (cada una un filtro FIR) se aplican a la señal durante el transitorio de inicio, y las primeras filas (framelen-1)/2 se aplican a la señal durante el transitorio de fin. La fila central se aplica a la señal en el estado estable.

Matriz de filtros de diferenciación, especificada como una matriz. Cada columna de g es un filtro de diferenciación para derivadas de orden p-1, donde p es el índice de columnas. Dada una señal x de longitud framelen, puede encontrar una estimación de la derivada de p.-ésimo orden, xp, de su valor central de xp((framelen+1)/2) = (factorial(p)) * g(:,p+1)' * x.

Algoritmos

Los filtros de Savitzky-Golay se utilizan para suavizar señales con ruido cuyo intervalo de frecuencia es grande. Los filtros de suavizado de Savitzky-Golay tienden a filtrar menos contenido de alta frecuencia de la señal que los filtros FIR promediadores estándar. Sin embargo, son menos eficaces para rechazar el ruido cuando los niveles de ruido son particularmente elevados.

En general, el filtrado consiste en sustituir cada punto de una señal por una combinación de los valores de señal contenidos en una ventana variable centrada en el punto, asumiendo que los puntos circundantes miden casi el mismo valor subyacente. Por ejemplo, los filtros de media móvil reemplazan cada punto de datos por la media local de los puntos de datos circundantes. Si un punto de datos dado tiene k puntos a la izquierda y k puntos a la derecha, para una longitud total de ventana de L = 2k + 1, el filtro de media móvil hace la sustitución

xsx^s=1Lr=kkxs+r.

Los filtros de Savitzky-Golay generalizan esta idea por mínimos cuadrados ajustando un polinomio de n-ésimo orden a través de los valores de señal en la ventana y tomando el punto central calculado de la curva del polinomio ajustado como el nuevo punto de datos suavizado. En un punto dado, xs,

[xskxs1xsxs+1xs+k]=[b0+b1(tskΔt)+b2(tskΔt)2++bn(tskΔt)nb0+b1(ts1Δt)+b2(ts1Δt)2++bn(ts1Δt)nb0+b1(ts0Δt)+b2(ts0Δt)2++bn(ts0Δt)nb0+b1(ts+1Δt)+b2(ts+1Δt)2++bn(ts+1Δt)nb0+b1(ts+kΔt)+b2(ts+kΔt)2++bn(ts+kΔt)n]=[a0+a1(k)+a2(k)2++an(k)na0+a1(1)+a2(1)2++an(1)na0+a1(0)+a2(0)2++an(0)na0+a1(1)+a2(1)2++an(1)na0+a1(k)+a2(k)2++an(k)n]

o, en términos de matrices,

x=[1k(k)2(k)n112(2)2(2)n11(1)2(1)n100011121n12222n11kk2kn][a0an]Ha.

Para encontrar las estimaciones de Savitzky-Golay, utilice la pseudoinversa de H para calcular a y luego multiplique previamente por H:

x^=H(HTH)1HTx=Bx.

Para evitar condiciones inadecuadas, sgolay utiliza la función qr para calcular una descomposición de menor tamaño de H como H = QR, en cuanto a B = QQT.

Es necesario calcular B solo una vez. Las estimaciones de Savitzky-Golay en la mayoría de puntos de la señal son el resultado de convolucionar la señal con la fila central de B. El resultado es la parte de estado estable de la señal filtrada. Las primeras k filas de B producen el transitorio inicial y las últimas k filas de B producen el transitorio final. Para ver un ejemplo, consulte sgolayfilt. Es posible mejorar la supresión de ruido aumentando la longitud de la ventana, pero esto introduce un zumbido análogo al fenómeno de Gibbs cerca de los transitorios.

Referencias

[1] Orfanidis, Sophocles J. Introduction to Signal Processing. Englewood Cliffs, NJ: Prentice Hall, 1996.

[2] Press, William H., Saul A. Teukolsky, William T. Vetterling, and Brian P. Flannery. Numerical Recipes in C: The Art of Scientific Computing. New York: Cambridge University Press, 1992.

[3] Schafer, Ronald W. “What Is a Savitzky-Golay Filter? [Lecture Notes].” IEEE Signal Processing Magazine Vol. 28, Number 4, July 2011, pp. 111–117. https://doi.org/10.1109/MSP.2011.941097.

Capacidades ampliadas

Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.

Historial de versiones

Introducido antes de R2006a

Consulte también

| | |