2011-04-08 41 views
25

¿Alguien sabe cómo usar filtros en MATLAB? No soy un aficionado, así que no me preocupan las características de atenuación, etc. - Tengo un vector de señal 1 dimensional x muestreado a 100 kHz, y quiero realizar un filtro de paso alto en él (digamos, rechazar cualquier cosa debajo 10Hz) para eliminar la deriva de la línea base.Filtrado de paso alto en MATLAB

Existen filtros de Butterworth, Elliptical y Chebychev descritos en la ayuda, pero no hay una explicación simple sobre cómo implementarlos.

Respuesta

48

Hay varios filtros que se pueden utilizar, y la elección real del filtro dependerá de lo que esté tratando de lograr. Como mencionaste los filtros Butterworth, Chebyschev y Elliptical, supongo que estás buscando filtros IIR en general.

Wikipedia es un buen lugar para comenzar a leer los diferentes filtros y lo que hacen. Por ejemplo, Butterworth es máximo plano en la banda de paso y la respuesta rueda en la banda de parada. En Chebyschev, tiene una respuesta suave, ya sea en la banda de paso (tipo 2) o la banda de detención (tipo 1) y ondulaciones más grandes e irregulares en la otra y por último, en los filtros Elliptical, hay ondas en ambas bandas. La siguiente imagen is taken from wikipedia.

enter image description here

Así que en los tres casos, usted tiene que negociar algo por otra cosa. En Butterworth, no obtienes ondas, pero la respuesta de frecuencia disminuye más lentamente. En la figura anterior, lleva de 0.4 a aproximadamente 0.55 para obtener la mitad de la potencia. En Chebyschev, obtienes una caída más pronunciada, pero tienes que permitir ondulaciones irregulares y más grandes en una de las bandas, y en elíptica, obtienes un corte casi instantáneo, pero tienes ondas en ambas bandas.

La elección del filtro dependerá completamente de su aplicación. ¿Estás tratando de obtener una señal limpia con poca o ninguna pérdida? Entonces necesitas algo que te dé una respuesta suave en la banda de paso (Butterworth/Cheby2). ¿Estás tratando de matar frecuencias en la banda de stop, y no te importará una pequeña pérdida en la respuesta en la banda de paso? Entonces necesitarás algo que sea suave en la banda de paro (Cheby1). ¿Necesita esquinas de corte extremadamente afiladas, es decir, cualquier cosa un poco más allá de la banda de paso es perjudicial para su análisis? Si es así, debes usar filtros elípticos.

Lo que hay que recordar sobre los filtros IIR es que tienen polos. A diferencia de los filtros FIR, donde puede aumentar el orden del filtro con la única ramificación que es el retardo del filtro, aumentar el orden de los filtros IIR hará que el filtro sea inestable. Por inestable, quiero decir que tendrá postes que se encuentran fuera del círculo unitario. Para ver por qué esto es así, puede leer los artículos de la wiki en IIR filters, especialmente la parte sobre estabilidad.

Para ilustrar más mi punto, considere el siguiente filtro de paso de banda.

fpass=[0.05 0.2];%# passband 
fstop=[0.045 0.205]; %# frequency where it rolls off to half power 
Rpass=1;%# max permissible ripples in stopband (dB) 
Astop=40;%# min 40dB attenuation 
n=cheb2ord(fpass,fstop,Rpass,Astop);%# calculate minimum filter order to achieve these design requirements 

[b,a]=cheby2(n,Astop,fstop); 

Ahora bien, si nos fijamos en el diagrama de polo cero utilizando zplane(b,a), verá que hay varios polos (x) se encuentran fuera del círculo de la unidad, lo que hace que este enfoque inestable.

enter image description here

y esto es evidente por el hecho de que la respuesta de frecuencia es todo loco. freqz(b,a) utilizar para obtener la siguiente

enter image description here

Para obtener un filtro más estable con sus requisitos de diseño exactos, tendrá que utilizar filtros de segundo orden usando el método z-p-k en lugar de b-a, en MATLAB. He aquí cómo el mismo filtro que el anterior:

