Los singles flotantes IEEE solo proporcionan alrededor de 24 bits de mantisa. Pero muchos algoritmos DSP / de filtrado (biquads IIR con polos / ceros cerca del círculo unitario, etc.) requieren más de 24 bits de mantisa para productos computacionales intermedios (acumuladores, etc.), solo para obtener resultados finales precisos cerca de 16 o 24 bits Para este tipo de algoritmos, los acumuladores de enteros escalados de 32, 40 y 48 bits a menudo se usaban con DSP que no tenían FPU.
Pero en muchas implementaciones de procesadores actuales (para PC, teléfonos inteligentes, etc.), la FPU de doble precisión es mucho más rápida que intentar usar un entero escalado de 32 o 64 bits cuando su algoritmo necesita tener más de 24 bits de producto intermedio.
Para evitar la destrucción de la memoria caché de datos, los datos sin procesar pueden estar en formato entero corto o flotante de precisión simple, mientras que solo el núcleo computacional más local podría usar un formato de mayor resolución. Pero si está compartiendo resultados de cálculo intermedios entre módulos DSP, el protocolo de intercambio entre módulos también puede beneficiarse de un formato de datos o bus de mayor resolución (mantisa de más de 24 bits).
Realmente depende de qué tipo de apoyo está hablando. En x86, cuando utiliza las instrucciones de coma flotante de estilo x87, obtiene la precisión interna completa de 80 bits y el mismo tiempo de procesamiento, ya sea que esté trabajando con precisión simple o doble.
Pero cuando usa las instrucciones SIMD, puede hacer el doble de trabajo con flotadores de 32 bits que con flotadores de 64 bits. Eso es un gran problema.
Otra cosa a tener en cuenta es la memoria: el uso de doble precisión divide por dos la cantidad de datos que cabe en los niveles más rápidos de memoria caché.
Se reducirá a qué tipo de sintetización y procesamiento realice. Si involucra filtros IIR (o más generalmente cualquier cosa con variables de estado y / o retroalimentación), puede dispararse más fácilmente en el pie (inestabilidades o imprecisiones de corte bajo debido al truncamiento del coeficiente) con 32 bits, si no piensa demasiado en lo que estás haciendo. Algunas topologías de filtro funcionan perfectamente con 32 bits.
En cualquier caso, es un problema de precisión numérica: en términos de calidad, no habrá ninguna diferencia perceptiva. Tenga en cuenta que es bastante ridículo esperar que una cadena de audio de hardware tenga más de 20 bits de precisión (suponiendo que la placa esté enrutada impecablemente y que todas las partes sean ideales, ¡todavía estamos llegando al límite del ruido de Johnson!) - y Esta precisión está cubierta en gran medida por flotadores de precisión simple. La ruta de la señal en una mesa de mezclas de alta gama tiene 50 amplificadores operacionales, que individualmente tienen varios órdenes de magnitud más de distorsión que el ruido de cuantificación de las operaciones aritméticas en flotadores de precisión simple.
fuente
Debe conocer los requisitos numéricos de su algoritmo y elegir la precisión en consecuencia.
Hagamos los cálculos aquí: un punto flotante de 32 bits tiene una mantisa de 24 bits y un exponente de 8 bits. Esto le proporciona una relación señal / ruido de aproximadamente 150 dB en un rango dinámico de aproximadamente 1540 dB. Eso es suficiente para la mayoría de las cosas de audio. La doble precisión te da aproximadamente el doble.
Cada algoritmo tiene ciertos requisitos para la precisión numérica. Si se diseñaron correctamente, todos los algoritmos de audio que conozco funcionan muy bien con coma flotante de 32 bits. "correctamente diseñado" es la palabra clave aquí. Por ejemplo, un paso de banda de sexto orden de 40-200 Hz muestreado a 44,1 kHz implementado como un filtro directo de II IIR bi-quad tendrá algunos problemas de ruido a 32 bits. Sin embargo, funciona perfectamente bien como forma transpuesta II o forma directa I filtro.
Si intenta una expansión de fracción parcial del mismo filtro de paso de banda utilizando, por ejemplo, la función residualz () de Matlab, obtendrá malos resultados incluso con doble precisión. Nuevamente, los requisitos numéricos del algoritmo para esos datos de entrada específicos exceden lo que la doble precisión tiene para ofrecer. La clave para solucionar esto no es aumentar la precisión a ciegas, sino utilizar un mejor algoritmo.
Finalmente, echemos un vistazo a lo que hace que la flotación (32 bits o 64 bits) sea vulnerable: tiene un rango dinámico enorme, es decir, puede reducir la señal en 200dB, amplificar en 500dB, reducir nuevamente en 300dB y termina exactamente donde comenzó casi sin pérdida de precisión en absoluto. Entonces eso no es todo. El punto flotante tiene problemas para agregar números que son muy diferentes en tamaño. Hay un punto en el que agregar un número pequeño simplemente no hace ninguna diferencia, es decir, obtienes 1 + dx = 1. Este número "dx" es aproximadamente 1.2e-7 para coma flotante de 32 bits y 2.2e-16 para 64 bits. Si su algoritmo incluye sumar o restar números que están tan separados en magnitud, puede tener problemas.
Un buen ejemplo de esto es el filtro Direct Form II mencionado anteriormente: El filtro directo From II (ver, por ejemplo, https://ccrma.stanford.edu/~jos/fp/Direct_Form_II.html ) básicamente calcula las variables de estado filtrando la entrada con la función de transferencia de solo polo primero y luego filtrando con los ceros para crear la salida. Ahora, si los polos están cerca del círculo unitario, la función de transferencia de solo polo se vuelve muy, muy grande. Por lo tanto, la variable de estado puede ser mucho más grande que la entrada (80db a 100dB más grande) y sumar variables de estado con la entrada crea mucho ruido.
La solución aquí es ir a un Formulario II transpuesto o un filtro de Formulario I directo. El análisis muestra que las variables de estado no pueden ser más grandes que la entrada / salida, entonces tal vez 12dB o más, por lo que el problema de magnitud no coincide en primer lugar.
fuente
Ir a la precisión doble en relación con la precisión simple tiene dos ventajas: mayor alcance y mejor resolución. Me sorprendería mucho si el mayor rango hiciera alguna diferencia en su aplicación. Si lo hace, probablemente haya algo mal con su escala.
Si hay una mejora, estaría en la resolución. Una mejor resolución significa menos ruido de cuantización . Sin embargo, a menos que el ruido de cuantización esté cerca del mismo nivel que todas sus otras fuentes de ruido, probablemente no hará ninguna diferencia. Puede hacer un análisis de sus niveles de ruido y señal para tener una idea de la cantidad de ruido que proviene del error de cuantificación, pero realmente no sabrá con certeza si marcará la diferencia o no hasta que lo implemente con ambos y A ver si hace la diferencia.
fuente
Si está trabajando con audio sintetizado que se somete a un gran procesamiento entre la generación y el renderizado (conversión a un entero de 16/24 bits), entonces se beneficiará al trabajar con la mejor precisión numérica que tenga su máquina.
También es importante hacer una distinción fundamental entre números enteros y números de coma flotante. Un punto flotante de doble precisión (64 bits) es diferente de un entero de 64 bits, e incluso puede trabajar con enteros de precisión arbitraria en el software, dependiendo de las herramientas de software que utilice. Eso sería importante si tuviera que grabar sonidos en lugar de generarlos (que yo sepa, la conversión AD siempre guarda los sonidos muestreados en formato entero).
No puedo estar totalmente seguro al respecto, pero si genera su sonido ya en coma flotante, los artefactos más comunes probablemente no estarán presentes por definición, y puede procesarlo con mucha más "calidad de audio". Quizás incluso pueda generar las muestras de sonido DESPUÉS de que ya haya aplicado algunos efectos al generador en sí. El único momento en el que realmente introducirá cualquier artefacto potencial es cuando lo convierte para salida en algún formato de archivo entero, como .WAV, por ejemplo.
En realidad, dado que la mayoría de las máquinas tienen una precisión nativa "doble" (64 bits) hoy en día, ya no veo una razón para trabajar con 32 bits ...
¡Espero que ayude!
fuente