Está en la página 1de 1

INTEGRANTES:

Cayllahua Chire Carmen Rosa


Garay Cari Alexandra Nathaly
Huallpa Quino Franchesca
Quispe Sullasi Madely Pilar

04 - Diseño de filtros digitales


Este cuaderno revisa el diseño de filtros para manipular el contenido de frecuencia de una señal. Comenzaremos cubriendo los filtros de paso bajo, paso alto, supresión de banda y paso de banda. Luego, exploraremos diferentes técnicas
de diseño de filtros, incluido el método de la ventana, el algoritmo de Parks McClellan y el método de mínimos cuadrados.

Tabla de contenido
1. Introducción
2. Filtros FIR
3. Tipos de respuestas de frecuencia
4. Características del filtro
4.1. Respuesta de magnitud
4.2. Respuesta de fase
5. Métodos de diseño de filtros
5.1. Método de ventana
5.2. Algoritmo de Parks-McClellan
5.3. Método de mínimos cuadrados
6. Conclusión

Bibliografía
[1] - T.W. Parks and C.S. Burrus, "Digital Filter Design", Wiley, 1987.
[2] - J.G. Proakis and D.G. Manolakis, "Digital Signal Processing", Prentice-Hall, 1996.

Revisión
v1.0 | 09/09/23 | First Revision

1. Introducción
Los filtros digitales son un elemento clave del procesamiento de señales digitales (DSP) y se implementan utilizando únicamente operaciones de multiplicación y adición (MAC) y retrasos. Su función en un sistema DSP es atenuar ciertas
bandas de frecuencias dentro de una señal, dejando que las otras bandas de frecuencia pasen sin cambios.

Hay dos algoritmos principales para filtros digitales, Respuesta de Impulso Finito (FIR) y Respuesta de Impulso Infinito (IIR). Normalmente, los filtros FIR se prefieren para muchas aplicaciones porque son más estables y pueden limitarse
fácilmente para lograr una respuesta de fase lineal (más sobre esto más adelante). Por estas razones, nos concentraremos únicamente en el diseño de filtros FIR.

Hay muchas técnicas de diseño de filtros FIR disponibles para los ingenieros de DSP, y todas producen filtros con diferentes características. En este cuaderno veremos algunas de las técnicas más comunes y comprenderemos las
diferencias entre ellas.

2. Filtros FIR
Un filtro FIR convoluciona una señal de entrada con una respuesta de impulso y se puede expresar matemáticamente como:

N −1

y(k) = ∑ hn x(k − n)

n=0

donde x es la señal de entrada, k es el índice de muestra y h expresa las muestras (coeficientes) de la respuesta al impulso.

Las respuestas de impulso cambian la forma de una señal, lo que hace que ciertas frecuencias se atenúen cuando convolucionan entre sí. Cuando diseñamos filtros, el resultado de los algoritmos que utilizamos son los coeficientes de
estas respuestas impulsivas.

Una respuesta impulsiva es una representación en el dominio del tiempo. Sería extremadamente difícil (si no imposible) determinar el efecto que tendría una respuesta impulsiva en una señal de entrada simplemente mirándola.

Por ejemplo, la Figura 1 muestra dos respuestas de impulso; uno atenúa las frecuencias altas y el otro atenúa las frecuencias bajas. ¿Puedes decir cuál es cuál? Si es así, ¿puedes decir qué frecuencias pasará cada una y cuáles
atenuará? ¿Y por cuánto?

Figura 1: Dos respuestas de impulso de filtro.

Por esta razón, es mucho mejor pensar en un filtro en términos de su respuesta de frecuencia, en lugar de su respuesta de impulso.

3. Tipos de respuestas de frecuencia


Los filtros a menudo se clasifican en cuatro respuestas de frecuencia diferentes: paso bajo, paso alto, paso de banda y parada de banda, lo que significa qué frecuencias el filtro permite "pasar" sin cambios y qué frecuencias están
atenuadas.

La Figura 2 nos muestra un ejemplo de cada una de las cuatro respuestas de frecuencia. En estos ejemplos, la frecuencia de corte (el punto en el que las frecuencias de una señal de entrada pasan de ser pasadas o atenuadas) está
alrededor del centro de la banda de frecuencia. En la práctica, la frecuencia de corte puede estar en cualquier punto arbitrario.

Figura 2: Las cuatro respuestas de frecuencia del filtro.

La motivación del filtrado es alterar la composición de frecuencia de una señal, donde es necesario atenuar las frecuencias no deseadas. Algunos ejemplos son:

Un filtro de paso bajo para anti-imagen en el interpolador de un transmisor de radio, o anti-aliasing dentro del diezmador de un receptor.
Un filtro de paso alto para extraer un canal particular de un múltiplex demodulado de señales de radio.
Un filtro de paso de banda para extraer una señal de radio modulada del espectro muestreado en frecuencias intermedias (IF).
Un filtro de eliminación de banda para eliminar una fuente de interferencia de banda estrecha.

4. Características del filtro


Cuando diseñamos filtros, generalmente lo hacemos según una especificación en la que se requiere una respuesta de frecuencia particular. Por lo tanto, basándose en una especificación determinada, un diseñador generará
adecuadamente un filtro digital.

