> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Visão geral da redução de resposta ao impulso do XDSP

> Visão geral da redução de resposta ao impulso do XDSP

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:

```
E1 AC FF FF 80 01 08 00 80 00 56 00 10 00 66 00 10 00 9F 00 10 00 9F 00 10 00 9F 00 10 00 9F 00 10 00 9F 00 10 00 9F 00 10 00 9F 00 10 00 9F 00 10 00 9F 00 10 00 9F 00 10 00 9F 00 10 00 9F 00
```

Este exemplo está codificado em little-endian e corresponde à tabela abaixo:

| Frequência de corte | Índice do bloco |
| - | - |
| 384 | 8 |
| 128 | 86 |
| 16 | 102 |
| 16 | 159 |
| 16 | 159 |
| 16 | 159 |
| 16 | 159 |
| 16 | 159 |
| 16 | 159 |
| 16 | 159 |
| 16 | 159 |
| 16 | 159 |
| 16 | 159 |
| 16 | 159 |
| 16 | 159 |

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](/pt-BR/reference/audio/xdspaudio/structs/xdspactivationparameters).

## Documentação de referência da API

* [XDspAudio (conteúdo da API)](/pt-BR/reference/audio/xdspaudio/xdspaudio_members)
  * Estruturas
    * [XDspActivationParameters](/pt-BR/reference/audio/xdspaudio/structs/xdspactivationparameters)

## Confira também

[Visão geral do XDSP](/pt-BR/build/console-features/audio/overviews/xdsp-overview)


## Related topics

- [Visão geral do Unity](/pt-BR/paths/unity/overview.md)
- [Visão geral de Godot e engines da comunidade](/pt-BR/paths/community-engines/overview.md)
- [Visão geral de acessibilidade no GDK](/pt-BR/build/game-principles/accessibility/accessibility-overview.md)
- [Visão geral do XBOX Series X|S](/pt-BR/paths/series-xs/overview.md)
- [Visão geral de portabilidade](/pt-BR/paths/porting/overview.md)
