Skip to main content
Neste tópico, vamos explicar o uso da redução de resposta ao impulso como parte da execução de convolução em dispositivos XBOX Series X usando o XDSP. Esse mecanismo foi desenvolvido como um método flexível para que os desenvolvedores façam as concessões adequadas entre uma pequena perda na qualidade do áudio e grandes ganhos de desempenho, ainda aproveitando a aceleração de hardware que o XDSP oferece.

Ferramenta de exemplo e código-fonte

A ferramenta de transformação de IR incluída para ajudar você a transformar suas respostas ao impulso do domínio do tempo para o domínio da frequência foi atualizada para incluir suporte ao mecanismo de redução. A ferramenta pode ser configurada para gerar essa tabela passando um parâmetro de linha de comando para especificar a qualidade (entre 0.0 e 99.9, em que 0.0 significa que 99,9% da energia da resposta ao impulso será retida e 99.9 significa que 99,99% da potência será retida). Com isso habilitado, o XDSP não processará as amostras de potência extremamente baixa da resposta ao impulso (valores zero ou próximos de zero) para melhorar a velocidade de processamento. O código para definir e gravar a tabela de redução está em uma classe chamada ImpulseResponseReduction no arquivo main.cpp, e a função que grava a tabela de redução é ImpulseResponseReduction::SetReductionBlock. Ela pode ser personalizada para atender às suas necessidades, desde que o formato da tabela de redução seja o especificado abaixo, permitindo que você especifique quantas amostras deseja processar para cada bloco de resposta ao impulso.

Formato da tabela de redução

O mecanismo de redução de resposta ao impulso funciona com base em um bloco de redução adicionado ao final do buffer de resposta ao impulso no domínio da frequência. O bloco de redução tem o tamanho de um bloco de resposta ao impulso e começa com uma assinatura de 4 bytes igual a 0xFFFFACE1, seguida por até 15 entradas de estruturas de 4 bytes. O restante do bloco deve ser preenchido com zeros. A estrutura de 4 bytes contém dois valores sem sinal de 16 bits: a frequência de corte e o índice do bloco. Veja um exemplo abaixo:
Este exemplo está codificado em little-endian e corresponde à tabela abaixo: Quando o XDSP processa um bloco de redução como esse, ocorre o seguinte:
  • O hardware processará o bloco de resposta ao impulso completo até o bloco 8 (ou seja, os primeiros 8 blocos, já que os blocos são indexados a partir de 0).
  • Do bloco 8 até o bloco 86, o hardware processará apenas as primeiras 384 amostras de cada bloco, descartando o restante das amostras, pois considera-se que elas têm um impacto muito pequeno na saída.
  • Do bloco 86 até o bloco 102, o hardware processará apenas as primeiras 128 amostras de cada bloco, descartando o restante das amostras.
  • Do bloco 102 até o bloco 159, o hardware processará apenas as primeiras 16 amostras de cada bloco, descartando o restante das amostras. Como a resposta ao impulso neste exemplo tem apenas 158 blocos, esta representa a última entrada válida na tabela.
  • O hardware só considera a próxima entrada válida se ela tiver um índice de bloco maior do que a entrada atual; portanto, o restante da tabela é preenchido com a última entrada válida para indicar que essas entradas são inválidas e devem ser ignoradas.
Esse esquema permite que o hardware execute menos processamento e, assim, conclua a operação solicitada mais rapidamente, além de oferecer flexibilidade para que os desenvolvedores criem seus próprios algoritmos para otimizar suas respostas ao impulso.

Observações

Há vários itens a serem observados ao implementar um algoritmo personalizado para gerar uma tabela de redução de impulso válida:
  • O índice do bloco deve ter um valor de pelo menos 8; em outras palavras, os primeiros 8 blocos da resposta ao impulso nunca devem ser reduzidos.
  • A frequência de corte deve ser um múltiplo de 16 e deve ser de pelo menos 16.
  • A frequência de corte não deve exceder o tamanho do bloco; isso seria uma entrada inválida.
  • O bloco de redução de resposta ao impulso deve ter o tamanho de um bloco completo de resposta ao impulso. Espera-se que o espaço após a tabela seja preenchido com zeros.
  • Ao usar uma resposta ao impulso estéreo com o mecanismo de redução, espera-se um bloco de redução no final de cada canal.
  • Lembre-se de considerar o espaço extra do bloco de redução de resposta ao impulso ao especificar o parâmetro impulseResponseLengthInFloats em XDspActivationParameters.

Documentação de referência da API

Confira também

Visão geral do XDSP
Last modified on October 6, 2026