La Figura 2 muestra la respuesta de frecuencia de los cuatro tipos de filtros más comunes, en términos de su magnitud (a diferencia de su amplitud).

Un filtro suele caracterizarse por dos respuestas diferentes: respuesta de magnitud y respuesta de fase. La respuesta de magnitud determina el cambio absoluto en la ganancia que experimenta la señal en todo su rango de frecuencia. La
respuesta de fase determina el cambio de fase que experimenta la señal en frecuencias específicas.

4.1. Respuesta de magnitud


La respuesta de magnitud de un filtro generalmente se describe mediante tres características: Rizado de banda de paso, Atenuación de banda de parada y Ancho de banda de transición, como se muestra en el ejemplo de un filtro
de paso alto en la Figura 3. * Tenga en cuenta* que es común mostrar el eje y de la respuesta de magnitud en dB para comprender mejor cómo se comporta el filtro en la banda suprimida.

Figura 3: Características de la respuesta de magnitud de un filtro.

Ripple de banda de paso mide la amplitud de las oscilaciones en la banda de paso, generalmente medida en dB. Cuanto mayor sea la amplitud de estas ondulaciones, más distorsión se producirá en la banda de paso.
Atenuación de banda de parada es la medida de cuánto se atenúan las frecuencias no deseadas. Nuevamente, esto generalmente se expresa en dB y se mide desde el pico más alto (lóbulo lateral) en la banda suprimida. La
atenuación requerida puede variar mucho según la aplicación, desde tan solo 20 dB para algunas aplicaciones de audio hasta más de 80 dB para sistemas de radio.
Ancho de banda de transición es el rango de frecuencia entre la banda de paso y la banda de parada. Cuando el número de coeficientes necesarios para un filtro es limitado, el ancho de banda de transición puede tener un gran
efecto en la ondulación de la banda de paso y la atenuación de la banda de parada. Cuanto menor sea el ancho de banda de transición, mayor será la ondulación de la banda de paso y menor será la atenuación de la banda de
parada.

El filtro ideal tendría ondulación de banda de paso cero, atenuación de banda de parada infinita y un ancho de banda de transición infinitamente pequeño. Su respuesta de frecuencia se parecería a la función rectangular, como la que se
muestra en la Figura 4.

Figura 4: Respuesta de frecuencia ideal de un filtro de paso alto.

Desafortunadamente, no es posible implementar un filtro ideal, por lo que debemos hacer algunos compromisos en el proceso de diseño del filtro. Una forma de mejorar la calidad de un filtro es aumentar su longitud.

Miremos un filtro muy simple y veamos cómo cambiar la longitud del filtro puede cambiar la respuesta de frecuencia de un filtro de paso bajo. Usaremos la función firwin2 (de la clase signal de SciPy ) para diseñar este filtro. Más
adelante en este cuaderno se explicará cómo funciona este método de diseño, pero por ahora nos saltaremos los detalles.

Primero necesitamos importar la biblioteca Signal.

In [ ]: from scipy import signal

Ahora podemos definir los parámetros del filtro.

In [ ]: fc = 0.2 # frecuencia de corte normalizada (% de Nyquist)

N = 101 # longitud del filtro (número de coeficientes), mayor longitud mejor calidad

freq = [0, fc, fc, 1] # puntos de muestreo de frecuencia del filtro (hasta Nyquist), 0 a 1 donde esta fc=0.2
gain = [1, 1, 0, 0] # ganancias de filtro en puntos de muestreo de frecuencia, El filtro gana en los puntos de muestreo de frecuencias. Ciertos se aplican limitaciones para ganar valores, depe

Las variables freq y gain son listas que describen nuestra respuesta de frecuencia ideal.

freq le dice a la función de diseño del filtro qué frecuencias estamos interesados. Las frecuencias que damos están normalizadas a la frecuencia de Nyquist (la mitad de la frecuencia de muestreo), por lo que 0,2 aquí es el 20% de
Nyquist, o el 10% de la frecuencia de muestreo completa.

gain le dice a la función qué amplitudes queremos que tenga freq . Para un filtro de paso bajo, eso significa ganancia total hasta la frecuencia de corte y ganancia cero para todas las frecuencias posteriores (usamos fc dos veces
en freq para obtener la banda de transición más ajustada posible ).

Luego ingresamos estos parámetros en firwin2 para crear el filtro.

In [ ]: lpf = signal.firwin2(N, freq, gain)#Diseño de filtro de FIR utilizando el método de la ventana...es como hallar el h(n)

Ahora para obtener la respuesta de frecuencia del filtro usamos la FFT. Haremos esto varias veces, por lo que crearemos una función auxiliar para facilitar las cosas. La biblioteca de Python Numpy incluye un algoritmo FFT que podemos
usar.

In [ ]: import numpy as np

def get_normalised_fft(x, NFFT):


X = np.fft.fft(x,NFFT)#Esta función calcula la Transformada de Fourier discreta (DFT) unidimensional de n puntos
return X/max(abs(X)) # normalise

In [ ]: NFFT = 4096 # FFT longitud..para que haya artas muestras


nf = np.linspace(0, 2, NFFT)#Devuelve números espaciados uniformemente durante un intervalo 0 a 2 ,NFFT es el Número de muestras que generar

