4.2 FIR – Filtros y Convolución

[ convolución ] [ ejercicio ] [ algoritmo ]
..


Referencia: McClellan 5.4.3 p181

Una expresión general para salidas de Filtros FIR se obtienen de los términos de respuesta al impulso. Si los coeficientes de bk son los mismos valores de respuesta al impulso se puede expresar como una suma de convolución, que es una operación entre dos secuencias.

y[n] = \sum_{k=0}^{M} h[k] x[n-k] y[n] =h[k] * x[n] =\sum_{k=-\infty}^{\infty} h[k] x[n-k]

Lo que expresa que la secuencia de salida y[n] se obtiene al aplicar la convolución de la respuesta al impulso h[n] con la señal de entrada x[n]

[ convolución ] [ ejercicio ] [ algoritmo ]
..


1. Ejercicio

Referencia: McClellan 5-4.3.3 p184

Evaluar la convolución de hn que es una secuencia de 11 puntos, con xn que es una secuencia de 51 puntos. Use el vector hn como respuesta al impulso de un sistema de medias móviles de 11 puntos.

x[n]= \sin(0.7*\pi*n) \text{ ; } 0 \le n \le 50 h[n]= \begin{cases} 1/11 & 0 \le n \le 40 \\0 & n<0\end{cases}

y[n] = x[n]*h[n]

Al aplicar el algoritmo de media móvil se compara el resultado con el algoritmo de convolución.

muestreo: 51  ; tamaño ki: 73
x[n]: (Heaviside(n) - Heaviside(n - 51))*sin(0.07*pi*n)
h[n]: Heaviside(n)/11 - Heaviside(n - 11)/11
>>>

FIR media movil Convolución[ convolución ] [ ejercicio ] [ algoritmo ]

..


2. Algoritmo en Python

Referencia: [1] LTI DT – Convolución de sumas – Python. Blog Señales y Sistemas. [2] https://numpy.org/doc/stable/reference/generated/numpy.convolve.html

# ejemplo 5-4.3.3 p184 FIR - Media Móvil  y convolución
# telg1034 DSP fiec-espol edelros@espol.edu.ec
import numpy as np
import matplotlib.pyplot as plt
import sympy as sym
import telg1034 as dsp

# variables continuas
from telg1034 import t,A,w,f,p,pi,DosPi,I,equivalentes
# variables discretas
from telg1034 import n

# INGRESO
u = sym.Heaviside(n)
# señal como suma de las partes
muestrasN = 50 + 1  # # intervalo [0,50]
gn = (u-u.subs(n,n-muestrasN)) 
xn = sym.sin(0.07*pi*n)*gn

# FIR Media Móvil
ventana = 10 + 1 # intervalo [0,10]
hn = (u-u.subs(n,n-ventana))/ventana 

# PROCEDIMIENTO ----------------
# muestreo x[n]
ki = np.arange(-ventana,muestrasN + ventana,1,dtype=int)
xni = sym.lambdify(n,xn, modules=equivalentes)
xki = xni(ki)

hni = sym.lambdify(n,hn, modules=equivalentes)
hki = hni(ki) 

# FIR Media Móvil
yki = np.convolve(hki,xki)
yki = yki[ventana:len(xki)+ventana] # intervalo ki

# SALIDA
print('muestreo:',muestrasN,' ; tamaño ki:',len(ki))
print('x[n]:',xn)
print('h[n]:',hn)

# GRAFICA FIR
plt.subplot(311) # x[n]
plt.stem(ki,xki,linefmt = 'C0:',
         label='x[n]')
plt.xlabel('n')
plt.ylabel('x[n]')
plt.title('FIR Media Móvil con convolución')
plt.legend()

plt.subplot(312) # h[n]
plt.stem(ki,hki,linefmt = 'C1:',label='h[n]')
plt.xlabel('n')
plt.ylabel('h[n]')
plt.legend()

plt.subplot(313) # y[n]
plt.stem(ki,yki,linefmt = 'C2:',label='y[n]')
plt.xlabel('n')
plt.ylabel('y[n]')
plt.legend()
plt.show()

[ convolución ] [ ejercicio ] [ algoritmo ]