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

标签 image-processing assembly sse fixed-point

为了处理 8 位像素,为了在不丢失信息的情况下进行 Gamma 校正,我们通常对值进行上采样,以 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 的权威性论文讨论了所有这些?

最佳答案

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

  • 您不必费力让处理器按照您希望的方式工作
  • 您不必花很长时间记录“奇怪”代码的来龙去脉,因为在 0-0x7FFF 范围内操作将立即被您的代码读者识别 - Q-format被理解(根据我的经验)从 -1.0 运行至 +1.0-one lsb .否则,算术不会很好地进行,因为 1 lsb 的值在 0 的每一侧都不同!

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

    或者,重新安排您之前的操作,使所有像素都成为您最初拥有的负数。或者下面的操作来接受你之前发送的内容的否定。然后使用来自 -1.0 的值至 0.0以 Q15 格式。

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

    相关文章:

    java - 查找图像中重复的对象

    arm - 从 SSE 到 ARM Neon 的指令转换

    linux - 为 x64 系统调用编译的 x32 ASM(使用 NASM)不起作用

    assembly - XCHG 在 8086 处理器中是如何实现的?

    c - 如何在 SSE/AVX 中使用融合乘加 (FMA) 指令

    c - SIMD (AVX) 比较

    python - 检测像素是否为红色

    python - 想要将彩色图像附加到列表中并使用 OpenCV 将该列表转换为灰度

    java - Android flood-fill算法

    c - 将参数从 C 传递到程序集