lpf_fft = get_normalised_fft(lpf, NFFT)#lpf es la matriz de entrada, y NFFT es la longitud del eje transformado de la salida
lpf_fft_db = 20*np.log10(abs(lpf_fft)) # convertir a dB --es como hallar el H(w)

Luego podemos usar la biblioteca de trazado de Python matplotlib para trazar nuestra respuesta de magnitud.

In [ ]: #Grafica
import matplotlib.pyplot as plt

plt.figure(figsize=(12,3))
plt.xlabel('Frequency (normalised)')
plt.ylabel('Magnitude (dB)')
plt.xlim(0,1)
plt.ylim(-100,5)
plt.grid(True)

plt.plot(nf, lpf_fft_db, label="Lowpass filter")#grafica x=nf y y= lpf_fft_db rptaen frecuencia del filtro

plt.legend()
plt.show()
#filtro paso bajo

In [ ]: #TAREA
plt.figure(figsize=(12,3))
plt.xlabel('Frequency (normalised)')
plt.ylabel('Magnitude (dB)')
plt.xlim(0,1)
plt.ylim(-100,5)
plt.grid(True)
plt.plot(nf, lpf_fft_db, label="FILTRO PASO BAJO con N=101")#grafica x=nf y y= lpf_fft_db rptaen frecuencia del filtro

N = 300

freq = [0, fc, fc, 1]


gain = [1, 1, 0, 0]
lpf2 = signal.firwin2(N, freq, gain)
lpf_fft2 = get_normalised_fft(lpf2, NFFT)
lpf_fft_db2 = 20*np.log10(abs(lpf_fft2))

plt.plot(nf, lpf_fft_db2, label="FILTRO PASO BAJO con N=300")


plt.legend()
plt.show()
#filtro paso bajo

<ipython-input-136-dcdd39bcf17b>:17: RuntimeWarning: divide by zero encountered in log10


lpf_fft_db2 = 20*np.log10(abs(lpf_fft2))

Podemos ver en la configuración que utilizamos que la atenuación de la banda de parada es de aproximadamente 50 dB, mientras que el ancho de banda de transición es aproximadamente el 2,5 % de la frecuencia de
muestreo(frecuencia normalised). La ondulación de la banda de paso es demasiado pequeña para verla en este gráfico, por lo que podemos usar el parámetro ylim para acercarnos en la siguiente celda.

In [ ]: plt.figure(figsize=(12,3))
plt.xlabel('Frequency (normalised)')
plt.ylabel('Magnitude (dB)')
plt.xlim(0,1)#agrandando la imagen
plt.ylim(-0.05,0.05)#observa la ondulacion en la banda de paso , esq es muy chiquita
plt.grid(True)

plt.plot(nf, lpf_fft_db)
plt.plot(nf, lpf_fft_db2)
plt.show()

Podemos ver en esta vista que la ondulación máxima de la banda de paso es de aproximadamente 0,03 dB, que es muy baja. Puede que no siempre sea tan bajo, por lo que siempre es importante comprobar si está dentro de niveles
aceptables.

Intente cambiar la longitud del filtro para ver cómo afecta esto a la respuesta de frecuencia. Debería notar que la respuesta de frecuencia mejora a medida que aumenta la longitud del filtro.

4.2.2 Respuesta de fase


Para determinadas aplicaciones, la respuesta de fase de un filtro es un factor igualmente importante. En general, un filtro cambiará la fase de cualquier señal que lo atraviese. Dependiendo del diseño del filtro, la fase cambiará en
diferentes cantidades a diferentes frecuencias. Y, debido a que un cambio de fase es un retraso en el tiempo, no afectará la respuesta de magnitud de una señal, sino más bien la señal en el dominio del tiempo.

Los cambios de fase son menos importantes para aplicaciones de audio, donde puede resultar difícil para el oído humano percibirlos, pero pueden ser críticos para aplicaciones de radio donde la fase de una señal se utiliza para
representar información.

Los filtros FIR se prefieren para aplicaciones sensibles a la fase porque se limitan fácilmente para lograr una respuesta de fase lineal. Si un filtro presenta una fase lineal, significa que el cambio de fase, en relación con cada frecuencia,
cambia a una velocidad constante (es decir, linealmente). Por el contrario, para los filtros de fase no lineales, el desplazamiento de fase no será constante entre frecuencias, distorsionando así la forma de las señales en el dominio del
tiempo que pasan a través del filtro.

Un filtro FIR exhibirá una fase lineal si su respuesta al impulso es simétrica par o impar, o antisimétrica par o impar alrededor de su punto central. Esto da como resultado cuatro tipos de filtros FIR de fase lineal, como se muestra en la
Figura 5.

Figura 5: Los cuatro tipos de respuestas de impulso de fase lineal.

Cada tipo de filtro de fase lineal tiene sus propias características y se utiliza para diversas aplicaciones. Generalmente, el Tipo I y el Tipo II son los más utilizados. Los filtros de tipo I (número impar de coeficientes y simétricos) son los más
universales y se pueden utilizar para respuestas de paso bajo, paso alto, paso de banda y supresión de banda. Los filtros de tipo II (número par de coeficientes y simétricos) son más restrictivos donde, en la mayoría de las circunstancias,
sólo son posibles respuestas de paso bajo y paso de banda.

