有没有办法强制PMULHRSW将0x8000视为1.0而不是-1.0?

Ale*_*lex 5 assembly sse fixed-point image-processing

要处理8位像素,在不丢失信息的情况下执行伽马校正等操作,我们通常会对值进行上采样,以16位或其他方式工作,然后将它们下采样到8位.

现在,这对我来说是一个新的领域,请原谅不正确的术语等.

根据我的需要,我选择在"非标准"Q15中工作,其中我只使用范围的上半部分(0.0-1.0),而0x8000代表1.0而不是-1.0.这使得用C计算事物变得更加容易.

但我遇到了SSSE3的问题.它有PMULHRSW指令乘以Q15数字,但它使用Q15的"标准"范围是[-1,1-2 - 19],所以乘以(我的)0x8000(1.0)乘以0x4000(0.5)给出0xC000( - 0.5),因为它认为0x8000是-1.这很烦人.

我究竟做错了什么?我应该将像素值保持在0000-7FFF范围内吗?难道这种失败的目的是它是一种定点格式吗?有没有解决的办法?也许有些诡计?

在Q15上是否有某种明确的论文讨论了所有这些?

Mar*_*son 3

就我个人而言,我会选择将最大值限制为 0x7FFF(~0.99something)的解决方案。

  • 您不必费尽心思让处理器按照您希望的方式工作
  • 您不必花费很长时间来记录“奇怪”代码的来龙去脉,因为超过 0-0x7FFF 的操作将立即被代码的读者识别 - Q 格式被理解为(根据我的经验)运行从-1.0+1.0-one lsb。否则,算术运算不会那么顺利,因为 1 lsb 的值在 0 的每一侧都不同!

除非你能想象自己成功地向一群争论性的代码审查者争论,额外的一点对算法的运行至关重要,而不仅仅是“性能的最后 0.01%”,坚持使用每个人都能理解的代码,以及映射的代码到您可用的硬件。


或者,重新安排之前的操作,使像素全部变成原来的负片。或者执行以下操作以获取您之前发送的内容的负数。然后使用Q15 格式的从-1.0到 的值。0.0