[z,p,k]=cheby2(n,Astop,fstop); 
[s,g]=zp2sos(z,p,k);%# create second order sections 
Hd=dfilt.df2sos(s,g);%# create a dfilt object. 

Ahora bien, si nos fijamos en las características de este filtro, verá que todos los polos se encuentran dentro del círculo unitario (por lo tanto estable) y coincide con los requisitos de diseño

enter image description here

enter image description here

El enfoque es similar para butter y ellip, con equivalente buttord y ellipord. La documentación de MATLAB también tiene buenos ejemplos sobre el diseño de filtros. Puede basarse en estos ejemplos y en los míos para diseñar un filtro de acuerdo con lo que desee.

Para usar el filtro en sus datos, puede hacer filter(b,a,data) o filter(Hd,data) según el filtro que utilice. Si desea una distorsión de fase cero, use filtfilt. Sin embargo, esto no acepta objetos dfilt. Así que para el filtro de fase cero con Hd, utilice el archivo filtfilthd disponible en el sitio de intercambio de archivos Mathworks

EDITAR

Esto es en respuesta al comentario de @ darenw. El suavizado y el filtrado son dos operaciones diferentes, y aunque son similares en algunos aspectos (el promedio móvil es un filtro de paso bajo), no puede simplemente sustituir uno por otro a menos que pueda estar seguro de que no será de preocupación en la aplicación específica.

Por ejemplo, la implementación de la sugerencia de Daren en una señal chirp lineal de 0-25kHz, muestreada a 100 kHz, este espectro de frecuencia después del alisado con un filtro gaussiano

enter image description here

Claro, la deriva cerca de 10 Hz es casi nulo Sin embargo, la operación ha cambiado por completo la naturaleza de los componentes de frecuencia en la señal original. Esta discrepancia se produce porque ignoraron por completo la caída de la operación de suavizado (ver línea roja), y supusieron que sería cero plano. Si eso fuera cierto, la resta habría funcionado. Pero, por desgracia, ese no es el caso, por lo que existe un campo completo para diseñar filtros.

+3

me hacen una mejor persona con sus respuestas – Diego

7

Cree su filtro, por ejemplo usando [B,A] = butter(N,Wn,'high') donde N es el orden del filtro - si no está seguro de qué es esto, simplemente ajústelo en 10. Wn es la frecuencia de corte normalizada entre 0 y 1, con 1 correspondiente a la mitad de la frecuencia de muestreo de la señal. Si la frecuencia de muestreo es fs, y desea una frecuencia de corte de 10 Hz, debe configurar Wn = (10/(fs/2)).

A continuación, puede aplicar el filtro utilizando Y = filter(B,A,X) donde X es su señal. También puede consultar la función filtfilt.

0

Una forma cheapo a hacer este tipo de filtrado que no implique esfuerzo células cerebrales en el diseño, ceros y polos y rizado y todo eso, es:

* Make a copy of the signal 
* Smooth it. For a 100KHz signal and wanting to eliminate about 10Hz on down, you'll need to smooth over about 10,000 points. Use a Gaussian smoother, or a box smoother maybe 1/2 that width twice, or whatever is handy. (A simple box smoother of total width 10,000 used once may produce unwanted edge effects) 
* Subtract the smoothed version from the original. Baseline drift will be gone. 

Si la señal original es puntiagudo, se Es posible que desee utilizar un filtro mediano corto antes del gran suavizador.

Esto generaliza fácilmente a imágenes en 2D, datos de volumen en 3D, lo que sea.

+1

suavizado y restar no es una solución, ya que cambia las características de la señal original (véase la edición en mi respuesta). Esto es común en el procesamiento de imágenes, y funciona porque el ruido de speckle normalmente está muy alejado en frecuencia en comparación con las características de la imagen principal que son de baja frecuencia. Pero esta no es una buena forma de obtener datos de series de tiempo. – abcd