Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Filtrado de datos con el software de Toolbox de procesamiento de señales

Filtro FIR Lowpass – Método de ventana

En este ejemplo se muestra cómo diseñar e implementar un filtro FIR mediante dos funciones de línea de comandos y , y la aplicación interactiva.fir1designfiltDiseñador de filtros

Cree una señal para utilizar en los ejemplos. La señal es una onda sinusoidal de 100 Hz en aditivo

<math display="block">
<mrow>
<mi>N</mi>
<mo stretchy="false">(</mo>
<mn>0</mn>
<mo>,</mo>
<mn>1</mn>
<mo>/</mo>
<mn>4</mn>
<mo stretchy="false">)</mo>
</mrow>
</math>
ruido gaussiano blanco. Establezca el generador de números aleatorios en el estado predeterminado para obtener resultados reproducibles.

rng default  Fs = 1000; t = linspace(0,1,Fs); x = cos(2*pi*100*t)+0.5*randn(size(t));

El diseño del filtro es un filtro FIR lowpass con orden igual a 20 y una frecuencia de corte de 150 Hz. Utilice una ventana Kaiser con una longitud una muestra mayor que el orden del filtro y

<math display="block">
<mrow>
<mi>β</mi>
<mo>=</mo>
<mn>3</mn>
</mrow>
</math>
. Consulte los detalles en la ventana Kaiser.kaiser

Se utiliza para diseñar el filtro. frecuencias normalizadas en el intervalo [0,1], donde 1 corresponde afir1fir1

<math display="block">
<mrow>
<mi>π</mi>
</mrow>
</math>
rad/muestra. Para utilizar , debe convertir todas las especificaciones de frecuencia a frecuencias normalizadas.fir1

Diseñe el filtro y vea la respuesta de magnitud del filtro.

fc = 150; Wn = (2/Fs)*fc; b = fir1(20,Wn,'low',kaiser(21,3));  fvtool(b,1,'Fs',Fs)

Aplique el filtro a la señal y trace el resultado durante los primeros diez períodos del sinusoides de 100 Hz.

y = filter(b,1,x);  plot(t,x,t,y) xlim([0 0.1])  xlabel('Time (s)') ylabel('Amplitude') legend('Original Signal','Filtered Data')

Diseñe el mismo filtro con .designfilt Establezca la respuesta del filtro e introduzca las especificaciones como pares.'lowpassfir'Name,Value Con , puede especificar el diseño del filtro en Hz.designfilt

Fs = 1000; Hd = designfilt('lowpassfir','FilterOrder',20,'CutoffFrequency',150, ...        'DesignMethod','window','Window',{@kaiser,3},'SampleRate',Fs);

Filtre los datos y trace el resultado.

y1 = filter(Hd,x);  plot(t,x,t,y1) xlim([0 0.1])  xlabel('Time (s)') ylabel('Amplitude') legend('Original Signal','Filtered Data')

Filtro LOWpass FIR con diseñador de filtros

En este ejemplo se muestra cómo diseñar e implementar un filtro FIR de paso bajo mediante el método de ventana con la aplicación interactiva.Diseñador de filtros

  • Inicie la aplicación escribiendo en la línea de comandos.filterDesigner

  • Establezca el archivo en .Tipo de respuestaPasabajos

  • Establezca el método y selecciónelo.Método de diseñoAbetoVentana

  • En , seleccione .Orden de filtroEspecificar orden Establezca la orden en 20.

  • En , se establece en , en 1000 y en 150.Especificaciones de frecuenciaUnidadesHzFsFc

  • Haga clic.Filtro de diseño

  • Seleccione > para exportar el filtro FIR al espacio de trabajo MATLAB® como coeficientes o un objeto de filtro.Archivoexportar... En este ejemplo, exporte el filtro como un objeto. Especifique el nombre de la variable como .Hd

  • Haga clic.exportar

  • Filtre la señal de entrada en la ventana de comandos con el objeto de filtro exportado. Trazar el resultado durante los primeros diez períodos del sinusoides de 100 Hz.

y2 = filter(Hd,x);  plot(t,x,t,y2) xlim([0 0.1])  xlabel('Time (s)') ylabel('Amplitude') legend('Original Signal','Filtered Data')

  • Seleccione > > para generar una función MATLAB para crear un objeto de filtro utilizando sus especificaciones.ArchivoGenerar código MATLABFunción de diseño del filtro

También puede utilizar la herramienta interactiva para diseñar el filtro.filterBuilder

Filtros de paso de banda: sistemas FIR e IIR de orden mínimo

En este ejemplo se muestra cómo diseñar un filtro de paso de banda y datos de filtro con filtros FIR equiripple e IIR Butterworth de orden mínimo. Puede modelar muchas señales del mundo real como una superposición de componentes oscilantes, una tendencia de baja frecuencia y ruido aditivo. Por ejemplo, los datos económicos a menudo contienen oscilaciones, que representan ciclos superpuestos en una tendencia al alza o a la baja que varía lentamente. Además, hay un componente de ruido aditivo, que es una combinación de error de medición y las fluctuaciones aleatorias inherentes en el proceso.

