Quand considérer la virgule flottante double (64 bits) pour l'audio


12

Lors de la synthèse et du traitement de l'audio sur des processeurs modernes, quand envisagerait-on d'utiliser autre chose qu'une virgule flottante simple précision (32 bits)? De toute évidence, l'audio entrant et sortant dans le monde réel est de 16/24 bits, donc je ne parle que de la précision des signaux (à la fois l'audio lui-même et des choses comme les coefficients de filtre) dans le logiciel.

Suppose que:

  • le CPU / DSP a un support matériel en virgule flottante pour une précision simple et double
  • La priorité est la qualité audio, pas les hautes performances. Par exemple, la double précision serait envisagée si elle offrait une meilleure qualité (perceptuelle).

Réponses:


9

Les flotteurs simples IEEE ne fournissent qu'environ 24 bits de mantisse. Mais de nombreux algorithmes DSP / filtrage (biquades IIR avec pôles / zéros près du cercle unitaire, etc.) nécessitent bien plus de 24 bits de mantisse pour les produits de calcul intermédiaires (accumulateurs, etc.), juste pour obtenir des résultats finaux précis à près de 16 ou 24 bits. Pour ces types d'algorithmes, des accumulateurs entiers à l'échelle 32, 40 et 48 bits étaient souvent utilisés avec des DSP sans FPU.

Mais sur de nombreuses implémentations de processeur actuelles (pour PC, smartphones, etc.), le FPU double précision est beaucoup plus rapide que d'essayer d'utiliser un entier à l'échelle 32 ou 64 bits lorsque votre algorithme doit avoir plus de 24 bits de produit intermédiaire.

Pour éviter de mettre le cache de données à la corbeille, les données brutes peuvent être au format entier court ou flottant en simple précision, tandis que seul le noyau de calcul le plus local peut utiliser un format de résolution plus élevée. Mais si vous partagez des résultats de calcul intermédiaires entre les modules DSP, le protocole d'échange entre les modules peut également bénéficier d'un bus ou d'un format de données à résolution plus élevée (plus de mantisse 24 bits).


C'est le genre d'informations que je recherchais. J'accepterai cette réponse si vous pouvez bien vouloir fournir un exemple concret d'un cas où une double précision est requise pour faire fonctionner un filtre, c'est-à-dire que cela sonnera mal (ou au moins assez ordinaire) avec une précision simple, mais lisse comme du beurre avec une double précision.
user1849104

De plus, que voulez-vous dire exactement par la corbeille du cache? Voulez-vous dire qu'avoir deux fois plus de données à travers cela va rendre les choses terriblement lentes?
user1849104

Un exemple a été donné, IIR avec des pôles / zéros près du cercle unitaire. S'il y a un cache, les algorithmes et les ensembles de données de travail qui tiennent dans ce cache peuvent être considérablement plus rapides que ceux qui n'en ont pas.
hotpaw2

9

le CPU / DSP a un support matériel en virgule flottante pour une précision simple et double.

Cela dépend vraiment du type de soutien dont vous parlez. Sur x86, lorsque vous utilisez les instructions à virgule flottante de style x87, vous obtenez la précision interne complète de 80 bits et le même temps de traitement, que vous travailliez avec une précision simple ou double.

Mais lorsque vous utilisez les instructions SIMD, vous pouvez effectuer deux fois plus de travail en utilisant des flottants 32 bits que des flottants 64 bits. C'est un gros problème.

Une autre chose à prendre en compte est la mémoire - l'utilisation de la double précision divise par deux la quantité de données qui tient dans les niveaux de mémoire cache les plus rapides.

Lors de la synthèse et du traitement audio sur des processeurs modernes,

Cela dépendra du type de synthèse et de traitement que vous effectuez. Si cela implique des filtres IIR (ou plus généralement tout ce qui a des variables d'état et / ou un feedback), vous pouvez plus facilement vous tirer une balle dans le pied (instabilités ou imprécisions de coupure faible dues à la troncature des coefficients) avec 32 bits, si vous ne le faites pas pensez trop à ce que vous faites. Certaines topologies de filtre fonctionnent parfaitement avec 32 bits.

Dans tous les cas, c'est un problème de précision numérique - en termes de qualité, il n'y aura pas de différence de perception. Gardez à l'esprit qu'il est assez ridicule de s'attendre à ce qu'une chaîne audio matérielle ait plus de 20 bits de précision (en supposant que la carte est impeccablement acheminée et que toutes les pièces sont idéales, nous courons toujours dans la limite du bruit Johnson!) - et cette précision est largement couverte par des flotteurs simple précision. Le chemin du signal sur une table de mixage haut de gamme a 50s d'amplificateurs opérationnels, qui ont individuellement plusieurs ordres de grandeur plus de distorsion que le bruit de quantification des opérations arithmétiques sur des flotteurs simple précision.


Serait-il sûr de dire que l'utilisation de la précision simple avec les instructions SIMD vous donnera toujours environ le double des performances par rapport à la double précision?
user1849104

Étant donné que je ne peux plus modifier le commentaire précédent: je n'ai jamais eu l'occasion d'utiliser (directement) des jeux d'instructions SIMD. Est-il possible d'utiliser simplement la précision simple et d'obtenir deux fois les performances? Ou la réalité fait-elle obstacle?
user1849104

6

Vous devez connaître les exigences numériques de votre algorithme et choisir la précision en conséquence.

Faisons donc le calcul ici: un point flottant de 32 bits a une mantisse de 24 bits et un exposant de 8 bits. Cela vous donne un rapport signal / bruit d'environ 150 dB sur une plage dynamique d'environ 1540 dB. C'est beaucoup pour la plupart des choses audio. La double précision vous en donne environ deux fois plus.

Chaque algorithme a certaines exigences de précision numérique. S'ils sont correctement conçus, tous les algorithmes audio que je connais font très bien avec la virgule flottante 32 bits. "correctement conçu" est le mot clé ici. Par exemple, une bande passante de 6e ordre de 40-200 Hz échantillonnée à 44,1 kHz implémentée en tant que filtre bi-quadruple direct II IIR aura en effet des problèmes de bruit à 32 bits. Cependant, il fonctionne parfaitement bien comme filtre transposé de forme II ou direct de forme I.

Si vous tentez une expansion de fraction partielle du même filtre passe-bande en utilisant par exemple la fonction residuez () de Matlab, vous obtiendrez de mauvais résultats même avec une double précision. Encore une fois, les exigences numériques de l'algorithme pour ces données d'entrée spécifiques dépassent ce que la double précision a à offrir. La clé pour résoudre ce problème n'est pas d'augmenter aveuglément la précision, mais d'utiliser un meilleur algorithme à la place.

Enfin, examinons ce qui rend le flottant (32 bits ou 64 bits) vulnérable: vous avez une plage dynamique énorme, c'est-à-dire que vous pouvez réduire le signal de 200 dB, amplifier de 500 dB, réduire à nouveau de 300 dB et vous vous retrouvez exactement là où vous avez commencé avec presque aucune perte de précision que ce soit. Ce n'est donc pas ça. La virgule flottante a du mal à ajouter des nombres de tailles très différentes. Il y a un point où l'ajout d'un petit nombre ne fait aucune différence, c'est-à-dire que vous obtenez 1 + dx = 1. Ce nombre "dx" est d'environ 1,2e-7 pour la virgule flottante 32 bits et 2,2e-16 pour 64 bits. Si votre algorithme inclut l'ajout ou la soustraction de nombres d'une amplitude aussi éloignée, vous risquez de rencontrer des problèmes.

Un bon exemple est le filtre Direct Form II mentionné précédemment: le filtre direct From II (voir par exemple https://ccrma.stanford.edu/~jos/fp/Direct_Form_II.html ) calcule essentiellement les variables d'état en filtrant l'entrée avec la fonction de transfert de pôle uniquement, puis le filtrage avec les zéros pour créer la sortie. Maintenant, si les pôles sont proches du cercle unitaire, la fonction de transfert de pôle uniquement devient très, très grande. Ainsi, la variable d'état peut être beaucoup plus grande que l'entrée (80 dB à 100 dB plus grande) et la somme des variables d'état avec l'entrée crée beaucoup de bruit.

La solution ici est de passer à un filtre transposé de forme II ou direct de forme I. L'analyse montre que les variables d'état ne peuvent pas être plus grandes que l'entrée / sortie, alors peut-être 12 dB ou environ, de sorte que l'inadéquation de l'amplitude du problème ne se produit pas en premier lieu.


2

Il y a deux avantages à passer à la double précision par rapport à la simple précision: plage étendue et meilleure résolution. Je serais très surpris que l'augmentation de la portée fasse une différence dans votre application. Si c'est le cas, il y a probablement un problème avec votre mise à l'échelle.

S'il y a une amélioration, ce sera dans la résolution. Une meilleure résolution signifie moins de bruit de quantification . À moins que le bruit de quantification ne soit proche du même niveau que toutes vos autres sources de bruit, cela ne fera probablement aucune différence. Vous pouvez faire une analyse de vos niveaux de bruit et de signal pour avoir une idée de la quantité de bruit provenant d'une erreur de quantification, mais vous ne saurez vraiment pas avec certitude si cela fera une différence ou non jusqu'à ce que vous l'implémentiez avec les deux et voir si cela fait une différence.


2

Si vous travaillez avec de l'audio synthétisé qui subit beaucoup de traitement entre la génération et le rendu (conversion en entier 16/24 bits), vous bénéficierez d'un travail avec la meilleure précision numérique de votre machine.

Il est également important de faire une distinction fondamentale entre les nombres entiers et les nombres à virgule flottante. Un virgule flottante double précision (64 bits) est différent d'un entier 64 bits, et vous pouvez même travailler avec des entiers de précision arbitraire dans le logiciel, selon les outils logiciels que vous utilisez. Ce serait important si vous deviez enregistrer des sons au lieu de les générer (pour autant que je sache, la conversion AD enregistre toujours les sons échantillonnés au format entier).

Je ne peux pas en être totalement sûr, mais si vous générez votre son déjà en virgule flottante, les artefacts les plus courants ne seront probablement pas présents par définition, et vous pouvez le traiter avec beaucoup plus de "qualité audio". Vous pouvez peut-être même générer les échantillons sonores seulement APRÈS avoir déjà appliqué certains effets au générateur lui-même. Le seul moment où vous introduirez réellement un artefact potentiel est lorsque vous le convertissez pour une sortie dans un format de fichier entier, tel que .WAV par exemple.

En fait, comme la plupart des machines ont une précision native "double" (64 bits) de nos jours, je ne vois plus de raison de travailler avec 32 bits ...

J'espère que cela pourra aider!


3
"Je ne vois plus de raison de travailler avec 32 bits ..." à moins que vous n'utilisiez SIMD!
pichenettes
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.