为了处理8位像素,进行诸如 Gamma 校正之类的事情而又不丢失信息,我们通常对值进行升采样,以16位或其他方式工作,然后将其降采样为8位。

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

出于我的需要,我选择在“非标准” Q15中工作,其中我仅使用范围的上半部分(0.0-1.0),并且0x8000表示1.0而不是-1.0。这使得在C语言中计算事物变得更加容易。

但是我遇到了SSSE3的问题。它具有PMULHRSW指令,该指令将Q15的数字相乘,但是它使用的Q15的“标准”范围是[-1,1-2…1],因此将(my)0x8000(1.0)乘以0x4000(0.5)得到0xC000(- 0.5),因为它认为0x8000为-1。这很烦人。

我究竟做错了什么?我应该将像素值保持在0000-7FFF范围内吗?难道不是要打败定点格式的目的吗?有没有解决的办法?也许有些把戏?

问题15上是否有某种确定性的论文讨论了所有这些问题?

最佳答案

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

  • 您无需跳过障碍,即可使处理器按您希望的方式工作
  • 您无需花费大量时间来记录“怪异”代码的来龙去脉,因为您的代码读者会立即认识到在0-0x7FFF上进行操作-Q-format被理解为(根据我的经验)可以运行从-1.0+1.0-one lsb。否则,该算法的效果会不佳,因为0的每一侧1 lsb的值都不同!

  • 除非您能想象自己成功地对一组有争议的代码审阅者争论,否则额外的费用对算法的操作至关重要,而不仅仅是“性能的最后0.01%”,坚持使用每个人都可以理解的代码,以及映射到您可用的硬件。

    或者,重新安排您以前的操作,以使所有像素全部变为您原来的像素。或进行以下操作以排除先前发送的内容的负面影响。然后使用Q15格式的-1.00.0的值。

    关于image-processing - 有没有办法强制PMULHRSW将0x8000视为1.0而不是-1.0?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12181740/

    10-11 22:44