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

# XDSP 脉冲响应压缩概述

> XDSP 脉冲响应压缩概述

在本主题中，我们将逐步介绍在 XBOX Series X 设备上执行卷积时使用脉冲响应压缩 (impulse response reduction) 的用法。这一机制是作为一种灵活手段而设计的，让开发者能够在音质轻微下降与性能大幅提升之间做出恰当权衡，同时仍能利用 XDSP 所提供的硬件加速能力。

## 示例工具与源代码

用于协助你把时域脉冲响应转换为频域的 IR transform 工具已更新，现在支持该压缩机制。可以通过命令行参数为该工具指定质量（值在 0.0 到 99.9 之间，其中 0.0 表示保留 99.9% 的脉冲响应能量，99.9 表示保留 99.99% 的能量）来生成此表。启用后，XDSP 将不再处理脉冲响应中能量极低的样本（零值或接近零的值），以提升处理速度。

用于设置和写入压缩表的代码位于 main.cpp 文件中的 ImpulseResponseReduction 类，其中写入压缩表的函数为 ImpulseResponseReduction::SetReductionBlock。只要压缩表的格式符合下述规范，你可以对其进行自定义以满足自己的需求，从而指定每个脉冲响应块要处理多少个样本。

## 压缩表格式

脉冲响应压缩机制以在频域脉冲响应缓冲区末尾追加一个压缩块 (reduction block) 为基础。该压缩块大小与一个脉冲响应块相同，开头是 4 字节签名 **0xFFFFACE1**，随后是最多 15 个 4 字节结构条目。块的其余部分应填 0。

每个 4 字节结构包含两个 16 位无符号值：截止频率 (cut-off frequency) 和块索引 (block index)。

示例如下：

```
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
```

该示例采用小端字节序，可解读为下表：

| 截止频率 | 块索引 |
| ---- | --- |
| 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 |

当 XDSP 处理这样的压缩块时会发生以下情况：

* 硬件将完整处理脉冲响应中直到块 8 的部分（即前 8 个块，索引从 0 开始）。
* 从块 8 到块 86，硬件仅处理每个块的前 384 个样本，其余样本因被判定对输出影响极小而丢弃。
* 从块 86 到块 102，硬件仅处理每个块的前 128 个样本，其余样本丢弃。
* 从块 102 到块 159，硬件仅处理每个块的前 16 个样本，其余样本丢弃。由于本示例的脉冲响应只有 158 个块，这条也是表中最后一条有效条目。
* 只有当下一条条目的块索引大于当前条目时，硬件才认为它有效；因此表中其余部分都用最后一条有效条目填充，以标示它们无效并将被忽略。

这种方案让硬件可以少做处理，从而更快完成所请求的操作，同时也为开发者提供灵活性，允许他们针对自己的脉冲响应设计自己的优化算法。

## 备注

在为生成有效的脉冲响应压缩表实现自定义算法时，有以下几点需要注意：

* 块索引的值必须至少为 8；换句话说，脉冲响应的前 8 个块绝不能被压缩。
* 截止频率必须是 16 的倍数，且至少为 16。
* 截止频率不得超过块大小；否则将是一个无效条目。
* 脉冲响应压缩块必须与一个完整的脉冲响应块同样大小。表以外的空间应填 0。
* 在使用带压缩机制的立体声脉冲响应时，每个声道的末尾都应包含一个压缩块。
* 请记得在 [XDspActivationParameters](/reference/audio/xdspaudio/structs/xdspactivationparameters) 中设置 *impulseResponseLengthInFloats* 参数时，计入脉冲响应压缩块所占的额外空间。

## 参考 API 文档

* [XDspAudio (API 内容)](/reference/audio/xdspaudio/xdspaudio_members)
  * Structures
    * [XDspActivationParameters](/reference/audio/xdspaudio/structs/xdspactivationparameters)

## 另请参阅

[XDSP 概述](/build/console-features/audio/overviews/xdsp-overview)


## Related topics

- [XDSP 概述](/zh-CN/build/console-features/audio/overviews/xdsp-overview.md)
- [概述](/zh-CN/build/console-features/audio/overviews/index.md)
- [XDSP 包络概述](/zh-CN/build/console-features/audio/overviews/xdsp-overview-enveloping.md)
- [XDSP audio](/zh-CN/reference/audio/xdspaudio/xdspaudio_members.md)
- [XDspActivationParameters](/zh-CN/reference/audio/xdspaudio/structs/xdspactivationparameters.md)
