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.

Introducción práctica al filtrado digital

En este ejemplo se muestra cómo diseñar, analizar y aplicar un filtro digital a los datos. Te ayudará a responder preguntas tales como: ¿Cómo puedo compensar el retraso introducido por un filtro?, ¿Cómo puedo evitar distorsionar mi señal?, ¿Cómo elimino contenido no deseado de mi señal?, ¿Cómo puedo diferenciar mi señal?, y ¿Cómo integro mi señal?

Los filtros se pueden utilizar para dar forma al espectro de señales de una manera deseada o para realizar operaciones matemáticas como la diferenciación y la integración. En lo que sigue aprenderás algunos conceptos prácticos que facilitarán el uso de filtros cuando los necesites.

Este ejemplo se centra en las aplicaciones de filtros digitales en lugar de en su diseño. Si desea obtener más información sobre cómo diseñar filtros digitales, consulte el ejemplo "Introducción práctica al diseño de filtros digitales".

Compensación del retraso introducido por el filtrado

Los filtros digitales introducen retraso en la señal. Dependiendo de las características del filtro, el retardo puede ser constante en todas las frecuencias, o puede variar con la frecuencia. El tipo de retraso determina las acciones que debe realizar para compensarlo. La función le permite mirar el retardo del filtro en función de la frecuencia.grpdelay Mirar la salida de esta función le permite identificar si el retardo del filtro es constante o si varía con la frecuencia (es decir, si depende de la frecuencia).

El retardo de filtro que es constante en todas las frecuencias se puede compensar fácilmente cambiando la señal en el tiempo. Los filtros FIR suelen tener un retardo constante. Por otro lado, el retardo que varía con la frecuencia causa distorsión de fase y puede alterar una forma de onda de señal significativamente. La compensación del retardo dependiente de la frecuencia no es tan trivial como para el caso de retardo constante. Los filtros IIR introducen retardo dependiente de la frecuencia.

Compensación de retardo constante del filtro

Como se mencionó anteriormente, puede medir el grupo de retardo del filtro para verificar que es una función constante de frecuencia. Puede utilizar la función para medir el retardo del filtro, D, y compensar este retardo añadiendo ceros D a la señal de entrada y desplazando la señal de salida en tiempo por muestras D.grpdelay

Considere una señal de electrocardiograma ruidosa que desea filtrar para eliminar el ruido de alta frecuencia por encima de 75 Hz. Desea aplicar un filtro DE paso bajo FIR y compensar el retardo del filtro para que las señales de tensión y filtradas se alineen correctamente y se puedan trazar una encima de la otra para la comparación.

Fs = 500;                    % sample rate in Hz N = 500;                     % number of signal samples rng default; x = ecg(N)'+0.25*randn(N,1); % noisy waveform t = (0:N-1)/Fs;              % time vector  % Design a 70th order lowpass FIR filter with cutoff frequency of 75 Hz.  Fnorm = 75/(Fs/2);           % Normalized frequency df = designfilt('lowpassfir','FilterOrder',70,'CutoffFrequency',Fnorm); 

Trazar el retardo de grupo del filtro para verificar que es constante en todas las frecuencias, lo que indica que el filtro es fase lineal. Utilice el retardo de grupo para medir el retardo del filtro.

grpdelay(df,2048,Fs)   % plot group delay D = mean(grpdelay(df)) % filter delay in samples 
 D =      35  

Antes de filtrar, añada ceros D al final del vector de datos de entrada, x. Esto garantiza que todas las muestras útiles se expulsen del filtro y que la señal de entrada y la señal de salida compensada por retardo tengan la misma longitud. Filtre los datos y compense el retardo desplazando la señal de salida por muestras D. Este último paso elimina eficazmente el transitorio del filtro.

y = filter(df,[x; zeros(D,1)]); % Append D zeros to the input data y = y(D+1:end);                  % Shift data to compensate for delay  figure plot(t,x,t,y,'r','linewidth',1.5); title('Filtered Waveforms'); xlabel('Time (s)') legend('Original Noisy Signal','Filtered Signal'); grid on axis tight 

Compensación del retraso dependiente de la frecuencia

El retardo dependiente de la frecuencia causa la distorsión de fase en la señal. Compensar este tipo de retraso no es tan trivial como para el caso de retardo constante. Si la aplicación permite el procesamiento fuera de línea, puede eliminar el retraso dependiente de la frecuencia mediante la implementación de filtrado de fase cero mediante la función. realiza el filtrado de fase cero procesando los datos de entrada en las direcciones hacia delante e hacia atrás.filtfiltfiltfilt El efecto principal es que se obtiene distorsión de fase cero, es decir, se filtran datos con un filtro equivalente que tiene un retardo constante de 0 muestras. Otros efectos son que se obtiene una función de transferencia de filtro que es igual a la magnitud cuadrada de la función de transferencia de filtro original, y un orden de filtro que es el doble del orden del filtro original.

Considere la señal ECG definida en la sección anterior. Filtre esta señal con y sin compensación de retardo.

% Design a 7th order lowpass IIR elliptic filter with cutoff frequency % of 75 Hz.  Fnorm = 75/(Fs/2); % Normalized frequency df = designfilt('lowpassiir',...                'PassbandFrequency',Fnorm,...                'FilterOrder',7,...                'PassbandRipple',1,...                'StopbandAttenuation',60); 

Trazar el retardo de grupo del filtro y observar que varía con la frecuencia que indica que el retardo del filtro depende de la frecuencia.

grpdelay(df,2048,'half',Fs) 

Filtre los datos y observe los efectos de cada implementación de filtro en la señal de tiempo.

y1 = filter(df,x);    % non-linear phase filter - no delay compensation y2 = filtfilt(df,x);  % zero-phase implementation - delay compensation  figure plot(t,x); hold on plot(t,y1,'r','linewidth',1.5); plot(t,y2,'g','linewidth',1.5); title('Filtered Waveforms'); xlabel('Time (s)') legend('Original Signal','Non-linear phase IIR output',...   'Zero-phase IIR output'); ax = axis; axis([0.25 0.55 ax(3:4)]) grid on 

Observe cómo el filtrado de fase cero elimina eficazmente el retardo del filtro.

El filtrado de fase cero es una gran herramienta si la aplicación permite las operaciones de filtrado hacia delante/retroceso no causales y para el cambio de la respuesta del filtro al cuadrado de la respuesta original.

Los filtros que introducen un retardo constante son filtros de fase lineal. Los filtros que introducen el retardo dependiente de la frecuencia son filtros de fase no lineal.

Eliminación de contenido espectral no deseado de una señal

Los filtros se utilizan comúnmente para eliminar contenido espectral no deseado de una señal. Puede elegir entre una variedad de filtros para hacer esto. Elija un filtro de paso bajo cuando desee quitar contenido de alta frecuencia o un filtro de paso alto cuando desee quitar contenido de baja frecuencia. También puede elegir un filtro de paso de banda para eliminar el contenido de baja y alta frecuencia mientras deja una banda intermedia de frecuencias intacta. Usted elige un filtro de bandstop cuando desea eliminar las frecuencias sobre una banda determinada.

Considere una señal de audio que tenga un zumbido de línea de alimentación y ruido blanco. El zumbido de la línea de alimentación es causado por un tono de 60 Hz. El ruido blanco es una señal que existe a través de todo el ancho de banda de audio.

Cargue la señal de audio.

Fs = 44100; % Sample rate y = audioread('noisymusic.wav'); 

Trazar el espectro de potencia de la señal. El marcador triangular rojo muestra el fuerte tono de 60 Hz que interfiere con la señal de audio.

[P,F] = pwelch(y,ones(8192,1),8192/2,8192,Fs,'power'); helperFilterIntroductionPlot1(F,P,[60 60],[-9.365 -9.365],...   {'Original signal power spectrum', '60 Hz Tone'}) 