Podemos recuperar la respuesta de fase de nuestra FFT usando numpy . Notarás en el código siguiente que desenvolvemos la respuesta de fase después de calcularla. Desenvolver agrega 2π a cada ángulo posterior, lo que nos
permite ver la verdadera linealidad de la respuesta de fase al trazar

In [ ]: lpf_phase = np.unwrap(np.angle(lpf_fft))#angulo de H(w) y luego desenvolvemos .Esto desenvuelve una señal p cambiando elementos que tienen un valor absoluto. diferencia con su predecesor de má

A menudo, la respuesta de fase de un filtro se traza junto con su respuesta de frecuencia. Esto permite identificar claramente la respuesta de fase en la banda de paso y en la banda de parada.

In [ ]: plt.figure(figsize=(12,3))

plt.xlabel('Frequency (normalised)')
plt.ylabel('Magnitude (dB)')
plt.xlim(0,1)
plt.ylim(-100,5)
plt.plot(nf, lpf_fft_db, label="FILTRO PASO BAJO con N=101")#grafica de la respuesta en magnitud

plt.twinx()
plt.ylabel("Angle (radians)")
plt.axis('tight')
plt.xlim(0,1)
plt.ylim(np.floor(min(lpf_phase[0:int(len(lpf_phase)/2)])) ,3)#paraque solo se vea cierta parte de la fase
plt.plot(nf, lpf_phase, color='tab:orange',label="respuesta de fase")
plt.legend()
plt.grid(True)

plt.show()

Como podemos ver en el gráfico, la respuesta de fase a lo largo de la banda de paso cambia linealmente a medida que aumenta la frecuencia.

También notarás que hay discontinuidades repentinas en la banda de parada que coinciden con los bordes de los lóbulos laterales. Si bien está más allá del alcance de este cuaderno analizar en detalle por qué sucede esto, debe
tener en cuenta que es típico ver este comportamiento cuando se muestra la respuesta de fase en este formulario.

5. Métodos de diseño de filtros


Ahora que entendemos qué es un filtro y cómo medir su rendimiento, podemos pasar a cómo diseñar el filtro y recuperar los coeficientes.

Hay varios algoritmos disponibles para los ingenieros para generar coeficientes de filtro. Cada uno tiene sus propias peculiaridades y algunas son mejores que otras.

En este cuaderno analizamos tres de las técnicas de diseño de filtros más comunes: el método de ventana, el algoritmo de Parks-McClellan y el método de mínimos cuadrados.

5.1. Método de ventana


El método de ventana es una forma popular de diseñar filtros, ya que es rápido, fácil de implementar y, en general, logra resultados adecuados. El método simplemente ventana una respuesta de impulso ideal hd (n) multiplicándola por
una función de ventana w(n):

h(n) = w(n). hd (n)

La respuesta al impulso ideal tendrá una longitud infinita, por lo que no es práctico implementarla. En lugar de ello, tenemos que truncarlo a una longitud que sea adecuada para la aplicación (cuanto más largo sea el filtro, más cálculos se
requerirán y mayor será el retraso). Sin embargo, cuando truncamos la respuesta al impulso ideal, el filtro se comporta de manera indeseable. Truncar la respuesta al impulso ideal es análogo a multiplicarla por una ventana rectangular.

Es por este motivo que se utilizan ventanas distintas a la ventana rectangular. Normalmente, las buenas ventanas muestran una respuesta ahusada hacia cero, lo que ayuda a suavizar los bordes de la respuesta al impulso truncada.
Numpy es capaz de generar varias de las ventanas más populares, conocidas como General Cosine Windows.

In [ ]: w_hamming = np.hamming(N)#ventana Hamming


w_hann = np.hanning(N)#ventana Hanning
w_blackman = np.blackman(N)#ventana blackman

Podemos trazar las ventanas juntas para comprender en qué se diferencian.

In [ ]: # Grafica de los tipos de ventana

plt.figure(figsize=(12,3))
plt.plot(w_hamming, label="Hamming")#no llega a cero
plt.plot(w_hann, label="Hann")
plt.plot(w_blackman, label="Blackman")#es mas estrecho
plt.xlim(0,101-1)#hasta N
plt.xlabel("N (samples)")
plt.ylabel("Amplitude")

plt.legend()
plt.grid(True)
plt.show()

Notará que las tres ventanas tienen una forma cónica en los extremos que tienden hacia cero (tenga en cuenta que la ventana de Hamming en realidad no llega a cero, sino que se acerca). Como mencionamos anteriormente, esto ayuda
a suavizar nuestra respuesta de impulso ideal truncada hd (n).

Entonces, ¿cómo conseguimos la respuesta de filtro ideal para el tipo de filtro que queremos?

Para un filtro de paso bajo, la respuesta de impulso ideal es la conocida función Sinc:

sin(2πfc n)
hd (n) = sinc(fc n) = .
πn

N −1 N −1
Donde fc es nuestra frecuencia de corte deseada y, para un Sinc truncado y de longitud impar, − < n ≤ .
2 2

Esto significa que, para el paso bajo, podemos simplemente calcular el Sinc y simplemente multiplicarlo por la ventana deseada y recuperar nuestros coeficientes de filtro.

