Cómo medir la latencia

#1 el 19/05/2012
Publicidad
El proceso se ha simplificado bastante, pues ya no es necesario instalar ningún programa adicional. Se consigue mediante una utilidad, "jack_iodelay", incluida en las versiones más recientes de jack.

Advertencia:
Para conseguir su objetivo, jack_iodelay produce un sonido alto y desagradable. Si haces las cosas como se indican en esta guía, este ruido no debería llegar a los altavoces pero, por si acaso, baja el volumen!

Doy por supuesto que jack está activo.

1) Conexiones físicas

Hace falta conectar un cable físico entre la salida y la entrada de tu tarjeta de audio. Lo normal es conectar la primera salida mono (que en el lado digital correspondería al puerto de jack-audio "system: playback 1") a la primera entrada mono (lo que en jack correspondería al "system: capture 1").

2) Ejecutar jack_iodelay

Abre una terminal e introduce el comando:

jack_iodelay

Verás algo como:

Alguien escribió:
new capture latency: [0, 0]
new playback latency: [0, 0]
Signal below threshold...
Signal below threshold...
Signal below threshold...


3) Conectar jack_iodelay

Ahora hacemos las conexiones virtuales. En qjackctl o patchage conecta jack_delay: out a system: playback1. La señal va a través del cable hasta la entrada de la tarjeta. Para cerrar el bucle debemos conectar el system: capture1 to jack_delay: in

4) ¿Qué dicen los números?

La terminal empezará a decir algo. Este es un ejemplo de una prueba que hice el otro día:

Alguien escribió:
3106.619 frames 64.721 ms total roundtrip latency
extra loopback latency: 34 frames
use 17 for the backend arguments -I and -O


En este ejemplo, la latencia total es 3106 cuadros aproximadamente. Dividiendo este número entre la frecuencia de muestreo en Hz (muestras por segundo) obtenemos la latencia en segundos. De todas formas, véis que también está indicado.

La "extra loopback latency" es latencia debida al hardware. Sobretodo a los convertidores AD y DA de tu tarjeta de sonido.

Más abajo veis una recomendación: Poner la mitad de los cuadros de "latencia extra" como latencia de entrada y la otra mitad como "latencia de salida" en la configuración de jack. En qjackctl, son los campos la columna derecha, abajo del todo. De esta forma, programas como ardour la tendrán en cuenta para compensarla.

El resto, hasta el valor total, depende de la configuración de jack y de qué implementación (jack1 o jack2) estemos usando. Será:

Para jack1 y jack2 en modo síncrono:

Latencia total debida a jack = p*n

Siendo p el valor de "cuadros por periodo" y n el de "periodos por buffer"

Para jack2 en modo asíncrono (el modo por defecto):

Latencia total debida a jack = p*(n + 1)

En el ejemplo de arriba, estoy con jack2 en el modo por defecto. Con 1024 cuadros por periodo y 2 periodos por buffer. Entonces, 1024*(2 + 1) = 3072 cuadros. 3072 de jack + 34 de hardware son 3106 en total.

La frecuencia es 48000 Hz, luego son 3072 / 48 = 64 ms debidos a la configuración de jack. Más 34 / 48 = 0.7 ms debidos al propio hardware. En total: 64,7 ms.
Subir
#2 el 19/05/2012
Para dispositivos USB hay que añadir a esas fórmulas un periodo extra o 24 ms, lo que sea más corto:

http://old.nabble.com/Differences-in-latency-between-USB-and-internal-audio-interfaces-td30407033.html

Si queréis medir la latencia de bucle en una interfaz que sólo tiene entrada de micro podéis usar un adaptador de impedancias cutre como éste que describo aquí:

http://apps.linuxaudio.org/wiki/jack_latency_tests#measuring_roundtrip_latency_with_jack_delay

Ars longa, vita brevis.

Subir
#3 el 19/05/2012
Guau! No sabía ese detalle de las tarjetas USB. Y ahora me explico por qué la latencia aumentaba inesperadamente en unas pruebas que hice hace tiempo sobre una UCA202, mientras que en la m-audio PCI se mantenía según lo esperado.

Por otro lado, en la prueba que hice el otro día en el netbook (que es la que he puesto como ejemplo en la entrada original), puenteé directamente la salida de auriculares a la entrada de micro #-o Mala idea, no?

Vaya trabajo de investigación te has pegado ¿Dónde está el emoticono que se quita el sombrero? =D> Una pregunta, las gráficas cómo las hiciste, con gnuplot?

Saludos, Pablo
Subir
#4 el 20/05/2012
Pablo_F escribió:
puenteé directamente la salida de auriculares a la entrada de micro #-o Mala idea, no?


No creo que sea dañino para el equipo, supongo que cualquier entrada/salida llevará proteciones eléctricas básicas frente a sobretensión o cortocircuitos, pero puede dar problemas para conseguir unos niveles de salida y de entrada que permitan el sincronismo que pide la herramienta. Yo no conseguí que sincronizara y empezara a medir hasta que metí el atenuador.

Pablo_F escribió:
Una pregunta, las gráficas cómo las hiciste, con gnuplot?


Las gráficas las hizo Robin con gnuplot, que lo tiene más controlado. Yo hice el script que lanzaba jackd con diferentes parámetros, ejecutaba el medidor de latencia y presentaba los resultados en una tabla.

Ars longa, vita brevis.

Subir
#5 el 21/05/2012
Estupendo trabajo. :plasplas:
Subir
Respuesta rápida
Identíficate o regístrate para poder responder en este hilo.