Skip to main content
Dans cette rubrique, nous verrons comment utiliser la réduction de la réponse impulsionnelle dans le cadre d’une convolution effectuée sur les appareils XBOX Series X à l’aide de XDSP. Ce mécanisme a été conçu pour offrir aux développeurs une méthode souple leur permettant de faire les compromis appropriés entre une légère perte de qualité audio et des gains de performance importants, tout en profitant de l’accélération matérielle qu’offre XDSP.

Exemple d’outil et code source

L’outil de transformation de réponse impulsionnelle (IR) fourni pour vous aider à transformer vos réponses impulsionnelles du domaine temporel au 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 presque nulles) afin d’améliorer la vitesse de traitement. Le code qui définit et écrit 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. Vous pouvez la personnaliser selon vos besoins, à condition que le format de la table de réduction soit conforme à ce qui est spécifié ci-dessous, ce qui vous permet de préciser le nombre d’échantillons que vous souhaitez traiter pour chaque bloc de la 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 la 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 d’un maximum de 15 entrées sous forme de structures de 4 octets. Le reste du bloc doit être rempli de zéros. La structure de 4 octets contient deux valeurs non signées de 16 bits : la fréquence de coupure et l’index du bloc. Voici un exemple :
Cet exemple est encodé en little-endian et correspond à la table suivante : Lorsque XDSP traite un tel bloc de réduction, voici ce qui se produit :
  • Le matériel traite le bloc de réponse impulsionnelle complet jusqu’au bloc 8 (c’est-à-dire les 8 premiers blocs, puisque les blocs sont indexés à partir de 0).
  • Du bloc 8 jusqu’au bloc 86, le matériel ne traite que les 384 premiers échantillons de chaque bloc et ignore le reste des échantillons, car on considère qu’ils ont très peu d’incidence sur la sortie.
  • Du bloc 86 jusqu’au bloc 102, le matériel ne traite que les 128 premiers échantillons de chaque bloc et ignore le reste des échantillons.
  • Du bloc 102 jusqu’au bloc 159, le matériel ne traite que les 16 premiers échantillons de chaque bloc et ignore le reste des échantillons. Comme la réponse impulsionnelle de cet exemple ne compte 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; par conséquent, le reste de la table est rempli avec la dernière entrée valide pour indiquer que ces entrées sont non valides et doivent être ignorées.
Ce schéma permet au matériel d’effectuer moins de traitement et donc d’exécuter plus rapidement l’opération demandée, tout en offrant aux développeurs la souplesse nécessaire pour créer leurs propres algorithmes d’optimisation de leurs réponses impulsionnelles.

Remarques

Plusieurs éléments 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 du 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 d’au moins 16.
  • La fréquence de coupure ne doit pas dépasser la taille du bloc; il s’agirait sinon d’une entrée non 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 qui suit la table doit être rempli de zéros.
  • Lorsque vous utilisez 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