为了处理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)的解决方案。
-1.0
到+1.0-one lsb
。否则,该算法的效果会不佳,因为0的每一侧1 lsb的值都不同! 除非您能想象自己成功地对一组有争议的代码审阅者争论,否则额外的费用对算法的操作至关重要,而不仅仅是“性能的最后0.01%”,坚持使用每个人都可以理解的代码,以及映射到您可用的硬件。
或者,重新安排您以前的操作,以使所有像素全部变为您原来的像素。或进行以下操作以排除先前发送的内容的负面影响。然后使用Q15格式的
-1.0
到0.0
的值。关于image-processing - 有没有办法强制PMULHRSW将0x8000视为1.0而不是-1.0?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12181740/