In [ ]: n = np.arange(-(N-1)/2,(N-1)/2+1)#rango de n, 101 valores


fc = 0.3 # frecuencia de corte normalizada (% de Nyquist)
hd_n = np.sinc(fc*n)#funcion sinc, de respuesta de impulso ideal

h_n = hd_n * w_hamming#respuesta al impulsod del filtro

Si trazamos hd (n) contra h(n) podemos ver cómo la ventana afecta la función Sinc.

In [ ]: plt.figure(figsize=(12,3))
plt.plot(hd_n, label="Ideal")#color azul, respuesta de impulso ideal
plt.plot(h_n, label="Windowed")#color naranja, respuesta al impulsod del filtro
plt.grid(True)
plt.xlim(0,len(h_n)-1)#101-1-hasta N-1
plt.ylabel("Amplitude")
plt.xlabel("N (samples)")
plt.legend()
plt.show()
#ah disminuido un poco las ondulaciones

Podemos ver que, como era de esperar, nuestra ventana suaviza el pulso Sinc. Sin embargo, es mucho más informativo compararlos en el dominio de la frecuencia.

In [ ]: hd_n_fft = 20*np.log(abs(get_normalised_fft(hd_n, NFFT))) # obtener la magnitud en dB,es Hd(w)


h_n_fft = 20*np.log(abs(get_normalised_fft(h_n, NFFT)))#H(w)

nf_norm = np.linspace(0,2,NFFT)#Devuelve números espaciados uniformemente durante un intervalo 0 a 2 ,NFFT es el Número de muestras que gener..--el NFFT es para que paresca continuo y el N es

plt.figure(figsize=(12,3))
plt.xlabel('Frequency (Normalised)')
plt.ylabel('Magnitude (dB)')
plt.xlim(0,1)
plt.ylim(-200,5)
plt.grid(True)

plt.plot(nf_norm, hd_n_fft, label="Ideal")


plt.plot(nf_norm, h_n_fft, label="Windowed")

plt.legend()
plt.show()
#los lobulos secundarios del naranja tienen menor rizado

Al trazar las respuestas de frecuencia podemos ver mejor cómo la ventana afecta al filtro.

El filtro de ventana muestra una atenuación de banda de parada mucho mejor que nuestro Sinc ideal, pero tiene un ancho de banda de transición mayor.

Al ejecutar la siguiente celda, podemos acercarnos y ver que la ondulación de la banda de paso también se ha reducido considerablemente.

In [ ]: plt.figure(figsize=(12,3))
plt.xlabel('Frequency (Normalised)')
plt.ylabel('Magnitude (dB)')
plt.xlim(0,0.4)
plt.ylim(-3,1)#agrandando banda de paso
plt.grid(True)

plt.plot(nf_norm, hd_n_fft, label="Ideal")


plt.plot(nf_norm, h_n_fft, label="Windowed")

plt.legend()
plt.show()

Cada ventana tiene sus propias características y las diferencias entre ellas suelen ser un equilibrio entre la atenuación de la banda de parada y el ancho de banda de transición. Puede probar los demás cambiando la ventana por la que
se multiplica hd (n) y luego ejecutar las celdas anteriores nuevamente. Debería ver que Blackman Window tiene la mejor atenuación de banda de parada, mientras que Hamming tiene el mejor ancho de banda de transición. La
ventana de Hann se encuentra en algún punto intermedio.

Como el pulso Sinc es puramente para filtros de paso bajo, ¿cómo calculamos la respuesta al impulso para filtros con otras respuestas (por ejemplo, paso de banda)?

Como hemos visto antes, para recuperar la respuesta de frecuencia de un filtro, podemos usar la FFT en la respuesta al impulso. Entonces es lógico que podamos recuperar la respuesta al impulso haciendo la transformada inversa, la
IFFT.

Este método se llama diseño de filtro de muestreo de frecuencia debido al hecho de que :muestreamos una respuesta de frecuencia ideal H (w)y luego convertimos estas muestras en coeficientes en el dominio del tiempo usando
IFFT h(n). Luego podemos multiplicar esta respuesta de impulso con una ventana para recuperar el filtro deseado.

En lugar de crear la función para hacer esto nosotros mismos, la biblioteca Signal contiene la función firwin2 que puede hacer esto por nosotros.

In [ ]: freq = [0, 0.4, 0.4, 0.6, 0.6, 1]#puntos de muestreo de frecuencia, 0 , fc1,fc1,fc2,fc2,1 Normalmente de 0,0 a 1,0, siendo 1,0 Nyquist.fs/2
gain = [1, 1, 0, 0, 1, 1]#ganancia del filtro total y cero
N = 101#grado

h_wm = signal.firwin2(N, freq, gain, window='blackman')#Diseño de filtro de FIR utilizando el método de la ventana...es como hallar el h(n) deseada

Como vimos al calcular el filtro de paso bajo al comienzo del cuaderno, firwin2 toma una lista de frecuencias y ganancias, que corresponden a nuestra respuesta de frecuencia deseada.

