Skip to main content
Dans cette rubrique, nous allons examiner l’utilisation de la réduction de la réponse impulsionnelle dans le cadre de la convolution sur les appareils XBOX Series X à l’aide de XDSP. Ce mécanisme a été développé pour offrir aux développeurs une méthode flexible permettant de trouver le bon compromis entre une légère perte de qualité audio et des gains de performances importants, tout en continuant à tirer parti de l’accélération matérielle offerte par XDSP.

Exemple d’outil et code source

L’outil de transformation de réponse impulsionnelle fourni pour vous aider à transformer vos réponses impulsionnelles du domaine temporel vers le domaine fréquentiel a été mis à jour pour prendre en charge le mécanisme de réduction. L’outil peut être configuré pour générer cette table en lui passant un paramètre de ligne de commande qui spécifie la qualité (entre 0.0 et 99.9, où 0.0 signifie que 99,9 % de l’énergie de la réponse impulsionnelle sera conservée, et 99.9 signifie que 99,99 % de la puissance sera conservée). Lorsque cette option est activée, XDSP ne traite pas les échantillons de très faible puissance de la réponse impulsionnelle (valeurs nulles ou quasi nulles) afin d’améliorer la vitesse de traitement. Le code permettant de définir et d’écrire la table de réduction se trouve dans une classe appelée ImpulseResponseReduction dans le fichier main.cpp, et la fonction qui écrit la table de réduction est ImpulseResponseReduction::SetReductionBlock. Celle-ci peut être personnalisée selon vos besoins, à condition que le format de la table de réduction soit conforme à ce qui est spécifié ci-dessous ; vous pouvez ainsi spécifier le nombre d’échantillons à traiter pour chaque bloc de réponse impulsionnelle.

Format de la table de réduction

Le mécanisme de réduction de la réponse impulsionnelle repose sur un bloc de réduction ajouté à la fin de la mémoire tampon de réponse impulsionnelle dans le domaine fréquentiel. Le bloc de réduction a la taille d’un bloc de réponse impulsionnelle et commence par une signature de 4 octets égale à 0xFFFFACE1, suivie de 15 entrées au maximum de structures de 4 octets. Le reste du bloc doit être rempli de 0. La structure de 4 octets contient deux valeurs non signées de 16 bits : la fréquence de coupure et l’index de bloc. En voici un exemple :
Cet exemple est encodé en little-endian et correspond à la table ci-dessous : Lorsque XDSP traite un tel bloc de réduction, voici ce qui se produit :
  • Le matériel traite intégralement les blocs de réponse impulsionnelle jusqu’au bloc 8 (c’est-à-dire les 8 premiers blocs, les blocs étant indexés à partir de 0).
  • Du bloc 8 au bloc 86, le matériel ne traite que les 384 premiers échantillons de chaque bloc et ignore les autres échantillons, considérés comme ayant très peu d’impact sur la sortie.
  • Du bloc 86 au bloc 102, le matériel ne traite que les 128 premiers échantillons de chaque bloc et ignore les autres échantillons.
  • Du bloc 102 au bloc 159, le matériel ne traite que les 16 premiers échantillons de chaque bloc et ignore les autres échantillons. Comme la réponse impulsionnelle de cet exemple ne comporte que 158 blocs, il s’agit de la dernière entrée valide de la table.
  • Le matériel ne considère l’entrée suivante comme valide que si son index de bloc est supérieur à celui de l’entrée actuelle ; le reste de la table est donc rempli avec la dernière entrée valide pour indiquer que ces entrées ne sont pas valides et doivent être ignorées.
Ce schéma permet au matériel d’effectuer moins de traitements et donc d’exécuter plus rapidement l’opération demandée, tout en offrant aux développeurs la flexibilité nécessaire pour créer leurs propres algorithmes d’optimisation de leurs réponses impulsionnelles.

Remarques

Plusieurs points sont à prendre en compte lors de l’implémentation d’un algorithme personnalisé pour générer une table de réduction de réponse impulsionnelle valide :
  • L’index de bloc doit avoir une valeur d’au moins 8 ; autrement dit, les 8 premiers blocs de la réponse impulsionnelle ne doivent jamais être réduits.
  • La fréquence de coupure doit être un multiple de 16 et doit être au moins égale à 16.
  • La fréquence de coupure ne doit pas dépasser la taille du bloc ; une telle entrée ne serait pas valide.
  • Le bloc de réduction de la réponse impulsionnelle doit avoir la taille d’un bloc de réponse impulsionnelle complet. L’espace situé après la table doit être rempli de 0.
  • Lors de l’utilisation d’une réponse impulsionnelle stéréo avec le mécanisme de réduction, un bloc de réduction est attendu à la fin de chaque canal.
  • N’oubliez pas de tenir compte de l’espace supplémentaire du bloc de réduction de la réponse impulsionnelle lorsque vous spécifiez le paramètre impulseResponseLengthInFloats dans XDspActivationParameters.

Documentation de référence de l’API

Voir aussi

Vue d’ensemble de XDSP
Last modified on October 6, 2026