Skip to content

[FEAT] io.py: Implementar load_audio(), save_audio() y load_fir_coefficients() #11

Description

@jero-scafati

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)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions