Échantillonnage audio

À partir d'Android 5.0 (Lollipop), les rééchantillonneurs audio sont entièrement basés sur des filtres FIR dérivés d'une fonction de Kaiser, appelée "windowed-sinc". Cette fonction présente les propriétés suivantes :

  • Elle est facile à calculer pour ses paramètres de conception (ondulation de la bande d'arrêt, bande passante de transition, fréquence d'arrêt, longueur du filtre).
  • Elle est presque optimale pour la réduction de l'énergie de bande d'arrêt par rapport à l'énergie globale.

Consultez la page 50 du document Multirate Systems and filter Banks de PP Vaidyanathan pour consulter des discussions sur la fenêtre Kaiser, son caractère optimal et sa relation avec les fenêtres sphériques prolates.

Les paramètres de conception sont automatiquement calculés en fonction de la détermination de la qualité interne et des ratios d'échantillonnage souhaités. Le filtre windowed-sinc est généré en fonction des paramètres de conception. Pour l'utilisation musicale, le rééchantillonneur pour les fréquences allant de 44,1 à 48 kHz (et inversement) est généré avec une qualité supérieure à celle de la conversion arbitraire de la fréquence.

Pour atteindre ce niveau, les rééchantillonneurs audio offrent une qualité et une vitesse accrues. Toutefois, ils peuvent inclure de petites quantités d'ondulations de bande passante et de bruit harmonique d'alias, et peuvent entraîner une perte de fréquence élevée dans la bande de transition. Évitez donc de les utiliser s'ils ne sont pas absolument nécessaires.

Bonnes pratiques concernant l'échantillonnage et le rééchantillonnage

Cette section décrit quelques bonnes pratiques pour vous aider à éviter les problèmes liés aux taux d'échantillonnage.

Choisir le taux d'échantillonnage adapté à l'appareil

En général, il est préférable de choisir le taux d'échantillonnage adapté à l'appareil, généralement 44,1 kHz ou 48 kHz. L'utilisation d'un taux d'échantillonnage supérieur à 48 kHz entraîne habituellement une qualité inférieure, car un rééchantillonneur doit être utilisé pour lire le fichier.

Utiliser des ratios de rééchantillonnage simples (mode polyphase fixe par rapport au mode polyphase interpolé)

Le rééchantillonneur fonctionne dans l'un des modes suivants :

  • Mode polyphase fixe. Les coefficients de filtrage de chaque polyphase sont précalculés.
  • Mode polyphase interpolé. Les coefficients de filtrage de chaque polyphase doivent être interpolés à partir des deux polyphases précalculées les plus proches.

Le rééchantillonneur est plus rapide en mode polyphase fixe, lorsque le ratio entre le taux d'entrée et le taux de sortie L/M (en supprimant le plus grand diviseur commun) a M inférieur à 256. Par exemple, pour une conversion de 44 100 à 48 000, L = 147, M = 160.

En mode polyphase fixe, le taux d'échantillonnage est verrouillé et ne change pas. En mode polyphase interpolé, le taux d'échantillonnage est approximatif. Lors de la lecture sur un appareil 48 kHz, l'écart du taux d'échantillonnage est généralement d'un seul échantillon sur quelques heures. Ce n'est généralement pas un problème, car l'erreur d'approximation est nettement inférieure à l'erreur de fréquence due aux oscillateurs à quartz interne, à la dérive thermique ou à l'instabilité (généralement des dizaines de ppm).

Choisissez des taux d'échantillonnage à ratios simples tels que 24 kHz (1:2) et 32 kHz (2:3) lors de la lecture sur un appareil 48 kHz, même si d'autres taux d'échantillonnage et ratios peuvent être autorisés via AudioTrack.

Utiliser le suréchantillonnage plutôt que le sous-échantillonnage pour modifier les taux d'échantillonnage

Vous pouvez modifier le taux d'échantillonnage à la volée. La précision de cette modification est basée sur la mise en mémoire tampon interne (qui correspond généralement à quelques centaines d'échantillons). Elle ne s'applique pas échantillon par échantillon. Vous pouvez l'utiliser pour les effets.

Ne modifiez pas dynamiquement les taux d'échantillonnage lors du sous-échantillonnage. Lorsque vous modifiez les taux d'échantillonnage après la création d'une piste audio, des différences d'environ 5 à 10 % par rapport au taux d'origine peuvent déclencher un recalcul du filtre lors du sous-échantillonnage (pour supprimer correctement les alias). Cela peut consommer des ressources de calcul et entraîner un clic audible si le filtre est remplacé en temps réel.

Limiter le sous-échantillonnage à 6:1 au maximum

