为了处理 8 位像素,在不丢失信息的情况下进行伽马校正等操作,我们通常对值进行上采样,以 16 位或其他方式工作,然后将它们下采样到 8 位。
现在,这对我来说是一个新领域,所以请原谅不正确的术语等。
出于我的需要,我选择在“非标准”Q15 中工作,我只使用范围的上半部分 (0.0-1.0),并且 0x8000 代表 1.0 而不是 -1.0。这使得在 C 中计算事物变得更加容易。
但是我遇到了SSSE3的问题。它具有将 Q15 数字相乘的 PMULHRSW 指令,但它使用 Q15 的“标准”范围是 [-1,1-2⁻¹⁵],因此将(我的)0x8000(1.0)乘以 0x4000(0.5)得到 0xC000(- 0.5),因为它认为 0x8000 是 -1。这很烦人。
我究竟做错了什么?我应该将像素值保持在 0000-7FFF 范围内吗?这不是违背了它作为定点格式的目的吗?有没有解决的办法?也许有什么技巧?
Q15 是否有某种明确的论文来讨论这一切?