【发布时间】:2012-08-29 15:14:17
【问题描述】:
为了处理 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 是否有某种明确的论文讨论了所有这些?
【问题讨论】:
-
好吧,你总是可以抛出一个特殊情况来处理 0x8000.. 除此之外,我不知道。
-
我知道,但是在紧密的内循环中的特殊情况会扼杀速度优势,而且同时为 4 个通道执行此操作更麻烦。
-
它可能仍然比 C 代码快。它只需要一个转变和一个 pblendvb。或者总是与 0x7FFF 进行 AND 真的是正确的吗?
-
我也遇到过这个问题,我同意这很烦人。这是 AltiVec 做对但 SSE 损坏 (IMNVHO) 的众多案例之一。
-
我在加权平均方案中成功使用了预乘值。左侧有在
0到0x7fff范围内的值,表示从0.0到1.0的权重(精确),另一侧是要加权的值,它们是任意数字一般低于1.0。我将这些值乘以 32768.0/32767.0 的因子(这基本上相当于将每个大于 2^14 的值加 1),实际上由于 PMULHRSW 所做的舍入,整个范围内的精度没有损失。跨度>
标签: image-processing assembly sse fixed-point