Le sous-échantillonnage est généralement déclenché par des exigences matérielles spécifiques à l'appareil. Lorsque le convertisseur de taux d'échantillonnage est utilisé pour le sous-échantillonnage, essayez de limiter le ratio de sous-échantillonnage à 6:1 au maximum afin d'obtenir une suppression optimale des alias (par exemple, n'utilisez pas un ratio de plus de 48 000 à 8 000 pour le sous-échantillonnage). Les longueurs de filtre s'ajustent au taux de sous-échantillonnage. Toutefois, lorsque les ratios de sous-échantillonnage sont plus élevés, vous sacrifiez une plus grande quantité de bande passante de transition afin d'éviter d'augmenter excessivement la longueur du filtre. Il n'existe pas de problèmes d'alias similaires avec le suréchantillonnage. Notez que certaines parties du pipeline audio peuvent empêcher un sous-échantillonnage supérieur à 2:1.

Si la latence vous préoccupe, évitez le rééchantillonnage

Le rééchantillonnage empêche le titre d'être placé dans le chemin FastMixer, ce qui signifie que la latence est beaucoup plus élevée en raison de l'ajout d'un tampon supplémentaire de grande taille dans le chemin Mixer ordinaire. De plus, il existe un délai implicite par rapport à la longueur du filtre du rééchantillonneur, bien qu'il soit généralement de l'ordre de 1 milliseconde ou moins, ce qui est moins élevé que la mise en mémoire tampon supplémentaire pour le chemin Mixer ordinaire (qui est généralement de 20 millisecondes).

Utilisation du contenu audio à virgule flottante

L'utilisation de nombres à virgule flottante pour représenter des données audio peut améliorer considérablement la qualité audio dans les applications audio hautes performances. Les virgules flottantes offrent les avantages suivants :

  • Plage dynamique étendue
  • Précision constante sur l'ensemble de la plage dynamique
  • Marge plus importante pour éviter le bornement lors de calculs intermédiaires et temporaires

Bien que la virgule flottante puisse améliorer la qualité audio, elle présente certains inconvénients :

  • Les nombres à virgule flottante utilisent davantage de mémoire.
  • Les opérations à virgule flottante utilisent des propriétés inattendues. Par exemple, l'ajout n'est pas associatif.
  • Les calculs à virgule flottante peuvent parfois perdre en précision arithmétique à cause de l'arrondi ou de l'instabilité numérique des algorithmes.
  • L'utilisation de la virgule flottante nécessite une excellente compréhension pour obtenir des résultats précis et reproductibles.

Auparavant, la virtuelle flottante était réputée pour être indisponible ou lente. Cela reste vrai pour les processeurs bas de gamme et intégrés. Toutefois, les processeurs des appareils mobiles modernes disposent désormais de systèmes matériels de gestion des virgules flottantes dont les performances sont similaires (voire supérieures dans certains cas) à celles des entiers. Les processeurs modernes sont également compatibles avec SIMD, ce qui contribue à améliorer davantage les performances.

Bonnes pratiques pour l'audio à virgule flottante

Les bonnes pratiques suivantes vous aident à éviter les problèmes liés aux calculs à virgule flottante :

  • Utilisez la virgule flottante à double précision pour les calculs peu fréquents, tels que le calcul des coefficients de filtrage.
  • Faites attention à l'ordre des opérations.
  • Déclarez des variables explicites pour les valeurs intermédiaires.
  • Utilisez les parenthèses généreusement.
  • Si vous obtenez un résultat NaN ou infini, utilisez la recherche binaire pour déterminer où il a été introduit.

Pour l'audio à virgule flottante, l'encodage du format audio AudioFormat.ENCODING_PCM_FLOAT est utilisé de la même manière que ENCODING_PCM_16_BIT ou ENCODING_PCM_8_BIT pour spécifier les formats de données AudioTrack. La méthode surchargée correspondante AudioTrack.write() utilise un tableau à virgule flottante pour fournir des données.

Kotlin

fun write(
        audioData: FloatArray,
        offsetInFloats: Int,
        sizeInFloats: Int,
        writeMode: Int
): Int

Java

public int write(float[] audioData,
        int offsetInFloats,
        int sizeInFloats,
        int writeMode)

Pour plus d'informations

Cette section présente d'autres ressources sur l'échantillonnage et la virgule flottante.

Échantillonnage

Taux d'échantillonnage

Rééchantillonnage

La controverse entre la profondeur de bits élevée et les kHz élevés

Virgule flottante

Les pages Wikipédia suivantes sont utiles pour comprendre le contenu audio à virgule flottante :

L'article suivant fournit des informations sur les aspects de la virgule flottante qui ont un impact direct sur les concepteurs de systèmes informatiques :