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.

sgolayfilt

Filtrado de Savitzky-Golay

Descripción

ejemplo

y = sgolayfilt(x,order,framelen) aplica un filtro de suavizado de respuesta al impulso finita (FIR) de Savitzky-Golay de orden polinomial order y longitud de cuadro framelen a los datos del vector x. Si x es una matriz, sgolayfilt opera en cada columna.

ejemplo

y = sgolayfilt(x,order,framelen,weights) especifica un vector de ponderación que usar durante la minimización de mínimos cuadrados.

y = sgolayfilt(x,order,framelen,weights,dim) especifica la dimensión a lo largo de la cual opera el filtro.

Ejemplos

contraer todo

Genere una señal aleatoria y suavícela utilizando sgolayfilt. Especifique un orden polinomial de 3 y una longitud de cuadro de 11. Represente la señal original y la suavizada.

order = 3;
framelen = 11;

lx = 34;
x = randn(lx,1);

sgf = sgolayfilt(x,order,framelen);

plot(x,':')
hold on
plot(sgf,'.-')
legend('signal','sgolay')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent signal, sgolay.

La función sgolayfilt realiza la mayor parte del filtrado convolucionando la señal con la fila central de B, la salida de sgolay. El resultado es la parte de estado estable de la señal filtrada. Genere y represente esta parte.

m = (framelen-1)/2;

B = sgolay(order,framelen);

steady = conv(x,B(m+1,:),'same');

plot(steady)
legend('signal','sgolay','steady')

Figure contains an axes object. The axes object contains 3 objects of type line. These objects represent signal, sgolay, steady.

Las muestras cercanas a los bordes de la señal no se pueden situar en el centro de las ventanas simétricas y se deben tratar de distinta forma.

Para determinar la matriz transitoria de inicio, multiplique las primeras (framelen-1)/2 filas de B por las primeras framelen muestras de la señal.

ybeg = B(1:m,:)*x(1:framelen);

Para determinar la matriz transitoria de fin, multiplique las últimas (framelen-1)/2 filas de B por las últimas framelen muestras de la señal.

yend = B(framelen-m+1:framelen,:)*x(lx-framelen+1:lx);

Concatene los transitorios y la parte de estado estable para generar la señal completa.

cmplt = steady;
cmplt(1:m) = ybeg;
cmplt(lx-m+1:lx) = yend;

plot(cmplt)
legend('signal','sgolay','steady','complete')
hold off

Figure contains an axes object. The axes object contains 4 objects of type line. These objects represent signal, sgolay, steady, complete.

Al añadir pesos a la minimización se rompe la simetría de B y se necesitan pasos adicionales para alcanzar una solución adecuada.

Cargue una señal de voz muestreada a Fs=7418 Hz. El archivo contiene una grabación de una voz femenina diciendo la palabra "MATLAB®".

load mtlb
t = (0:length(mtlb)-1)/Fs;

Suavice la señal aplicando un filtro de Savitzky-Golay de orden polinomial 9 a cuadros de datos de longitud 21. Represente la señal original y la filtrada. Acérquese a un intervalo de 0,02 segundos.

rd = 9;
fl = 21;

smtlb = sgolayfilt(mtlb,rd,fl);

subplot(2,1,1)
plot(t,mtlb)
axis([0.2 0.22 -3 2])
title('Original')
grid

subplot(2,1,2)
plot(t,smtlb)
axis([0.2 0.22 -3 2])
title('Filtered')
grid

Figure contains 2 axes objects. Axes object 1 with title Original contains an object of type line. Axes object 2 with title Filtered contains an object of type line.

Repita el cálculo, pero utilice ahora una ventana de Kaiser como vector de ponderación. Especifique un factor de forma β=38. Represente la nueva señal filtrada.

kmtlb = sgolayfilt(mtlb,rd,fl,kaiser(fl,38));

subplot(2,1,2)
hold on
plot(t,kmtlb)
axis([0.2 0.22 -3 2])
hold off

Figure contains 2 axes objects. Axes object 1 with title Original contains an object of type line. Axes object 2 with title Filtered contains 2 objects of type line.

Argumentos de entrada

contraer todo

Señal de entrada, especificada como vector o matriz.

Tipos de datos: single | double

Orden polinomial, especificado como entero positivo. order debe ser menor que framelen. Si order = framelen – 1, el filtro no suaviza.

Tipos de datos: single | double

Longitud del cuadro, especificada como entero impar positivo.

Tipos de datos: single | double

Arreglo de ponderación, especificado como vector real positivo o matriz de longitud framelen.

Tipos de datos: single | double

Dimensión sobre la que filtrar, especificada como un escalar entero positivo. De forma predeterminada, sgolayfilt opera a lo largo de la primera dimensión de x, cuyo tamaño es mayor que 1.

Tipos de datos: single | double

Argumentos de salida

contraer todo

Señal filtrada, devuelta como vector o matriz.

Sugerencias

Los filtros de suavizado de Savitzky-Golay suelen utilizarse para "suavizar" señales con ruido cuyo intervalo de frecuencia (sin ruido) es grande. También se denominan filtros polinomiales de suavizado digitales o filtros de suavizado de mínimos cuadrados. Los filtros de Savitzky-Golay funcionan mejor en algunas aplicaciones que los filtros FIR promediadores estándar, que tienden a filtrar el contenido de alta frecuencia junto con el ruido. Los filtros de Savitzky-Golay son más efectivos para mantener los componentes de señal de alta frecuencia, pero menos para rechazar el ruido.

Los filtros de Savitzky-Golay resultan óptimos en cuanto a que minimizan el error de mínimos cuadrados al ajustar polinomios a marcos de datos con ruido. Consulte sgolay para obtener más información sobre el algoritmo de Savitzky-Golay.

Referencias

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

[2] Schafer, Ronald. “What Is a Savitzky-Golay Filter? [Lecture Notes].” IEEE Signal Processing Magazine 28, no. 4 (July 2011): 111–17. 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

| | |