commit a39703bb68ff3523d9ea6cec3a5e8a762d1b34ac
parent 91981b9dfa04d036fc4bdad88f4634456b7ed94b
Author: Martin Klöckner <mjkloeckner@gmail.com>
Date: Thu, 27 Nov 2025 11:57:09 -0300
updated `tp/*`
Diffstat:
19 files changed, 58 insertions(+), 16 deletions(-)
diff --git a/tp/data/canciones/000002.mp3 b/tp/data/canciones/000002.mp3
Binary files differ.
diff --git a/tp/data/canciones/000005.mp3 b/tp/data/canciones/000005.mp3
Binary files differ.
diff --git a/tp/data/canciones/000010.mp3 b/tp/data/canciones/000010.mp3
Binary files differ.
diff --git a/tp/data/canciones/000140.mp3 b/tp/data/canciones/000140.mp3
Binary files differ.
diff --git a/tp/data/canciones/000141.mp3 b/tp/data/canciones/000141.mp3
Binary files differ.
diff --git a/tp/data/canciones/000148.mp3 b/tp/data/canciones/000148.mp3
Binary files differ.
diff --git a/tp/data/canciones/000182.mp3 b/tp/data/canciones/000182.mp3
Binary files differ.
diff --git a/tp/data/canciones/000190.mp3 b/tp/data/canciones/000190.mp3
Binary files differ.
diff --git a/tp/data/canciones/000193.mp3 b/tp/data/canciones/000193.mp3
Binary files differ.
diff --git a/tp/data/canciones/000194.mp3 b/tp/data/canciones/000194.mp3
Binary files differ.
diff --git a/tp/data/canciones/000197.mp3 b/tp/data/canciones/000197.mp3
Binary files differ.
diff --git a/tp/data/canciones/000200.mp3 b/tp/data/canciones/000200.mp3
Binary files differ.
diff --git a/tp/data/canciones/000203.mp3 b/tp/data/canciones/000203.mp3
Binary files differ.
diff --git a/tp/data/canciones/000204.mp3 b/tp/data/canciones/000204.mp3
Binary files differ.
diff --git a/tp/data/canciones/000207.mp3 b/tp/data/canciones/000207.mp3
Binary files differ.
diff --git a/tp/data/canciones/000210.mp3 b/tp/data/canciones/000210.mp3
Binary files differ.
diff --git a/tp/data/canciones/000211.mp3 b/tp/data/canciones/000211.mp3
Binary files differ.
diff --git a/tp/main.py b/tp/main.py
@@ -1,7 +1,8 @@
import numpy as np
from scipy.io import wavfile
-from scipy.signal import firwin, freqz, tf2zpk
+from scipy.signal import firwin, freqz, tf2zpk, get_window
from utils import *
+import librosa
## Datos
file1_path = 'data/cancion1.wav'
@@ -285,7 +286,6 @@ def a4_violin_fseries():
cutoff = 2650 # frecuencia de corte
M = 700 # orden FIR (número de coeficientes)
-fs = 44100
def filtro_fir():
# Diseño FIR pasabajos con ventana
@@ -333,6 +333,8 @@ def filtro_fir_polos_y_ceros(a):
def filtro_fir_deducido():
+ fs = 44100
+
# respuesta ideal pasabajos: sinc centrada en M/2
n = np.arange(M + 1)
wc = 2*np.pi*cutoff / fs
@@ -342,26 +344,62 @@ def filtro_fir_deducido():
h_ideal = np.sinc(2.0 * (cutoff/fs) * (n - M/2))
# ventana de Hamming
- v = 0.54 - 0.46 * np.cos(2*np.pi*n/M)
+ v_hamming = 0.54 - 0.46 * np.cos(2*np.pi*n/M)
+
+ v_rectangular = []
+ for i in n:
+ v_rectangular.append(1 if i < 350 else 0)
# respuesta del filtro FIR (version acotada de la sinc)
- h = h_ideal * v
+ h = h_ideal * v_hamming
# se normaliza para tener ganancia unitaria para frecuancias <= fc
h = h / np.sum(h)
- fig, ax = dtime_plot(M, h, "respuesta_al_impulso_filtro_fir",
- f'Respuesta al impulso filtro FIR grado {M}')
+ # fig, ax = dtime_plot(M, h, "respuesta_al_impulso_filtro_fir",
+ # f'Respuesta al impulso filtro FIR grado {M}')
# respuesta en frecuencia del filtro
w, H = freqz(h, worN=2048, fs=fs)
fase = np.unwrap(np.angle(H)) * 180 / np.pi
- fig, ax1, ax2 = freq_response_plot(w, H, fase, show=False, fc=5e3)
- save_plot(fig, "respuesta_en_frecuencia_pasa-bajos_fir")
+ # fig, ax1, ax2 = freq_response_plot(w, H, fase, show=False, fc=5e3)
+ # save_plot(fig, "respuesta_en_frecuencia_pasa-bajos_fir")
# polos y ceros
- filtro_fir_polos_y_ceros(h)
+ # filtro_fir_polos_y_ceros(h)
+
+ file_path = 'canciones/000002.mp3'
+
+ file_data, file_fs = librosa.load(file_path, sr=None, mono=True)
+ file_fs = int(fs)
+
+ # spectogram_plot(file_fs, file_data,
+ # f"espectograma_fs_original_44100Hz", N=1024, ylim=[0, 20000])
+
+ file_filter_output = np.convolve(file_data, h, mode='same')
+
+ # spectogram_plot(file_fs, file_filter_output,
+ # f"espectograma_fs_{cutoff}Hz", t=0, N=1024, ylim=[0, 20000])
+
+ freq_plot(44100, v_hamming, "v_hamming_freq", f_max=8000)
+ freq_plot(44100, v_rectangular, "v_rectangular_freq", f_max=8000)
+
+ freq_compute_fft(44100, v_hamming)
+
+ for i in [512, 1024, 2048]:
+ # for window in ['boxcar', 'bartlett', 'hamming']:
+
+ # spectogram_plot(file1_fs, file_filter_output,
+ # f"espectograma_submuestreado_{window}_{i:04d}", N=i,
+ # win=window, ylim=[0, 3000], t=5, dt=1)
+
+ N = 1024
+ beta = 8.6
+ kaiser_window = get_window(("kaiser", beta), N)
+ spectogram_plot(file1_fs, file_filter_output,
+ f"espectograma_submuestreado_kaiser_window_{i:04d}", N=i,
+ win=kaiser_window, ylim=[0, 3000], t=5, dt=1)
############################# Llamados a funciones ############################
@@ -388,5 +426,6 @@ def primer_y_segunda_parte():
a4_clarinete_cutoff()
a4_violin_cutoff()
-# filtro_fir()
+
+# primer_y_segunda_parte()
filtro_fir_deducido()
diff --git a/tp/utils.py b/tp/utils.py
@@ -238,15 +238,17 @@ def freq_compute_fft(fs, data, t=0, dt=0):
di = int((t+dt)*fs)
interval_data = data[i:di]
+
+ # puntos de la fft
N = len(interval_data)
- interval_fft = fft(interval_data) / N
- interval_freqs = fftfreq(N, d=1/fs)
+ interval_fft = fft(interval_data, 20000)
+ interval_freqs = fftfreq(20000, d=1/fs)
return interval_fft, interval_freqs
# hace la transformacion a frecuencias y pasa lo transformado a `freq_graph_data`
def freq_plot(fs, data, save_name="", f_min=0, f_max=0, y_min=0, y_max=0,
- t=0, dt=0, a=0, da=0):
+ t=0, dt=0, a=0, da=0, show=False):
interval_fft, interval_freqs = freq_compute_fft(fs, data, t, dt)
N = len(interval_fft)
@@ -255,7 +257,7 @@ def freq_plot(fs, data, save_name="", f_min=0, f_max=0, y_min=0, y_max=0,
x = interval_freqs[:N // 2]
y = np.abs(interval_fft[:N // 2])
- fig, ax = freq_graph_data(x, y, f_min, f_max, y_min, y_max, show=False)
+ fig, ax = freq_graph_data(x, y, f_min, f_max, y_min, y_max, show=show)
if save_name != "":
save_plot(fig, save_name)
@@ -277,7 +279,7 @@ def freq_plot_multiple(fs, data_arr, leg_arr, save_name="",
if save_name != "":
save_plot(fig, save_name)
-def spectogram_plot(fs, data, save_name="", t=0, dt=0, N=1024, overlp=16, win='hann', xlim=[], ylim=[], show=False):
+def spectogram_plot(fs, data, save_name="", t=0, dt=0, N=1024, overlp=16, win='hamm', xlim=[], ylim=[], show=False):
if dt == 0:
dt = (len(data)/fs)-t
@@ -308,7 +310,8 @@ def spectogram_plot(fs, data, save_name="", t=0, dt=0, N=1024, overlp=16, win='h
if show == True:
plt.show()
else:
- save_plot(fig, save_name)
+ if save_name != "":
+ save_plot(fig, save_name)
return fig, axis