En la celda de arriba, necesitamos un filtro de eliminación de banda donde haya ganancia cero entre el 40% y el 60% de la tasa de Nyquist, y ganancia unitaria en el resto. El primer argumento es la cantidad de pesos de filtro
que queremos y el último argumento le dice a la función qué ventana usar.

Luego podemos convertir el filtro nuevamente al dominio de la frecuencia para verificar la calidad del filtro que produjo firwin2 .

In [ ]: h_wm_fft = 20*np.log(abs(get_normalised_fft(h_wm, NFFT)))# obtener la magnitud en dB,es Hd(w)

nf_norm = np.linspace(0,2,NFFT)
#grafica de el filtro H(w) deseado
plt.figure(figsize=(12,3))
plt.xlabel('Frequency (Normalised)')
plt.ylabel('Magnitude (dB)')
plt.xlim(0,1)
# plt.ylim(-300,5)
plt.grid(True)

plt.plot(nf_norm, h_wm_fft)

plt.show()

El filtro se ve bien, con una atenuación de banda de parada de alrededor de 160 dB, pero el ancho de banda de transición es bastante grande. ¿Cómo podemos mejorar el filtro? Intente cambiar la longitud del filtro, N , así como las
ventanas para ver cómo cambia la respuesta de frecuencia (recuerde que para una respuesta de banda eliminada, N debe ser un valor impar. Python aumentará (Se producirá un error si intenta crear un filtro de eliminación de banda
con un número par de coeficientes).

Hay varias ventanas disponibles para probar, incluidas hann , rectangular y blackman . Se pueden encontrar detalles sobre más ventanas en la documentación de Signal aquí.

El principal inconveniente del método de ventana es que tiene muy poco control sobre el ancho de banda de transición porque la forma inherente de la respuesta de frecuencia de la ventana sobre esta región tiene prioridad.
Afortunadamente, existen varios métodos diferentes para diseñar filtros que le brindan mucho más control sobre la respuesta de frecuencia resultante.

5.2. Algoritmo de Parks-McClellan


El algoritmo de Parks-McClellan es probablemente el método de diseño de filtros más conocido y utilizado. Utiliza el algoritmo Remez Exchange y la aproximación de Chebyshev para diseñar un filtro óptimo que minimice el error entre la
respuesta deseada (ideal) y la respuesta real (alcanzable).

La primera y la última etapa del algoritmo son en realidad idénticas al método de muestreo de frecuencia que analizamos anteriormente. Comienza con una respuesta de frecuencia deseada y termina usando la transformada inversa de
Fourier para recuperar los coeficientes.

La sección central del algoritmo calcula una mejor aproximación del filtro deseado y calcula el error máximo en toda la respuesta. Si el error es demasiado grande, se hace otra suposición y se repite el algoritmo. Esto continúa hasta que
el error máximo se haya minimizado a un valor apropiado.

Quizás reconozcas esto como una técnica de optimización, ¡y es que lo es! El beneficio de utilizar este tipo de algoritmo es que tiene mucho más control sobre la respuesta de frecuencia que con el método de ventana, en particular, el
ancho de banda de transición.

Sin embargo, una limitación importante de esta técnica es que requiere convergencia (por ejemplo, el error debe minimizarse continuamente). Bajo ciertas condiciones, el error fluctuará enormemente y el algoritmo nunca encontrará una
solución óptima, lo que provocará que la rutina de diseño del filtro se ejecute hasta el infinito.

Podemos evitar esto agregando restricciones al algoritmo, por ejemplo estableciendo un número máximo de iteraciones para calcular, pero el filtro resultante puede no ser adecuado. Otra opción es reducir las limitaciones del ancho de
banda de transición haciéndolo más amplio; Nuevamente, esto puede resultar en un filtro no deseado. Por estos motivos, siempre es mejor comprobar la calidad del filtro antes de aplicarlo a su sistema.

SciPy también incluye el algoritmo Parks-McClellan en su clase Signal : remez . Podemos usar esto para diseñar un filtro de paso de banda similar al que hicimos con el método de ventana.

In [ ]: N = 101
tb = 0.01 # ancho de banda de transición (%),de1 a 0 o de 0 a 1

freq = [0, 0.20-tb, 0.20, 0.3, 0.30+tb, 0.5]# bordes de la banda no negativos y menos de la mitad de la frecuencia de muestreo dada por fs;de 0 hasta 0.5 donde 0.2 y 0.3 lamitad de 04 y 06
gain = [1,0,1]#3 elementos la mitad de frew con 6 elementos

h_pm = signal.remez(N, freq, gain)#Calcule los coeficientes de filtro para el filtro de respuesta de impulso finito (FIR)

Las entradas a remez son muy similares a firwin2 con algunas diferencias sutiles. En primer lugar, la lista de frecuencias que elegimos se proporciona en relación con la frecuencia de muestreo, no con la frecuencia de Nyquist
como era el caso antes. En segundo lugar, la lista de ganancias debe tener la mitad de la longitud de la lista de frecuencias. Esto le da una forma más general al filtro. Por ejemplo, [1,0] para paso bajo, [0,1] para paso alto y
[0,1,0] para respuestas de paso de banda.

Finalmente, se recomienda incluir un ancho de banda de transición en la lista de frecuencias para permitir más oportunidades de convergencia del algoritmo. remez normalmente le avisará si cree que el algoritmo no convergerá con
la configuración dada. Aquí hemos elegido un ancho de banda de transición del 1% de la frecuencia de muestreo.

Ahora podemos mirar la respuesta de frecuencia para comprobar la calidad del filtro.

In [ ]: h_pm_fft = 20*np.log(abs(get_normalised_fft(h_pm, NFFT)))#halla H(w) deseado en dB

nf_norm = np.linspace(0,2,NFFT)#mismo rango

plt.figure(figsize=(12,3))
plt.xlabel('Frequency (Normalised)')
plt.ylabel('Magnitude (dB)')
plt.xlim(0,1)
# plt.ylim(-100,5)
plt.grid(True)

plt.plot(nf_norm, h_pm_fft)

plt.show()

La respuesta de frecuencia muestra que el ancho de banda de transición es mucho más ajustado (y preciso )que lo que se logró con el Método de Ventana, pero la atenuación de la banda de parada es mucho menor y hay mucha más
ondulación en la banda de paso.

Intente cambiar el valor de N y el ancho de banda de transición, tb , para ver cómo esto afecta la respuesta del filtro. Estos cambios se pueden realizar en la primera celda de código de esta sección.

Como mencionamos anteriormente, aunque el uso de la técnica de optimización para aproximar el filtro deseado nos brinda un mayor control sobre la respuesta en frecuencia(en el eje de las frecuencias), el problema de la convergencia
puede ser un factor limitante al utilizar el algoritmo de Parks-McClellan.

Otro método común de diseño de filtros que utiliza un método de aproximación para diseñar el filtro, pero elimina la necesidad de un algoritmo iterativo, es el método de mínimos cuadrados.

5.3. Método de mínimos cuadrados


El método de mínimos cuadrados permite el diseño de filtros minimizando el error cuadrado entre la respuesta de frecuencia deseada y real. A diferencia del algoritmo de Parks-McClellan, evita el uso de iteraciones resolviendo en su
lugar un sistema de ecuaciones lineales.

Al evitar la iteración, no hay preocupaciones con respecto a la convergencia, aunque para filtros de larga longitud, el tamaño de las matrices requeridas a veces puede ser el factor limitante.

La clase Signal de SciPy también tiene una función para generar filtros usando mínimos cuadrados: firls . Podemos utilizar esta función para diseñar un filtro paso banda similar a los generados anteriormente.

In [ ]: tb = 0.01 # transition bandwidth (%)


freq = [0, 0.40-tb, 0.4, 0.60, 0.60+tb, 1]#de 0 a 1 con 0.4 y 0.6 y la transicion de 1%,,, menores o iguales a la frecuencia de Nyquist
gain = [1, 1, 0, 0, 1, 1]#Una secuencia del mismo tamaño que las bandas que contiene la ganancia deseada en el punto inicial y final de cada banda
N = 101

h_ls = signal.firls(N, freq, gain)#mínimos cuadrados: integral del error cuadrático medio ponderado dentro del se minimizan las bandas especificadas,

Al igual que con firwin2 y remez , firls toma la longitud del filtro, N; y una lista de frecuencias y ganancias que describen la respuesta de frecuencia, como parámetros de entrada. Al igual que firwin2 , firls enumera las
frecuencias hasta la frecuencia de Nyquist (en lugar de hasta la frecuencia de muestreo), y la lista de ganancias tiene la misma longitud.

firls también permite incluir u omitir el ancho de banda de transición según sea necesario. Esto hace que el método firls sea mucho más flexible que cualquiera de los métodos anteriores.

Ahora podemos mirar la respuesta de frecuencia para comprobar la calidad del filtro.

In [ ]: h_ls_fft = 20*np.log(abs(get_normalised_fft(h_ls, NFFT)))

nf_norm = np.linspace(0,2,NFFT)

plt.figure(figsize=(12,3))
plt.xlabel('Frequency (Normalised)')
plt.ylabel('Magnitude (dB)')
plt.xlim(0,1)
plt.grid(True)

plt.plot(nf_norm, h_ls_fft)

plt.show()

Como podemos ver en la respuesta de frecuencia, el método de mínimos cuadrados nos da una atenuación de banda de parada similar al algoritmo de Parks-McClellan, pero con mucha menos ondulación en la banda de paso. Intente
cambiar la longitud del filtro y el ancho de banda de transición para ver cómo esto cambia el filtro.

6. Conclusión
Este cuaderno le ha explicado los conceptos básicos del diseño de filtros. Inicialmente analizamos las características del filtro, describiendo la magnitud y las respuestas de fase para comprender cómo un filtro cambia una señal. Luego
pasamos a describir tres métodos populares de diseño de filtros utilizados para generar coeficientes de filtro: los métodos de Ventana, Parks-McClellan y Mínimos Cuadrados.

Cada método tiene sus pros y sus contras. El método de ventana es rápido, fácil de calcular y produce filtros con respuestas de frecuencia que son fáciles de predecir; mientras que los algoritmos de Parks McClellan y Mínimos Cuadrados
dan mucho más control sobre la respuesta de frecuencia de un filtro, pero pueden tardar más en calcularse y puede resultar difícil lograr la respuesta deseada si las restricciones son demasiado restrictivas.

No existe un mejor método para diseñar filtros y depende de una serie de factores y compensaciones. Depende del ingeniero decidir cuál es mejor para una aplicación determinada.

Conclusiones

Un filtro FIR convoluciona una señal de entrada con una respuesta de impulso. Esta convolución en un filtro FIR desencadena cambios en la forma de la señal, impactando selectivamente en distintas frecuencias. En el diseño de
filtros, los coeficientes de estas respuestas impulsivas son el resultado de los algoritmos que se emplea. La preferencia por los filtros FIR se fundamenta porque son más estables y puede limitarse fácilmente para lograr una respuesta
de fase lineal.

Figura 1: Dos respuestas de impulso de filtro.

La clasificación de filtros según sus respuestas de frecuencia en paso bajo, paso alto, paso de banda y parada de banda proporciona un marco esencial para comprender cómo estos dispositivos modifican las distintas frecuencias de
una señal. Los filtros paso bajo y paso alto son eficaces para atenuar frecuencias no deseadas, ya sea de alta o baja frecuencia, respectivamente. Los filtros de paso de banda permiten selectivamente un rango específico de
frecuencias, mientras que los filtros de parada de banda atenúan un rango específico, dejando pasar el resto.

Figura 2: Las cuatro respuestas de frecuencia del filtro.

Un filtro suele caracterizarse por dos respuestas diferentes: respuesta de magnitud y respuesta de fase.La respuesta de magnitud determina el cambio absoluto en la ganancia que experimenta la señal en todo su rango de frecuencia, la
cual se grafica en decibelios ). La respuesta de fase determina el cambio de fase que experimenta la señal en frecuencias específicas. como se observo una forma de mejorar la calidad de un filtro es aumentando la longitud N, , mientras
N es mayor , la anchura de cada lobulo secundario disminuye y por lo tanto hay mas rizado, la magnitud en decibelos tambien disminuye ,y la banda de transicion se vuelve un poco mas estrecha , como se puede observar , en la grafica
de respuesta de magnitud para N=300 y N=100

