Skip to main content
在本主题中,我们将逐步介绍在 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)。 示例如下:
该示例采用小端字节序,可解读为下表: 当 XDSP 处理这样的压缩块时会发生以下情况:
  • 硬件将完整处理脉冲响应中直到块 8 的部分(即前 8 个块,索引从 0 开始)。
  • 从块 8 到块 86,硬件仅处理每个块的前 384 个样本,其余样本因被判定对输出影响极小而丢弃。
  • 从块 86 到块 102,硬件仅处理每个块的前 128 个样本,其余样本丢弃。
  • 从块 102 到块 159,硬件仅处理每个块的前 16 个样本,其余样本丢弃。由于本示例的脉冲响应只有 158 个块,这条也是表中最后一条有效条目。
  • 只有当下一条条目的块索引大于当前条目时,硬件才认为它有效;因此表中其余部分都用最后一条有效条目填充,以标示它们无效并将被忽略。
这种方案让硬件可以少做处理,从而更快完成所请求的操作,同时也为开发者提供灵活性,允许他们针对自己的脉冲响应设计自己的优化算法。

备注

在为生成有效的脉冲响应压缩表实现自定义算法时,有以下几点需要注意:
  • 块索引的值必须至少为 8;换句话说,脉冲响应的前 8 个块绝不能被压缩。
  • 截止频率必须是 16 的倍数,且至少为 16。
  • 截止频率不得超过块大小;否则将是一个无效条目。
  • 脉冲响应压缩块必须与一个完整的脉冲响应块同样大小。表以外的空间应填 0。
  • 在使用带压缩机制的立体声脉冲响应时,每个声道的末尾都应包含一个压缩块。
  • 请记得在 XDspActivationParameters 中设置 impulseResponseLengthInFloats 参数时,计入脉冲响应压缩块所占的额外空间。

参考 API 文档

另请参阅

XDSP 概述
最后修改于 2026年8月24日