Descripción
Implementar las funciones de entrada/salida para leer y escribir señales de audio en formato .wav y para cargar los coeficientes del filtro FIR provistos por la cátedra.
Contexto del TP
La cátedra provee:
- Archivos
.wav con pares de señales entrada/salida para la Parte 2 (identificación de sistemas)
- Coeficientes del filtro FIR (formato a confirmar con la cátedra: puede ser
.npy, .txt o .wav)
- La consigna pide también filtrar "señal musical" — que se carga desde un
.wav
Sin estas funciones, ningún compañero puede trabajar con los datos reales del TP.
Funciones a implementar
Archivo: core/dsp/io.py (archivo nuevo — crearlo)
load_audio(filepath)
save_audio(filepath, signal, fs)
load_fir_coefficients(filepath)
Parámetros y retorno — load_audio
| Parámetro |
Tipo |
Descripción |
filepath |
str |
Ruta al archivo .wav |
Retorno:
| Variable |
Tipo |
Descripción |
fs |
int |
Frecuencia de muestreo en Hz leída del archivo |
signal |
np.ndarray |
Señal como float64, normalizada en [-1.0, 1.0], siempre mono (1D) |
Comportamiento esperado:
- Si el archivo es estéreo (2 canales), convertir a mono promediando:
signal = (ch_left + ch_right) / 2
- Normalizar según el dtype original:
| dtype del archivo | Operación de normalización |
|-------------------|---------------------------|
| int16 | signal / 32768.0 |
| int32 | signal / 2147483648.0 |
| float32 | castear a float64, ya está en [-1, 1] |
| float64 | sin cambios |
Parámetros — save_audio
| Parámetro |
Tipo |
Descripción |
Restricciones |
filepath |
str |
Ruta de destino .wav |
— |
signal |
np.ndarray |
Señal float64 en [-1.0, 1.0] |
arreglo 1D |
fs |
int |
Frecuencia de muestreo |
— |
No retorna nada. Guarda como float64 WAV.
Parámetros y retorno — load_fir_coefficients
| Parámetro |
Tipo |
Descripción |
filepath |
str |
Ruta al archivo de coeficientes (.npy o .txt) |
Retorno: np.ndarray 1D con los coeficientes float64.
Formatos soportados:
.npy: usar np.load(filepath)
.txt: usar np.loadtxt(filepath) (un coeficiente por línea)
La cátedra confirmará el formato antes de la pre-entrega.
Criterios de aceptación
| Test |
Qué verifica |
test_load_audio_types |
Retorna (int, np.ndarray) |
test_load_audio_normalized |
np.max(np.abs(signal)) <= 1.0 |
test_load_audio_mono |
signal.ndim == 1 (siempre 1D, aunque el archivo sea estéreo) |
test_load_audio_float64 |
signal.dtype == np.float64 |
test_save_load_roundtrip |
Guardar y volver a cargar preserva la forma de onda con np.allclose(atol=1e-5) |
test_load_fir_npy |
Cargar un .npy de prueba retorna un np.ndarray 1D |
test_load_fir_txt |
Cargar un .txt de prueba retorna el mismo arreglo que el .npy |
Notas de implementación
- Usar
scipy.io.wavfile.read para leer y scipy.io.wavfile.write para escribir
scipy.io.wavfile.read retorna (samplerate, data) — data puede ser int16, int32 o float32
- Para crear archivos de prueba en los tests:
scipy.io.wavfile.write('test.wav', 44100, np.zeros(100, dtype=np.int16))
Archivos involucrados
core/dsp/io.py (crear)
core/dsp/tests/test_io.py (crear)
Descripción
Implementar las funciones de entrada/salida para leer y escribir señales de audio en formato
.wavy para cargar los coeficientes del filtro FIR provistos por la cátedra.Contexto del TP
La cátedra provee:
.wavcon pares de señales entrada/salida para la Parte 2 (identificación de sistemas).npy,.txto.wav).wavSin estas funciones, ningún compañero puede trabajar con los datos reales del TP.
Funciones a implementar
Archivo:
core/dsp/io.py(archivo nuevo — crearlo)Parámetros y retorno —
load_audiofilepathstr.wavRetorno:
fsintsignalnp.ndarrayfloat64, normalizada en [-1.0, 1.0], siempre mono (1D)Comportamiento esperado:
signal = (ch_left + ch_right) / 2| dtype del archivo | Operación de normalización |
|-------------------|---------------------------|
|
int16|signal / 32768.0||
int32|signal / 2147483648.0||
float32| castear afloat64, ya está en [-1, 1] ||
float64| sin cambios |Parámetros —
save_audiofilepathstr.wavsignalnp.ndarrayfloat64en [-1.0, 1.0]fsintNo retorna nada. Guarda como
float64WAV.Parámetros y retorno —
load_fir_coefficientsfilepathstr.npyo.txt)Retorno:
np.ndarray1D con los coeficientesfloat64.Formatos soportados:
.npy: usarnp.load(filepath).txt: usarnp.loadtxt(filepath)(un coeficiente por línea)La cátedra confirmará el formato antes de la pre-entrega.
Criterios de aceptación
test_load_audio_types(int, np.ndarray)test_load_audio_normalizednp.max(np.abs(signal)) <= 1.0test_load_audio_monosignal.ndim == 1(siempre 1D, aunque el archivo sea estéreo)test_load_audio_float64signal.dtype == np.float64test_save_load_roundtripnp.allclose(atol=1e-5)test_load_fir_npy.npyde prueba retorna unnp.ndarray1Dtest_load_fir_txt.txtde prueba retorna el mismo arreglo que el.npyNotas de implementación
scipy.io.wavfile.readpara leer yscipy.io.wavfile.writepara escribirscipy.io.wavfile.readretorna(samplerate, data)—datapuede ser int16, int32 o float32scipy.io.wavfile.write('test.wav', 44100, np.zeros(100, dtype=np.int16))Archivos involucrados
core/dsp/io.py(crear)core/dsp/tests/test_io.py(crear)