Contenido principal

sgolay

Diseño de filtros de Savitzky-Golay

Descripción

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

ejemplo

b = sgolay(m,fl,w) especifica un vector de ponderación, w, 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.

ejemplo

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.

Diseñe un filtro de suavizado de Savitzky-Golay con polinomios de quinto orden para filtrar una señal con ruido muestreada a Fs=8192 Hz. Utilice una ventana de Hamming. La longitud del cuadro es de 101 muestras.

Fs = 8192;
m = 5;
fl = 101;

weights = hamming(fl);

b = sgolay(m,fl,weights);

Represente la respuesta en frecuencia para la fila central de b. Utilice 1024 puntos de FFT.

NFFT = 1024;
freqz(b((fl+1)/2,:),1,NFFT,Fs)

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Frequency (kHz), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Frequency (kHz), ylabel Magnitude (dB) contains an object of type line.

Para obtener más información sobre los vectores de ponderación y su impacto en el rendimiento del filtrado de señales, consulte Design and Analyze Savitzky-Golay Filters.

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 polinomial, especificado como entero no negativo. El valor de m debe ser menor que fl. Si m = fl – 1, el filtro diseñado no suaviza.

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

Vector de ponderación, especificado como un vector real positivo. El vector de ponderación tiene la misma longitud que fl 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 fl por fl. En una implementación de filtro de suavizado (por ejemplo, sgolayfilt), las últimas filas (fl-1)/2 (cada una un filtro FIR) se aplican a la señal durante el transitorio de inicio, y las primeras filas (fl-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 fl, puede encontrar una estimación de la derivada de p.-ésimo orden, xp, de su valor central de xp((fl+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)n12(2)2(2)n11(1)2(1)n100011121n12222n1kk2kn][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

expandir todo

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

Historial de versiones

Introducido antes de R2006a