Laboratorio Nº2: Muestreo, ecos y transformada Z (Resuelto)
Importación de dependencias
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = [16, 8]
plt.rcParams.update({'font.size' : 14})
from scipy.io import wavfile # Permite leer y grabar audio
from IPython.display import Audio # Permite reproducir el audio
from scipy.signal import lfilter
Carga del archivo de audio
AudioName = "hornero.wav" # Archivo de Audio
fs, Audiodata = wavfile.read(AudioName)
duracion = Audiodata.shape[0]/fs
print(f'Duracion = {duracion} , Frecuencia de Muestreo = {fs} [Muestras/Seg]' \
f', Wav format = {Audiodata.dtype}')
dt = 1/fs # Tiempo entre muestras
t = np.arange(0, duracion, dt) # Se genera el vector tiempo
x = Audiodata[:,0] # Esto se hace ya que Audiodata tiene 2 columnas (2 canales!)
Actividad Nº1: Muestreo y efectos en el audio
Reproducción con distintas tasas de muestreo
Audio(x, rate=fs)
Audio(x, rate=2*fs)
Audio(x, rate=0.5*fs)
Gráfica del audio en el tiempo
plt.stem(t,x,label='Audio')
plt.xlim(t[0],t[-1])
plt.xlabel('Tiempo')
plt.ylabel('Amplitud')
plt.legend()
plt.show()
INICIO = 10000
FIN = 10300 # Limite 539647
plt.stem(t[INICIO:FIN],x[INICIO:FIN],label='Audio')
plt.xlim(t[INICIO],t[FIN])
plt.xlabel('Muestras')
plt.ylabel('Amplitud')
plt.legend()
plt.show()
Actividad Nº2: Ecos y Transformada Z
N = 8000 # Numero de muestras usado para cada atraso
A = 0.5 # Ganancia (o atenuación) del primer atraso
B = 0.1 # Ganancia (o atenuación) del segundo atraso
zeros = np.zeros(N)
Ecos
uno = np.concatenate((x, zeros, zeros), axis=0) # Señal original
dos = np.concatenate((zeros, A * x, zeros), axis=0) # Señal con 1 atraso
tres = np.concatenate((zeros, zeros, B * x), axis=0) # Señal con 2 atrasos
n = np.arange(len(uno))
figura, axs = plt.subplots(3,1)
plt.sca(axs[0])
plt.stem(n,uno,label='Uno')
plt.xlim(n[0],n[-1])
plt.ylim(uno.min(), uno.max())
plt.legend()
plt.sca(axs[1])
plt.stem(n,dos,label='Dos')
plt.xlim(n[0],n[-1])
plt.ylim(uno.min(), uno.max())
plt.legend()
plt.sca(axs[2])
plt.stem(n,tres,label='Tres')
plt.xlim(n[0],n[-1])
plt.ylim(uno.min(), uno.max())
plt.legend()
plt.show()
y_ecos = uno + dos + tres
Audio(y_ecos, rate=fs)
Transformada Z
num = np.zeros(1+2*N) # Para dar el tamaño necesario del numerador
den = np.array([1,])
# Recorda que la asignación de un elemento es de la forma num[i]=4.3
num[0] = 1.0
num[N] = A
num[2*N] = B
x_2 = np.concatenate((x, np.zeros(2*N)), axis=0) # Esto se hace ya que el output de lfilter tiene la misma dimensión que la señal input
y_filter = lfilter(num,den,x_2)
Audio(y_filter, rate=fs)
figura, axs = plt.subplots(2,1)
plt.sca(axs[0])
plt.stem(n,y_ecos,label='Ecos')
plt.xlim(n[0],n[-1])
plt.ylim(y_ecos.min(), y_ecos.max())
plt.legend()
n_filter = np.arange(len(x_2))
plt.sca(axs[1])
plt.stem(n_filter,y_filter,label='Transformada Z')
plt.xlim(n_filter[0],n_filter[-1])
plt.ylim(y_filter.min(), y_filter.max())
plt.legend()
plt.show()