Conceptos Fundamentales Procesamiento Digital de Señal de Audio

Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 5,94 KB

Operaciones Básicas de Procesamiento de Audio

Carga, Filtrado y Reproducción

  • Carga de audio: audio, fs = librosa.load('archivo.wav', sr=None)
  • Diseño de filtro FIR: B = firwin(numtaps, cutoff, fs)
  • Aplicación de filtro: y = lfilter(B, 1, audio)
  • Respuesta en frecuencia: W, H = freqz(B, a, fs)
  • Reproducción de audio: display(Audio(y, rate=fs))

Manejo de Canales y Archivos

  • Carga de audio estéreo: audio_mono, fs = librosa.load('archivo.wav', sr=None, mono=False)
  • Verificar número de canales: if len(x.shape) > 1: return x.shape[0] else: return 1
  • Listar archivos WAV en carpeta:
    • Definir carpeta: folder = pathlib.Path('ruta')
    • Obtener archivos WAV: wav_files = list(folder.rglob('*.wav'))
    • Filtrar archivos WAV inválidos: invalid_wav_files = [file for file in wav_files if not check_wav(...)]

Manipulación de Arrays de Audio (NumPy)

  • Asignación (no modifica el original): x = x + 2
  • Operación in-place (modifica el original): x += 2
  • Operación in-place sin modificar el original (usando copia): y = x.copy(); x += 2
  • Convertir mono a estéreo: y = np.stack([x, x], axis=0)
  • Convertir estéreo a mono: y = np.mean(x, axis=0)
  • Unir audios: y = np.concatenate((x1, x2), axis=-1)
  • Añadir silencio inicial:
    • Generar silencio: if (mono) silencio = np.zeros(num_muestras_silencio) elif (estereo) silencio = np.zeros((2, num_muestras_silencio))
    • Concatenar: y = np.concatenate((silencio, x), axis=-1)
  • Añadir silencio final: y = np.concatenate((x, silencio), axis=-1)
  • Añadir silencio en medio:
    • Generar silencio: silencio = np.zeros((2, num_muestras_silencio) if x.ndim == 2 else num_muestras_silencio)
    • Dividir audio: antes = x[:, :inicio_muestras] if x.ndim == 2 else x[:inicio_muestras]; despues = x[:, inicio_muestras:] if x.ndim == 2 else x[inicio_muestras:]
    • Concatenar: y = np.concatenate((antes, silencio, despues), axis=-1)

Resampling de Señales de Audio

Operaciones Fundamentales

  • Inserción de Ceros: if L == 1: return x; y = np.zeros(L * len(x)); y[::L] = x
  • Diezmado: if M == 1: return x; y = x[::M]
  • Interpolación: ncoef = L * 10; fc = 1 / max(L, M); B = firwin(ncoef + 1, fc); xL = np.zeros(len(x) * L); xL[::L] = x; xF = lfilter(B, 1.0, xL) * L; xD = xF[::M]
  • Cálculo de L y M (fracción irreducible): frac = Fraction(fs_dest, fs_orig).limit_denominator(); L, M = frac.numerator, frac.denominator

Ventanas y Estimación Espectral

Ventanas Temporales

  • Rectangular: {2/L, 13dB} - Para frecuencias cercanas y amplitudes similares.
  • Triangular: {4/L, 26dB}
  • Hanning: {4/L, 32dB}
  • Hamming: {4/L, 42dB} - Para grandes diferencias de amplitud o margen dinámico crítico.

Estimación de la Densidad Espectral de Potencia (PSD)

  • Periodograma: Φx(e) = 1/L |Σn=0L-1 (x[n] * e-j2πkn/N)|2 = 1/L |X(e)|2
  • Periodograma Modificado: Φx(e) = 1/(LU) |Σn=0L-1 (x[n] * w[n] * e-j2πkn/N)|2 con U = 1/L Σn=0L-1 (w[n]2).
  • El periodograma es un estimador sesgado. Para reducir el sesgo, podemos tomar L mayor.
  • Estimador de Welch: Φx(e) = 1/K Σk=1K Φx(e)
    • Donde K es el número de segmentos (o periodogramas) de tamaño L.

Filtros Adaptativos y Convergencia

Conceptos Clave

  • Expresión de la superficie del error: E{e2[n]} = ζ(W) = E{d2[n]} + WTRW
  • Autocorrelación de la entrada: Rx[m] = E{x[n]x[n-m]} para m=0 y m=1.
  • Vector de correlación cruzada P: P es un vector columna donde P[m] = Rdx[m] = E{d[n]x[n-m]} para m=0 hasta L.
  • Filtro Óptimo de Wiener W*: W* = R-1P
  • Valor mínimo de la potencia del error: ζmin = E{d2[n]} - PTW*

Convergencia del Algoritmo LMS

  • Factor de convergencia: r = 1 - 2λμ < 1
  • Si r > 0: convergencia no oscilatoria.
  • Si r < 0: convergencia oscilatoria.
  • Los autovalores λ se obtienen de: det(Rx - λI) = 0
  • Criterio Teórico de Convergencia para μ: μ < 1/λmax
  • Criterio Práctico de Convergencia para μ: μ < 1/((L+1)Rx[0])
    • Donde L+1 es el número de coeficientes del filtro.

Potencia Media

  • Potencia media de una señal s[n]: E{s2[n]}

Entradas relacionadas: