La predicción lineal excitada por código ( CELP ) es un algoritmo de codificación de voz predictiva lineal propuesto originalmente por Manfred R. Schroeder y Bishnu S. Atal en 1985. En ese momento, proporcionó una calidad significativamente mejor que los algoritmos de baja tasa de bits existentes, como la predicción lineal excitada por residuo (RELP) y los vocoders de codificación predictiva lineal (LPC) (por ejemplo, FS-1015 ). Junto con sus variantes, como CELP algebraico , CELP relajado , CELP de bajo retardo y predicción lineal excitada por suma vectorial , actualmente es el algoritmo de codificación de voz más utilizado [ cita requerida ] . También se utiliza en la codificación de voz de audio MPEG-4 . CELP se usa comúnmente como un término genérico para una clase de algoritmos y no para un códec en particular.
El algoritmo CELP se basa en cuatro ideas principales:
El algoritmo original simulado en 1983 por Schröder y Atal requería 150 segundos para codificar 1 segundo de voz cuando se ejecutaba en una supercomputadora Cray-1 . Desde entonces, formas más eficientes de implementar los libros de códigos y mejoras en las capacidades de computación han hecho posible ejecutar el algoritmo en dispositivos integrados, como los teléfonos móviles.
Antes de explorar el complejo proceso de codificación de CELP, presentamos aquí el decodificador. La Figura 1 describe un decodificador CELP genérico. La excitación se produce sumando las contribuciones de los libros de códigos fijos (también conocidos como estocásticos o de innovación) y adaptativos (también conocidos como de tono):
donde es la contribución del libro de códigos fijo (también conocido como estocástico o de innovación) y es la contribución del libro de códigos adaptativo ( tono ). El libro de códigos fijo es un diccionario de cuantificación vectorial que está (implícita o explícitamente) codificado en el códec. Este libro de códigos puede ser algebraico ( ACELP ) o almacenarse explícitamente (por ejemplo, Speex ). Las entradas en el libro de códigos adaptativo consisten en versiones retrasadas de la excitación. Esto hace posible codificar de manera eficiente señales periódicas, como sonidos vocales.
El filtro que modela la excitación tiene un modelo de todos los polos de la forma , donde se denomina filtro de predicción y se obtiene mediante predicción lineal ( algoritmo de Levinson-Durbin ). Se utiliza un filtro de todos los polos porque es una buena representación del tracto vocal humano y porque es fácil de calcular.
El principio fundamental del CELP se denomina análisis por síntesis (AbS) y significa que la codificación (análisis) se realiza optimizando perceptualmente la señal decodificada (síntesis) en un bucle cerrado. En teoría, el mejor flujo CELP se produciría probando todas las combinaciones de bits posibles y seleccionando la que produzca la señal decodificada con el mejor sonido. Obviamente, esto no es posible en la práctica por dos razones: la complejidad requerida supera cualquier hardware disponible actualmente y el criterio de selección de “mejor sonido” implica un oyente humano.
Para lograr una codificación en tiempo real utilizando recursos informáticos limitados, la búsqueda CELP se divide en búsquedas secuenciales más pequeñas y manejables utilizando una función de ponderación perceptual simple. Normalmente, la codificación se realiza en el siguiente orden:
La mayoría de los códecs de audio modernos (si no todos) intentan moldear el ruido de codificación de modo que aparezca principalmente en las regiones de frecuencia donde el oído no puede detectarlo. Por ejemplo, el oído es más tolerante al ruido en partes del espectro que son más fuertes y viceversa. Es por eso que, en lugar de minimizar el error cuadrático simple, CELP minimiza el error para el dominio ponderado perceptualmente . El filtro de ponderación W(z) generalmente se deriva del filtro LPC mediante el uso de expansión de ancho de banda :
dónde .