En primer lugar, puede eliminar tanto contenido espectral de ruido blanco como sea posible utilizando un filtro de paso bajo. La banda de paso del filtro debe establecerse en un valor que ofrezca un buen equilibrio entre la reducción de ruido y la degradación de audio debido a la pérdida de contenido de alta frecuencia. Aplicar el filtro lowpass antes de quitar el zumbido de 60 Hz es muy conveniente ya que usted será capaz de reducir la muestra de la señal limitada de banda. La señal de velocidad más baja le permitirá diseñar un filtro de toque de banda de 60 Hz más nítido y estrecho con un orden de filtro más pequeño.

Diseñe un filtro lowpass con frecuencia de banda de paso de 1 kHz y una frecuencia de banda de parada de 1,4 kHz. Elija un diseño de pedido mínimo.

Fp = 1e3;    % Passband frequency in Hz Fst = 1.4e3; % Stopband frequency in Hz Ap = 1;      % Passband ripple in dB Ast = 95;    % Stopband attenuation in dB  % Design the filter df = designfilt('lowpassfir','PassbandFrequency',Fp,...                 'StopbandFrequency',Fst,'PassbandRipple',Ap,...                 'StopbandAttenuation',Ast,'SampleRate',Fs);  % Analyze the filter response hfvt = fvtool(df,'Fs',Fs,'FrequencyScale','log',...   'FrequencyRange','Specify freq. vector','FrequencyVector',F); 

% Filter the data and compensate for delay D = mean(grpdelay(df)); % filter delay ylp = filter(df,[y; zeros(D,1)]); ylp = ylp(D+1:end);  close(hfvt) 

Observe el espectro de la señal filtrada de paso bajo. Observe cómo se ha eliminado el contenido de frecuencia superior a 1400 Hz.

[Plp,Flp] = pwelch(ylp,ones(8192,1),8192/2,8192,Fs,'power'); helperFilterIntroductionPlot1(F,P,Flp,Plp,...   {'Original signal','Lowpass filtered signal'}) 

En la gráfica de espectro de potencia anterior, puede ver que el contenido de frecuencia no despreciable máximo de la señal filtrada de paso bajo está en 1400 Hz. Por el teorema de muestreo, una frecuencia de muestreo de 2 * 1400 a 2800 Hz sería suficiente para representar la señal correctamente, sin embargo, está utilizando una frecuencia de muestreo de 44100 Hz que es un desperdicio ya que tendrá que procesar más muestras de las necesarias. Puede reducir la muestra de la señal para reducir la frecuencia de muestreo y reducir la carga computacional reduciendo el número de muestras que necesita procesar. Una frecuencia de muestreo más baja también le permitirá diseñar un filtro de vías más nítido y estrecho, necesario para eliminar el ruido de 60 Hz, con un orden de filtro más pequeño.

Muestra la señal filtrada de paso bajo por un factor de 10 para obtener una frecuencia de muestreo de Fs/10 a 4,41 kHz. Trazar el espectro de la señal antes y después de la reducción del muestreo.

Fs = Fs/10; yds = downsample(ylp,10);  [Pds,Fds] = pwelch(yds,ones(8192,1),8192/2,8192,Fs,'power'); helperFilterIntroductionPlot1(F,P,Fds,Pds,...   {'Signal sampled at 44100 Hz', 'Downsampled signal, Fs = 4410 Hz'}) 

Ahora retire el tono de 60 Hz con un filtro de parada de banda IIR. Deje que la banda de parada tenga una anchura de 4 Hz centrada en 60 Hz. Elegimos un filtro IIR para lograr una muesca de frecuencia nítida, una ondulación de banda de paso pequeña y un orden relativamente bajo. Procesar los datos utilizando para evitar la distorsión de fase.filtfilt

