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. Le ayudará a responder preguntas como: ¿Cómo compenso el retraso introducido por un filtro?, ¿Cómo evito distorsionar mi señal?, ¿Cómo elimino el 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 la señal de la manera deseada o para realizar operaciones matemáticas como la diferenciación y la integración. En lo que sigue aprenderá algunos conceptos prácticos que facilitarán el uso de filtros cuando los necesite.

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 filtro digital".

Compensación por retardo introducida por filtrado

Los filtros digitales introducen retardo en la señal. Dependiendo de las características del filtro, el retardo puede ser constante sobre todas las frecuencias, o puede variar con la frecuencia. El tipo de demora determina las acciones que debe tomar para compensarla. La función le permite mirar el retardo del filtro como una función de la frecuencia.grpdelay Mirando 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 es dependiente de la frecuencia).

El retardo del filtro que es constante sobre todas las frecuencias se puede compensar fácilmente desplazando 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 la distorsión de fase y puede alterar una forma de onda de señal significativamente. Compensar el retardo dependiente de la frecuencia no es tan trivial como para el caso del retardo constante. Los filtros IIR introducen el retardo dependiente de la frecuencia.

Compensating for Constant Filter Delay

Como se mencionó anteriormente, puede medir el grupo de retardo del filtro para verificar que es una función constante de la frecuencia. Puede utilizar la función para medir el retardo del filtro, D, y compensar este retardo anexando ceros D a la señal de entrada y desplazando la señal de salida en el tiempo por las 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 ruidosas y filtradas se alineen correctamente y se puedan trazar una encima de 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); 

Trace el retardo de grupo del filtro para verificar que es constante en todas las frecuencias que indican que el filtro es una 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 vacíen del filtro y que la señal de entrada y la señal de salida con compensación de 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 de 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 

Compensating for Frequency-Dependent Delay

El retardo dependiente de la frecuencia causa la distorsión de fase en la señal. Compensar este tipo de demora no es tan trivial como para el caso de retardo constante. Si la aplicación permite el procesamiento fuera de línea, puede quitar el retardo dependiente de la frecuencia implementando el filtrado de fase cero mediante la función. realiza el filtrado de fase cero procesando los datos de entrada tanto en las direcciones hacia delante como hacia atrás.filtfiltfiltfilt El efecto principal es que se obtiene una distorsión de fase cero, es decir, se filtran los 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 equivale 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 de 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); 

Trace el retardo de grupo del filtro y observe que varía con la frecuencia indicando que el retardo del filtro es dependiente de la frecuencia.

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

Filtre los datos y mire 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 no causal hacia delante y hacia atrás, y para el cambio de la respuesta del filtro al cuadrado de la respuesta original.

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

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

Los filtros se utilizan comúnmente para eliminar el contenido espectral no deseado de una señal. Puede elegir entre una variedad de filtros para hacerlo. Usted elige un filtro de paso bajo cuando desea eliminar el contenido de alta frecuencia o un filtro de paso alto cuando desea eliminar el 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 intacta una banda intermedia de frecuencias. Usted elige un filtro de banda cuando desea eliminar frecuencias sobre una banda dada.

Considere una señal de audio que tenga un zumbido de la 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 en todo el ancho de banda de audio.

Cargue la señal de audio.

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

Trace 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 el 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 intercambio entre reducción de ruido y degradación del audio debido a la pérdida de contenido de alta frecuencia. La aplicación del filtro de paso bajo antes de retirar el zumbido de 60 Hz es muy conveniente ya que usted será capaz de downsample la señal de banda limitada. La señal de tasa más baja le permitirá diseñar un filtro de banda de 60 Hz más nítido y más estrecho con un orden de filtro más pequeño.

Diseñe un filtro de paso bajo con frecuencia de banda de paso de 1 kHz y 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) 

Mira el espectro de la señal filtrada de paso bajo. Observe cómo se eliminó 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'}) 

