执行“uint8x8x4_t - 128”然后将其除以 2

Posted

技术标签:

【中文标题】执行“uint8x8x4_t - 128”然后将其除以 2【英文标题】:Doing "uint8x8x4_t - 128" then divising this by 2 【发布时间】:2013-06-25 03:31:51 【问题描述】:

对于如何在特定情况下通过 Neon 上的标量实现除法,我有些困惑。

在 c++ 上下文中,我使用非常基本的算法实现了对比效果:

if (currentEffect == "contrast_with_cpp")

    r += ((r - 128) / 2);
    g += ((g - 128) / 2);
    b += ((b - 128) / 2);
   

我想将此算法移植到 neon 内部函数。

我已经尝试过,但我对这种方法完全是新手,我无法在 Visual Studio 中调试此代码。它在启动时编译并集成到 Windows Phone 应用程序中。

if (currentEffect == "contrast_with_neon") /* Experimental, not working *

    // To test
    copy_rgb = rgb;

    // Substract 128 from the copy, prevent it should be a signed variable

?

    // Get half value from copy and put it in another copy

    uint8x8x4_t otherCopy = interleaved;
    otherCopy.val[2] = vmul_n_f32(copy_rgb.val[2], 0.5);
    otherCopy.val[1] = vmul_n_f32(copy_rgb.val[1], 0.5);
    otherCopy.val[0] = vmul_n_f32(copy_rgb.val[0], 0.5);

    // Add it to the first copy

    copy_rgb.val[2] = vadd_u8(copy_rgb.val[2], otherCopy.val[2]);
    copy_rgb.val[1] = vadd_u8(copy_rgb.val[2], otherCopy.val[1]);
    copy_rgb.val[0] = vadd_u8(copy_rgb.val[2], otherCopy.val[0]);       

    rgb = copy_rgb;

这可以使用内在函数实现吗?

[编辑] 我猜颜色数据结构类似于this

【问题讨论】:

【参考方案1】:

停止在内在函数上浪费时间。这真的很痛苦,尤其是使用 gcc。

在汇编中试试这个:

vmov.i16 qMdeian, #128 // put this line outside of loop
// -----------------------------------------------

vmovl.u8 qRed, dRed
vmovl.u8 qGrn, dGrn
vmovl.u8 qBlu, dBlu

vsub.s16 qRedTemp, qRed, qMedian
vsub.s16 qGrnTemp, qGrn, qMedian
vsub.s16 qBluTemp, qBlu, qMedian

vshr.s16 qRedTemp, #2
vshr.s16 qGrnTemp, #2
vshr.s16 qBluTemp, #2

vadd.s16 qRed, qRedTemp
vadd.s16 qGrn, qGrnTemp
vadd.s16 qBlu, qBluTemp

vqmovun.s16 dRed, qRed
vqmovun.s16 dGrn, qGrn
vqmovun.s16 dBlu, qBlu

如果确实在 255 处饱和,并且任何负值都将变为零,我认为这是有意的。

PS : 你用 float 做什么?

【讨论】:

哦,谢谢你的建议。但是我猜执行时间速度会有所不同吗?在我只使用 128 位霓虹灯操作的情况下,我目前以 15 fps 的速度工作。 普通 C++ 以 8-9 fps 的速度下降。 关于浮点数,它只是随机放置一个可以无错误编译的强制转换,而不是实际代码,因为我应该乘以一个字节然后>>右移。

以上是关于执行“uint8x8x4_t - 128”然后将其除以 2的主要内容,如果未能解决你的问题,请参考以下文章

如何执行两个 Axios GET 请求,映射结果然后将其推送到数组?

如何在 MapView 上点击然后将其传递给默认手势识别器?

Android - 压缩位图,然后将其保存到SDCARD的活动结果中

一个线程执行多个进程

如何在 Maven 中创建校验和,然后将其输出到文本文件?

确保 locationManager 已完成然后执行请求