% Design the filter df = designfilt('bandstopiir','PassbandFrequency1',55,...                'StopbandFrequency1',58,'StopbandFrequency2',62,...                'PassbandFrequency2',65,'PassbandRipple1',1,...                'StopbandAttenuation',60,'PassbandRipple2',1,...                'SampleRate',Fs,'DesignMethod','ellip');  % Analyze the magnitude response hfvt = fvtool(df,'Fs',Fs,'FrequencyScale','log',...   'FrequencyRange','Specify freq. vector','FrequencyVector',Fds(Fds>F(2))); 

Realice el filtrado de fase cero para evitar la distorsión.

ybs = filtfilt(df,yds); 

Por último, submuestree la señal para devolverla a la frecuencia de muestreo de audio original de 44,1 kHz, que es compatible con las tarjetas de sonido de audio.

yf = interp(ybs,10); Fs = Fs*10; 

Eche un vistazo final al espectro de las señales originales y procesadas. Observe cómo el suelo de ruido de alta frecuencia y el tono de 60 Hz han sido atenuados por los filtros.

[Pfinal,Ffinal] = pwelch(yf,ones(8192,1),8192/2,8192,Fs,'power'); close(hfvt) helperFilterIntroductionPlot1(F,P,Ffinal,Pfinal,...   {'Original signal','Final filtered signal'}) 

Escuche la señal antes y después del procesamiento. Como se mencionó anteriormente, el resultado final es que usted ha atenuado eficazmente el zumbido de 60 Hz y el ruido de alta frecuencia en el archivo de audio.

% Play the original signal hplayer = audioplayer(y, Fs); play(hplayer);  % Play the noise-reduced signal hplayer = audioplayer(yf, Fs); play(hplayer); 

Diferenciar una señal

La función MATLAB diferencia una señal con el inconveniente de que puede aumentar potencialmente los niveles de ruido en la salida.diff Una mejor opción es utilizar un filtro diferenciador que actúe como un diferenciador en la banda de interés, y como atenuador en todas las otras frecuencias, eliminando eficazmente el ruido de alta frecuencia.

Por ejemplo, analice la velocidad de desplazamiento de un edificio durante un terremoto. Las mediciones de desplazamiento o deriva se registraron en el primer piso de una estructura de prueba de tres pisos en condiciones de terremoto y se guardaron en el archivo quakedrift.mat. La longitud del vector de datos es 10e3, la frecuencia de muestreo es de 1 kHz y las unidades de las medidas son cm.

Diferenciar los datos de desplazamiento para obtener estimaciones de la velocidad y aceleración del piso del edificio durante el terremoto. Compare los resultados utilizando diff y un filtro diferenciador FIR.

load quakedrift.mat  Fs  = 1000;                 % sample rate dt = 1/Fs;                  % time differential t = (0:length(drift)-1)*dt; % time vector 

Diseñe un filtro diferenciador de orden 50 con una frecuencia de banda de paso de 100 Hz que es el ancho de banda sobre el que se encuentra la mayor parte de la energía de la señal. Ajuste la frecuencia de la banda de parada del filtro a 120 Hz.

df = designfilt('differentiatorfir','FilterOrder',50,...                 'PassbandFrequency',100,'StopbandFrequency',120,...                 'SampleRate',Fs); 

La función se puede ver como un filtro FIR de primer orden con respuestadiff $H(Z) = 1 - Z^{-1}$. Utilice FVTool para comparar la respuesta de magnitud del filtro FIR diferenciador de orden 50 y la respuesta de la función.diff Claramente, ambas respuestas son equivalentes en la región de banda de paso (de 0 a 100 Hz). Sin embargo, en la región de la banda de detención, el filtro de orden 50 atenúa los componentes, mientras que la respuesta diff amplifica los componentes. Esto aumenta eficazmente los niveles de ruido de alta frecuencia.

hfvt = fvtool(df,[1 -1],1,'MagnitudeDisplay','zero-phase','Fs',Fs); legend(hfvt,'50th order FIR differentiator','Response of diff function'); 