En estos ejemplos, supongamos que muestrea algún proceso todos los días durante un año. Supongamos que el proceso tiene oscilaciones en escalas de aproximadamente una semana y un mes. Además, existe una tendencia al alza de baja frecuencia en los datos y aditivos

<math display="block">
<mrow>
<mi>N</mi>
<mo stretchy="false">(</mo>
<mn>0</mn>
<mo>,</mo>
<mn>1</mn>
<mo>/</mo>
<mn>4</mn>
<mo stretchy="false">)</mo>
</mrow>
</math>
ruido gaussiano blanco.

Cree la señal como una superposición de dos ondas sinusoidales con frecuencias de 1/7 y 1/30 ciclos/día. Añadir un término de tendencia de aumento de baja frecuencia y

<math display="block">
<mrow>
<mi>N</mi>
<mo stretchy="false">(</mo>
<mn>0</mn>
<mo>,</mo>
<mn>1</mn>
<mo>/</mo>
<mn>4</mn>
<mo stretchy="false">)</mo>
</mrow>
</math>
ruido gaussiano blanco. Restablezca el generador de números aleatorios para obtener resultados reproducibles. Los datos se muestrean a 1 muestra/día. Trazar la señal resultante y la estimación de densidad espectral de potencia (PSD).

rng default  Fs = 1; n = 1:365;  x = cos(2*pi*(1/7)*n)+cos(2*pi*(1/30)*n-pi/4); trend = 3*sin(2*pi*(1/1480)*n);  y = x+trend+0.5*randn(size(n));  [pxx,f] = periodogram(y,[],[],Fs);  subplot(2,1,1) plot(n,y) xlim([1 365]) xlabel('Days') grid  subplot(2,1,2) plot(f,10*log10(pxx)) xlabel('Cycles/day') ylabel('dB') grid

La tendencia de baja frecuencia aparece en la estimación de densidad espectral de potencia como aumento de la potencia de baja frecuencia. La potencia de baja frecuencia aparece aproximadamente 10 dB por encima de la oscilación a 1/30 ciclos/día. Utilice esta información en las especificaciones de las bandas de parada del filtro.

Diseñe filtros FIR equiripple e IIR Butterworth de orden mínimo con las siguientes especificaciones: banda de paso de [1/40,1/4] ciclos/día y bandas de parada de [0,1/60] y [1/4,1/2] ciclos/día. Establezca ambas atenuaciones de banda de parada en 10 dB y la tolerancia de ondulación de banda de paso en 1 dB.

Hd1 = designfilt('bandpassfir', ...     'StopbandFrequency1',1/60,'PassbandFrequency1',1/40, ...     'PassbandFrequency2',1/4 ,'StopbandFrequency2',1/2 , ...     'StopbandAttenuation1',10,'PassbandRipple',1, ...     'StopbandAttenuation2',10,'DesignMethod','equiripple','SampleRate',Fs); Hd2 = designfilt('bandpassiir', ...     'StopbandFrequency1',1/60,'PassbandFrequency1',1/40, ...     'PassbandFrequency2',1/4 ,'StopbandFrequency2',1/2 , ...     'StopbandAttenuation1',10,'PassbandRipple',1, ...     'StopbandAttenuation2',10,'DesignMethod','butter','SampleRate',Fs);

Compare el orden de los filtros FIR e IIR y las respuestas de fase desencapsuladas.

fprintf('The order of the FIR filter is %d\n',filtord(Hd1))
The order of the FIR filter is 78 
fprintf('The order of the IIR filter is %d\n',filtord(Hd2))
The order of the IIR filter is 8 
 [phifir,w] = phasez(Hd1,[],1); [phiiir,w] = phasez(Hd2,[],1);  figure plot(w,unwrap(phifir)) hold on plot(w,unwrap(phiiir)) hold off  xlabel('Cycles/Day') ylabel('Radians') legend('FIR Equiripple Filter','IIR Butterworth Filter') grid

El filtro IIR tiene un orden mucho menor que el filtro FIR. Sin embargo, el filtro FIR tiene una respuesta de fase lineal sobre la banda de paso, mientras que el filtro IIR no. El filtro FIR retrasa todas las frecuencias en la banda de paso del filtro por igual, mientras que el filtro IIR no.

Además, la tasa de cambio de la fase por unidad de frecuencia es mayor en el filtro FIR que en el filtro IIR.

Diseñe un filtro equiripple FIR de paso bajo para la comparación. Las especificaciones del filtro de paso bajo son: ciclos de banda de paso [0,1/4] ciclos/día, atenuación de la banda de parada igual a 10 dB y tolerancia de ondulación de banda de paso establecida en 1 dB.

