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 :
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.
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.