Diferencie usando la función.diff Agregue ceros para compensar las muestras que faltan debido a la operación de diferencia.

v1 = diff(drift)/dt; a1 = diff(v1)/dt;  v1 = [0; v1]; a1 = [0; 0; a1]; 

Diferencie utilizando el filtro FIR de orden 50 y compense el retraso.

D = mean(grpdelay(df)); % filter delay v2 = filter(df,[drift; zeros(D,1)]); v2 = v2(D+1:end); a2 = filter(df,[v2; zeros(D,1)]); a2 = a2(D+1:end); v2 = v2/dt; a2 = a2/dt^2; 

Trazar algunos puntos de datos del desplazamiento del suelo. Trazar también algunos puntos de datos de la velocidad y la aceleración calculados con diff y con el filtro FIR de orden 50. Observe cómo el ruido se ha amplificado ligeramente en las estimaciones de velocidad y se ha amplificado en gran medida en las estimaciones de aceleración obtenidas con .diff

helperFilterIntroductionPlot2(t,drift,v1,v2,a1,a2) 

Integración de una señal

Un filtro integrador con fugas es un filtro de todo polo con función de transferencia $H(Z) = 1/[1-cZ^{-1}]$ Dónde $c$ es una constante que debe ser menor que 1 para garantizar la estabilidad del filtro. No es de extrañar que como $c$ se acerca a uno, el integrador con fugas se acerca a la inversa de la función de transferencia.diff Aplique el integrador de fugas a las estimaciones de aceleración y velocidad obtenidas en la sección anterior para recuperar la velocidad y la deriva respectivamente. Utilice las estimaciones obtenidas con la función ya que son más ruidosos.diff

Utilice un integrador con fugas con $a = 0.999$. Trazar la respuesta de magnitud del filtro integrador de fugas. Observe que el filtro actúa como un filtro de paso bajo eliminando eficazmente el ruido de alta frecuencia.

close(hfvt) fvtool(1,[1 -.999],'Fs',Fs) 

Filtre la velocidad y la aceleración con el integrador con fugas.

v_original = v1; a_original = a1;  d_leakyint = filter(1,[1 -0.999],v_original); v_leakyint = filter(1,[1 -0.999],a_original);  % Multiply by time differential d_leakyint = d_leakyint * dt; v_leakyint = v_leakyint * dt; 

Trazar las estimaciones de desplazamiento y velocidad y comparar con las señales originales v1 y a1.

helperFilterIntroductionPlot3(t,drift,d_leakyint,v_original,v_leakyint) 

También puede integrar una señal utilizando las funciones y.cumsumcumtrapz Los resultados serán similares a los obtenidos con el integrador con fugas.

Conclusiones

En este ejemplo ha aprendido acerca de los filtros de fase lineales y no lineales y aprendió a compensar el retardo de fase introducido por cada tipo de filtro. También aprendió a aplicar filtros para eliminar componentes de frecuencia no deseados de una señal y a reducir la muestra de una señal después de limitar su ancho de banda con un filtro de paso bajo. Por último, aprendió a diferenciar e integrar una señal mediante diseños de filtros digitales. A lo largo del ejemplo también aprendió a utilizar herramientas de análisis para examinar la respuesta y el retraso de grupo de los filtros.

Lectura adicional

Para obtener más información sobre las aplicaciones de filtro, consulte el cuadro de herramientas de procesamiento de señales. Para obtener más información sobre cómo diseñar filtros digitales, consulte el ejemplo "Introducción práctica al diseño de filtros digitales".

Referencias: J.G. Proakis y D. G. Manolakis, "Procesamiento de señaldigital. Principles, Algorithms, and Applications", Prentice-Hall, 1996.

S. J. Orfanidis, "Introduction to Signal Processing", Prentice-Hall, 1996.

Apéndice

En este ejemplo se utilizan las siguientes funciones auxiliares.