Skip to content

Commit 3c54d46

Browse files
authored
Add files via upload
1 parent a22adb1 commit 3c54d46

File tree

2 files changed

+135
-0
lines changed

2 files changed

+135
-0
lines changed
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
T�cnicas Digitales III
2+
Trabajo pr�ctico: Filtrado digital FIR
3+
4+
1) Filtro Moving Average con se�ales senoidales en Python
5+
6+
a) Genere una se�al senoidal con frecuencia fundamental fn = 100 Hz. Elija una frecuencia de muestreo adecuada.
7+
8+
b) Agregue ruido gaussiano a la se�al senoidal tal que la relaci�n se�al-ruido entre la se�al senoidal y la se�al con ruido sea de 15 dB.
9+
10+
c) Calcule el valor m�ximo del orden del filtro (N_max) fco = 2 fn.
11+
12+
d) Aplique filtrado del tipo moving average a la se�al con ruido para un filtro MA con dimensi�n igual N = N_max. Utilice la funci�n lfilter() de scipy.signal:
13+
14+
from scipy.signal import lfilter
15+
y = lfilter(b, a, x)
16+
17+
e) Grafique la respuesta en frecuencia y fase del filtro MA. Use la funci�n freqz() de scipy.signal:
18+
19+
from scipy.signal import freqz
20+
import matplotlib.pyplot as plt
21+
22+
w, h = freqz(b, a, worN=n, fs=2 * np.pi)
23+
24+
plt.plot(w, 20 * np.log10(abs(h)))
25+
plt.title('Respuesta en frecuencia')
26+
plt.xlabel('Frecuencia [radianes/muestra]')
27+
plt.ylabel('Amplitud [dB]')
28+
plt.grid()
29+
plt.show()
30+
31+
f) Grafique las se�ales en el dominio del tiempo sin ruido, con ruido y filtrada, y compare las tres.
32+
33+
g) Grafique la respuesta en frecuencia de las se�ales original y filtrada y compare.
34+
35+
import numpy as np
36+
37+
frequencies = np.fft.fftfreq(len(x), d=sample_spacing)
38+
import matplotlib.pyplot as plt
39+
40+
plt.plot(frequencies, np.abs(Y))
41+
plt.xlabel('Frecuencia [Hz]')
42+
plt.ylabel('Amplitud')
43+
plt.grid()
44+
plt.show()
45+
46+
Donde sample_spacing es el espaciado entre muestras en la se�al de tiempo (es decir, el inverso de la frecuencia de muestreo).
47+
48+
49+
h) Repita los puntos d) a g) para N = N_max / 2 y N = N_max * 10.
50+
51+
2) Filtro Moving Average con se�ales de audio
52+
53+
a) Cargue el archivo de audio provisto llamado Tchaikovsky.mat.
54+
55+
import scipy.io
56+
57+
data = scipy.io.loadmat('Tchaikovsky.mat')
58+
59+
# Suponiendo que la matriz se llama 'Tchaikovsky' dentro del archivo .mat
60+
signal = data['Tchaikovsky']
61+
62+
Se cargar� la matriz signal con dos canales (est�reo). La variable Fs = 44100. Elija 1 de los 2 canales disponibles.
63+
64+
b) Agregue ruido gaussiano a esta se�al tal que la relaci�n se�al-ruido entre la se�al y la se�al con ruido sea de 50 dB.
65+
66+
c) Calcule el valor m�ximo de N (N_max), con las frecuencias fs = Fs y fco = 11050 Hz.
67+
68+
d) Aplique filtrado del tipo moving average a la se�al con ruido para un filtro MA con dimensi�n igual N = N_max. Utilice la funci�n lfilter() de scipy.signal.
69+
70+
e) Utilice la biblioteca sounddevice para reproducir las se�ales sin ruido, con ruido y filtrada.
71+
72+
import sounddevice as sd
73+
74+
# Asumiendo que y es tu matriz (o vector) de audio y Fs es la frecuencia de muestreo
75+
sd.play(y, Fs)
76+
sd.wait() # Espera a que termine la reproducci�n
77+
78+
f) Grafique la respuesta en frecuencia de las se�ales original y filtrada y compare.
79+
80+
h) Repita los puntos de d) a f) para N = N_max / 2 y N = N_max * 10.
81+
82+
83+
84+
3) Filtrado por ventanas con se�ales de audio
85+
86+
a) Use la biblioteca scipy.signal para dise�ar un filtro:
87+
88+
? Pasa-banda.
89+
? Ventana Blackman, orden 10.
90+
? Frecuencias de corte de 300 Hz y 3400 Hz (canal telef�nico), con formato punto flotante, precisi�n doble (valor por defecto).
91+
? Frecuencia de muestreo 44100 Hz.
92+
93+
94+
from scipy.signal import firwin
95+
96+
numtaps = 10 # n�mero de coeficientes del filtro
97+
fir_coefficients = firwin(numtaps, [f1, f2], window='blackman', pass_zero=False)
98+
99+
Para visualizar la respuesta en frecuencia del filtro dise�ado.
100+
101+
from scipy.signal import freqz
102+
import matplotlib.pyplot as plt
103+
104+
w, h = freqz(fir_coefficients, worN=8000)
105+
plt.plot(0.5*w/np.pi, np.abs(h))
106+
107+
b) Aumente el orden del filtro a 50. �Se modifica la respuesta en frecuencia del filtro?.
108+
109+
c) Utilice como se�al de entrada el archivo Tchaikovsky.mat. Aplique a la se�al de inter�s el filtro dise�ado en el punto b) haciendo:
110+
111+
from scipy.signal import convolve
112+
113+
# Convoluci�n entre la primera columna de signal y fir_coefficients
114+
fir_output = convolve(matrix[:, 0], fir_coefficients, mode='same')
115+
116+
d) Grafique los espectros de la se�al original (signal) y filtrada (fir_output).
117+
118+
e) Examine ambas gr�ficas. �Qu� diferencia observa entre ambas se�ales?.
119+
120+
121+
122+
4) Filtraci�n de una Onda Senoidal con un Filtro FIR
123+
124+
a) Generar una onda senoidal de 50 Hz con una frecuencia de muestreo de 1000 Hz y una duraci�n de 1 segundo.
125+
126+
b) Agregar ruido blanco gaussiano a la se�al.
127+
128+
c) Dise�ar un filtro FIR pasa-bajo utilizando la ventana de Hamming.
129+
130+
d) Aplicar el filtro a la se�al ruidosa.
131+
e) Graficar la se�al original, la se�al con ruido, y la se�al filtrada.
132+
133+
134+
135+
408 KB
Binary file not shown.

0 commit comments

Comments
 (0)