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(...)]
- Definir carpeta:
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)
- Generar silencio:
- 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)
- Generar silencio:
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(ejω) = 1/L |Σn=0L-1 (x[n] * e-j2πkn/N)|2 = 1/L |X(ejω)|2
- Periodograma Modificado: Φx(ejω) = 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(ejω) = 1/K Σk=1K Φx(ejω)
- 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]}