En lo que refiere a la respuesta de fase, esta cambia linealmente cuando aumenta la frecuencia(hasta la frecuencia de corte), tambien hay discontinuidades repentinas en la banda de parada que coiciden con los bordes de los lobulos
laterales de H (w), estos tambien son constantes despues de pasar por la frecuencia de corte .

5.1 Método de ventana


El metodo de la ventana trata de multiplicar una muestra de respuesta de impulso ideal hd (n) por una función de ventana w(n), pero ya que la respuesta al impulso ideal tendrá una muestra infinita esta se trunca a una longuitud
adecuada. El principal inconveniente del método de ventana es que tiene muy poco control sobre el ancho de banda de transición

Para conseguir la respuesta de filtro ideal para el paso bajo, podemos simplemente calcular el Sinc y multiplicarlo por la ventana deseada y recuperar nuestros coeficientes de filtro. Para otras respuestas se usa el diseño de filtro de
muestreo de frecuencia debido al hecho de que muestreamos una respuesta de frecuencia ideal y luego convertimos estas muestras en coeficientes en el dominio del tiempo usando IFFT. Luego podemos multiplicar esta respuesta de
impulso con una ventana para recuperar el filtro deseado.

Existen varios tipos de ventana donde cada ventana tiene sus propias características y las diferencias entre ellas suelen ser un equilibrio entre la atenuación de la banda de parada y el ancho de banda de transición.

5.2. Algoritmo de Parks-McClellan <a class="anchor" minimos.png

El algoritmo de Algoritmo de Parks-McClellan, es una de las tecnicas que es utilizada para el diseño de filtos, especificamente es un algoritmo que nos sirve para el diseño optimo de filtros FIR, se encarga de minimizar el error entre la
respuesta deseada y la respuesta real, esto ocurre al ajustar los coeficientes del filtro. El analisis de las graficas muestran que la variacion de algunos parametros cambian algunos valores, si el ancho de banda de transicion aumenta la
atenuacion de la banda parada aumentara, desarrollando una relacion directamente proporcional, lo que es importante para ver la capacidad del filtro ya que si el ancho de banda de transicion es alto, el filtro tendra gran capacidad para
atenuar las frecuencias no deseadas.

En el caso de la variacion de la longitud del filtro, N, varia la banda parada (relacion directamente proporcional y el riple de banda parada, en el que la amplitud de estas ondulaciones producen distorcion en la banda de paso.

5.3. Método de mínimos cuadrados

El metodo de minimos cuadrados es casi similar al Algoritmo de Parks-McClellan ya que ambos minimizan el error entre la respuesta de frecuencia deseada y real, solo que en este caso el error es cuadrado, ademas que este metodo no
usa las repeticiones sino un sistema de ecuaciones lineales. La variacion del ancho de banda de transicion muestra que la disminucion de este valor producira que la ondulacion en la banda de paso vaya apareciendo, asi como tambien la
atenuacion de la banda parada aumentara.

En la variacion de la longitud del filtro se observa que al aumentar su valor no hay presencia de algun tipo de ondulacion en la banda de paso, asi como tambien la atenuacion de el aumento de la atenuacion de la banda parada, teniendo
una relacion directamente propocional.

También podría gustarte