Desde la gráfica de espectro de potencia anterior, puede ver que el contenido máximo de frecuencia no insignificante de la señal filtrada de paso bajo está en 1400 Hz. Por el teorema de muestreo, una frecuencia de muestreo de 2 * 1400 = 2800 Hz bastaría para representar la señal correctamente, usted sin embargo, está utilizando una frecuencia de muestreo de 44100 Hz que es un desperdicio ya que tendrá que procesar más muestras que las necesarias. Puede bajar 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 banda más nítido y estrecho, necesario para eliminar el ruido de 60 Hz, con un orden de filtro más pequeño.

Downsample la señal filtrada de paso bajo por un factor de 10 para obtener una frecuencia de muestreo de FS/10 = 4,41 kHz. Trace el espectro de la señal antes y después de la reducción de resolución.

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 quite el tono de 60 Hz usando un filtro de banda IIR. Deje que la banda de stopband tenga una anchura de 4 Hz centrada en 60 Hz. Elegimos un filtro IIR para lograr una muesca de frecuencia aguda, una pequeña ondulación de banda de paso y un orden relativamente bajo. Procese 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 distorsiones.

ybs = filtfilt(df,yds); 

Finalmente, Remuestrar con aumento la señal para traerlo de vuelta a la velocidad de muestreo de audio original de 44,1 kHz que es compatible con tarjetas de sonido de audio.

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

Echa un vistazo final al espectro de las señales originales y procesadas. Observe cómo el piso 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 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 distingue una señal con el inconveniente de que puede aumentar los niveles de ruido en la salida.diff Una mejor opción es utilizar un filtro diferenciador que actúe como diferenciador en la banda de interés, y como atenuador en todas las demás frecuencias, eliminando eficazmente el ruido de alta frecuencia.

Como ejemplo, analice la velocidad de desplazamiento de un piso de construcción durante un terremoto. Las mediciones de desplazamiento o deriva se registraron en el primer piso de una estructura de prueba de tres pisos bajo condiciones sísmicas 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 mediciones 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 de 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 primera orden con respuestadiff . Utilice FVTool para comparar la respuesta de magnitud del filtro FIR de diferenciador de orden 50 y la respuesta de la función.diff Claramente, ambas respuestas son equivalentes en la región de la banda de paso (de 0 a 100 Hz). Sin embargo, en la región de stopband, 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'); 

Diferenciar el uso de 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]; 

Diferenciar usando el filtro FIR de orden 50 y compensar el retardo.

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; 

Trace algunos puntos de datos del desplazamiento del suelo. Trazar también algunos puntos de datos de la velocidad y la aceleración como calculado 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 amplificó en gran medida en las estimaciones de aceleración obtenidas con.diff

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

Integrando una señal

Un filtro integrador con fugas es un filtro todo Polo con función de transferencia Dónde es una constante que debe ser menor que 1 para garantizar la estabilidad del filtro. No es de extrañar que como se aproxima a uno, el integrador que goteras se aproxima a la inversa de la función de transferencia.diff Aplique el integrador con 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 ruidosas.diff

Utilice un integrador con fugas con . Grafique la respuesta de magnitud del filtro del integrador que goteras. Tenga en cuenta 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 que goteras.

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; 

Graficar 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 que goteras.

Conclusiones

En este ejemplo, aprendió sobre 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ó cómo aplicar filtros para eliminar componentes de frecuencia no deseados de una señal, y cómo reducir la resolución de una señal después de limitar su ancho de banda con un filtro de paso bajo. Finalmente, aprendió a diferenciar e integrar una señal utilizando diseños de filtros digitales. A lo largo del ejemplo, también aprendió a usar las herramientas de análisis para ver la respuesta y el retardo de grupo de los filtros.

Leer más

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

Referencias: J. g. Manolakis, "procesamiento de señales digitales. Principios, algoritmos y aplicaciones ", Prentice-Hall, 1996.

S. j. Orfanidis, "Introducción al procesamiento de señales", Prentice-Hall, 1996.

Apéndice

En este ejemplo se utilizan las siguientes funciones auxiliares.