Hdlow = designfilt('lowpassfir', ...     'PassbandFrequency',1/4,'StopbandFrequency',1/2, ...     'PassbandRipple',1,'StopbandAttenuation',10, ...     'DesignMethod','equiripple','SampleRate',1);

Filtre los datos con los filtros bandpass y lowpass.

yfir = filter(Hd1,y); yiir = filter(Hd2,y); ylow = filter(Hdlow,y);

Trazar la estimación PSD de la salida del filtro IIR de paso de banda. Puede reemplazar con en el código siguiente para ver la estimación PSD de la salida del filtro de paso de banda FIR.yiiryfir

[pxx,f] = periodogram(yiir,[],[],Fs);  plot(f,10*log10(pxx))  xlabel('Cycles/day') ylabel('dB') grid

La estimación PSD muestra que el filtro de paso de banda atenúa la tendencia de baja frecuencia y el ruido de alta frecuencia.

Trazar los primeros 120 días de salida de filtro FIR e IIR.

plot(n,yfir,n,yiir)  axis([1 120 -2.8 2.8]) xlabel('Days') legend('FIR bandpass filter output','IIR bandpass filter output', ...     'Location','SouthEast')

El aumento del retardo de fase en el filtro FIR es evidente en la salida del filtro.

Trazar la salida de filtro FIR lowpass superpuesta en la superposición de los ciclos de 7 y 30 días para la comparación.

plot(n,x,n,ylow)  xlim([1 365]) xlabel('Days') legend('7-day and 30-day cycles','FIR lowpass filter output', ...     'Location','NorthWest')

Puede ver en la gráfica anterior que la tendencia de baja frecuencia es evidente en la salida del filtro de paso bajo. Mientras que el filtro lowpass conserva los ciclos de 7 y 30 días, los filtros de paso de banda funcionan mejor en este ejemplo porque los filtros de paso de banda también eliminan la tendencia de baja frecuencia.

Filtrado de fase cero

En este ejemplo se muestra cómo realizar el filtrado de fase cero.

Repita la generación de señal y el diseño del filtro lowpass con y .fir1designfilt No es necesario ejecutar el código siguiente si ya tiene estas variables en el área de trabajo.

rng default  Fs = 1000; t = linspace(0,1,Fs); x = cos(2*pi*100*t)+0.5*randn(size(t));  % Using fir1 fc = 150; Wn = (2/Fs)*fc; b = fir1(20,Wn,'low',kaiser(21,3));  % Using designfilt Hd = designfilt('lowpassfir','FilterOrder',20,'CutoffFrequency',150, ...        'DesignMethod','window','Window',{@kaiser,3},'SampleRate',Fs);

Filtre los datos utilizando .filter Trazar los primeros 100 puntos de la salida del filtro junto con un sinusoides superpuesto con la misma amplitud y fase inicial que la señal de entrada.

yout = filter(Hd,x); xin = cos(2*pi*100*t);  plot(t,xin,t,yout) xlim([0 0.1])  xlabel('Time (s)') ylabel('Amplitude') legend('Input Sine Wave','Filtered Data') grid

Mirando los 0,01 segundos iniciales de los datos filtrados, verá que la salida se retrasa con respecto a la entrada. El retardo parece ser de aproximadamente 0,01 segundos, que es casi 1/2 la longitud del filtro FIR en muestras

<math display="block">
<mrow>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mn>0</mn>
<mo>×</mo>
<mn>0</mn>
<mo>.</mo>
<mn>0</mn>
<mn>0</mn>
<mn>1</mn>
<mo stretchy="false">)</mo>
</mrow>
</math>
.

Este retraso se debe a la respuesta de fase del filtro. El filtro FIR de estos ejemplos es un filtro de fase lineal de tipo I. El retardo de grupo del filtro es de 10 muestras.

Trazar el retardo de grupo utilizando .fvtool

fvtool(Hd,'Analysis','grpdelay')

En muchas aplicaciones, la distorsión de fase es aceptable. Esto es particularmente cierto cuando la respuesta de fase es lineal. En otras aplicaciones, es deseable tener un filtro con una respuesta de fase cero. Una respuesta de fase cero no es técnicamente posible en un filtro no causal. Sin embargo, puede implementar el filtrado de fase cero mediante un filtro causal con .filtfilt

Filtre la señal de entrada utilizando .filtfilt Trazar las respuestas para comparar las salidas de filtro obtenidas con y .filterfiltfilt

yzp = filtfilt(Hd,x);  plot(t,xin,t,yout,t,yzp)  xlim([0 0.1]) xlabel('Time (s)') ylabel('Amplitude') legend('100-Hz Sine Wave','Filtered Signal','Zero-phase Filtering',...     'Location','NorthEast')

En la figura anterior, puede ver que la salida de no muestra el retraso debido a la respuesta de fase del filtro FIR.filtfilt