commit bf9fa614e20229bb33688a454cafefc7d8858e0c
parent 580e6c67551aaf7e71c723a4fae83a54e15ef6c6
Author: Martin Klöckner <mjkloeckner@gmail.com>
Date: Sun, 30 Nov 2025 19:55:08 -0300
added noise to sample file
Diffstat:
3 files changed, 46 insertions(+), 9 deletions(-)
diff --git a/tp/scripts/data.py b/tp/scripts/data.py
@@ -65,9 +65,8 @@ canciones_prueba = []
def cargar_canciones_prueba(count=0):
for i, file_name in enumerate(sorted(os.listdir(canciones_prueba_dir))):
- if count != 0:
- if i == count:
- break
+ if count != 0 and i == count:
+ break
basename, ext = os.path.splitext(file_name)
diff --git a/tp/scripts/main.py b/tp/scripts/main.py
@@ -10,7 +10,6 @@ from data import *
############################# Llamados a funciones ############################
def primera_parte():
- # time_domain
time_domain_cancion1()
time_domain_cancion2()
time_domain_music_instruments()
@@ -39,10 +38,15 @@ def tercera_parte():
# comparacion_de_espectrogramas_filtrado_vs_original(h)
DB = generar_base_de_datos_si_no_existe()
# evaluar_aciertos(DB)
- evaluar_cancion(DB, canciones_dataset[0])
+ # evaluar_cancion(DB, canciones_prueba[0])
+
+ cancion_con_ruido_data = agregar_ruido_a_cancion(canciones_dataset[0].data)
+ cancion_con_ruido_fs = canciones_dataset[0].fs
+ write_wav("../out/000002_ruido.wav", cancion_con_ruido_fs, cancion_con_ruido_data)
+ evaluar_cancion_raw(DB, cancion_con_ruido_data, cancion_con_ruido_fs, "000002_ruido")
cargar_canciones_dataset()
-cargar_canciones_prueba()
+# cargar_canciones_prueba()
# primera_parte()
# segunda_parte()
diff --git a/tp/scripts/tercera_parte.py b/tp/scripts/tercera_parte.py
@@ -1,6 +1,7 @@
from utils import *
from scipy.signal import firwin, freqz, tf2zpk, get_window
from scipy.fft import fftshift
+from scipy.io.wavfile import write as write_wav
import random
import pickle
@@ -217,6 +218,7 @@ def generar_base_de_datos_si_no_existe():
except Exception as e:
print(f"[ERROR] Ocurrio un error inesperado: {e}")
else:
+ cargar_canciones_dataset()
DB = generar_base_de_datos()
return DB
@@ -463,6 +465,29 @@ def query_DB(DB, huella):
return ID.astype(np.uint32), MATCHES.astype(np.uint32)
+def evaluar_cancion_raw(DB, cancion_data, cancion_fs, cancion_name):
+ h, fs = filtro_fir_deducido()
+
+ nro_pruebas = 0
+ data = np.convolve(cancion_data, h, mode='same')
+ print(f'[LOG] Evaluando cancion `{cancion_name}`')
+ duracion_cancion = len(cancion_data) / cancion_fs
+ print(f'[LOG] Duracion cancion: {duracion_cancion:05.02f}s')
+
+ for r in range(0, 10):
+ for T in [5, 10, 20]: # segmentso de 5, 10 y 20 segundos
+ t_inicial = random.uniform(0.0, 1.0) * (duracion_cancion - 1.5*T)
+ t_inicial = 0 if t_inicial < 0 else t_inicial
+ print(f'[LOG] Intervalo {t_inicial:05.02f}:{t_inicial+T:05.02f}s', end='')
+ f, t, E = generate_spectrogram(cancion_fs, data, t=t_inicial, dt=T)
+ H = generar_huella(E, cancion_fs)
+
+ nro_pruebas += 1
+ id, matches = query_DB(DB, H)
+ print(f' mejor coincidencia: `{canciones_dataset[id[0]].name}`')
+
+ print("")
+
def evaluar_cancion(DB, cancion):
h, fs = filtro_fir_deducido()
@@ -471,6 +496,7 @@ def evaluar_cancion(DB, cancion):
print(f'[LOG] Evaluando cancion `{cancion.path}`')
duracion_cancion = len(data) / cancion.fs
print(f'[LOG] Duracion cancion: {duracion_cancion:05.02f}s')
+
for r in range(0, 10):
for T in [5, 10, 20]: # segmentso de 5, 10 y 20 segundos
t_inicial = random.uniform(0.0, 1.0) * (duracion_cancion - 1.5*T)
@@ -481,8 +507,8 @@ def evaluar_cancion(DB, cancion):
nro_pruebas += 1
id, matches = query_DB(DB, H)
-
print(f' mejor coincidencia: `{canciones_dataset[id[0]].name}`')
+
print("")
def evaluar_aciertos(DB):
@@ -495,8 +521,8 @@ def evaluar_aciertos(DB):
print(f'[LOG] Evaluando cancion `{cancion.path}`')
duracion_cancion = len(data) / cancion.fs
print(f'[LOG] Duracion cancion: {duracion_cancion:05.02f}s')
- for r in range(0, 10):
- for T in [5, 10, 20]: # segmentso de 5, 10 y 20 segundos
+ for r in range(0, 5):
+ for T in [2, 3, 5]: # segmentso de 5, 10 y 20 segundos
t_inicial = random.uniform(0.0, 1.0) * (duracion_cancion - 1.5*T)
t_inicial = 0 if t_inicial < 0 else t_inicial
print(f'[LOG] Intervalo {t_inicial:05.02f}:{t_inicial+T:05.02f}s', end='')
@@ -514,3 +540,10 @@ def evaluar_aciertos(DB):
print(f'[LOG] cantidad de pruebas incorrectas: {incorrectos} de {nro_pruebas}')
print(f'[LOG] error porcentual: {(incorrectos/nro_pruebas)*100:0.02f}%')
+
+def agregar_ruido_a_cancion(data):
+ ruido = np.random.normal(loc=0, scale=0.1, size=len(data))
+ cancion_con_ruido = data + ruido
+ cancion_con_ruido = np.clip(cancion_con_ruido, -1.0, 1.0)
+ return cancion_con_ruido
+
+\ No newline at end of file