Algoritmo de audio WebRTC

Algoritmo de audio WebRTC con código C completo

WebRTC proporciona un conjunto de motores de procesamiento de audio,

Contiene los siguientes algoritmos:

Control automático de ganancia AGC (control automático de ganancia)

Supresión de ruido ANS (Supresión automática de ruido)

AEC es cancelación de eco acústico (cancelación de eco acústico para  dispositivos móviles )

VAD es detección de actividad de voz

Este es un conjunto muy clásico de recursos de algoritmos de audio que vale la pena leer y aprender.

La publicación del blog compartida anteriormente también mencionó puntos de conocimiento relacionados con el audio.

Algunos puntos de conocimiento de la optimización del algoritmo, debido a razones históricas,

La implementación de WebRTC ya no es la mejor idea en este momento.

Pero también muy clásico.

Por ejemplo:

La implementación de la raíz cuadrada rápida WebRtcSpl_Sqrt en el algoritmo AGE.

Puede ser sustituido por la siguiente función de montaje:

copiar código

flotador estático fast_sqrt(flotador x) { 
    flotador s; 
#si está definido(__x86_64__) 
    __asm__ __volatile__ ("sqrtss %1, %0" : "=x"(s): "x"(x)); 
#elif definido(__i386__) 
    s = x; 
    __asm__ __volatile__ ("fsqrt" : "+t"(s)); 
#elif definido(__arm__) && definido(__VFP_FP__) 
    __asm__ __volatile__ ("vsqrt.f32 %0, %1" : "=w"(s): "w"(x)); 
#más 
    s = sqrtf(x); 
#endif 
    retorno s; 
}

copiar código

Muchas instrucciones de ensamblaje de CPU modernas ya admiten la implementación rápida de la raíz cuadrada,

Después de probar y comparar, será mucho más rápido que WebRtcSpl_Sqrt.

Para la implementación rápida de la raíz cuadrada, consulte lo siguiente para obtener más detalles:

Mejor método de raíz cuadrada - Algoritmo - Función (Precisión VS Velocidad) - CodeProject

Los estudiantes que están optimizando algoritmos simplemente dejan de lado la raíz cuadrada.

Cada algoritmo tiene dos métricas básicas,

rendimiento, efecto.

WebRTC se centra en la comunicación de audio, por lo que sus requisitos de rendimiento son extremadamente altos.

La optimización del rendimiento del algoritmo, en la mayoría de los casos, es un caso especial.

También lo compartí cuando celebré una reunión para compartir tecnología en la empresa.

En otras palabras, cuanto más cerca de la CPU, más rápido será el rendimiento.

Es decir, a menos que sea necesario, no escriba en el disco duro y luego léalo.

Porque el disco duro está demasiado lejos de la CPU.

Entonces la idea de optimización es muy obvia.

Los medios de comunicación de rápido a lento son

Registro de CPU -> caché de CPU -> espacio de memoria -> espacio en el disco duro (disco)

Intente utilizar recursos de nivel superior tanto como sea posible y utilice registros si puede.

Para poder depender de los recursos de la CPU, es necesario hacer que la estructura de datos y los recursos del algoritmo sean más compactos.

Recursos relacionados sobre CPU:

CPU-Z | Software | ID de CPU

Puedes comprobarlo en CPU-Z.

Para deshacernos del capullo, debemos comprender la estructura y la información de rendimiento de la CPU.

Luego, recete el medicamento adecuado para satisfacer al máximo el sabor de la CPU.

La idea de optimización de algoritmos según la ciencia popular:

1. Utilice tantas variables locales como sea posible para escribir la función de cierre más corta y eficaz.

Para compilar y procesar, los registros finalmente se pueden usar para almacenar en caché.

2. Llame a la función lo menos posible y los parámetros se pasan preferiblemente por puntero o referencia, lo que puede reducir la copia.

Por supuesto, los parámetros deberían ser los menos posibles.

3. Los datos procesados ​​son lo más compactos y pequeños posible, y la alineación de los datos es en gran medida

Es para satisfacer las preferencias de la CPU y utilizar su caché.

4. Lea y escriba secuencialmente tanto como sea posible para utilizar los recursos de caché

5. Degradación del cálculo: Generalmente, la multiplicación lleva más tiempo que la suma y la división lleva más tiempo que la multiplicación.

El punto flotante requiere más tiempo que el número entero.

Por lo tanto, la multiplicación se reduce a suma, la división se reduce a multiplicación y la coma flotante se reduce a un número entero (coma fija).

Si la mayoría de tus amigos no saben por qué, puedes acceder a los recursos:

GitHub - ARM-software/CMSIS_5: Repositorio de desarrollo CMSIS versión 5

Lea algunas de estas implementaciones y descubrirá por qué.

No me expandiré aquí.

6. Si puedes usar memoria, no uses disco, no creo que sea necesario explicar esto.

7. Por supuesto, también es posible optimizar la interfaz de datos con ideas de algoritmos específicos, como la búsqueda de tablas y similares.

Parece un poco fuera de tema, volvamos al tema.

Tómese el tiempo para organizar los algoritmos mencionados anteriormente en 

La forma de implementación de un solo archivo y el código de muestra adjunto.

Es conveniente para fines de aprendizaje o ingeniería.

Dirección del proyecto relacionado:

GitHub - cpuimage/WebRTC_AECM: Cancelador de eco acústico para puerto de módulo móvil desde WebRTC

GitHub - cpuimage/WebRTC_NS: Puerto del módulo de supresión de ruido desde WebRTC

https://github.com/cpuimage/WebRTC_VAD

GitHub - cpuimage/WebRTC_AGC: Puerto del módulo de control automático de ganancia desde WebRTC

El camino es cada vez más largo, hasta llegar a la oscuridad.

El código de muestra se puede compilar con cmake; consulte CMakeLists.txt para obtener más detalles.

Supongo que te gusta

Origin blog.csdn.net/qq_39436605/article/details/132077837
Recomendado
Clasificación