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上是否有某种明确的论文讨论了所有这些?
就我个人而言,我会选择将最大值限制为 0x7FFF(~0.99something)的解决方案。
-1.0
到+1.0-one lsb
。否则,算术运算不会那么顺利,因为 1 lsb 的值在 0 的每一侧都不同!除非你能想象自己成功地向一群争论性的代码审查者争论,额外的一点对算法的运行至关重要,而不仅仅是“性能的最后 0.01%”,坚持使用每个人都能理解的代码,以及映射的代码到您可用的硬件。
或者,重新安排之前的操作,使像素全部变成原来的负片。或者执行以下操作以获取您之前发送的内容的负数。然后使用Q15 格式的从-1.0
到 的值。0.0