【图像处理】NEON编码4 - 左右移位

原文地址

本文将介绍NEON提供的移位运算,并显示如何利用移位运算在常用颜色深度之间转换影像数据。本系列前期已发布的文章包括:第1部分:加载与存储,第2部分:余数的处理,第3部分:矩阵乘法。

向量移位

NEON上的移位与标量ARM编码中可能用到的移位非常相似,即每个向量元素的位数均向左或向右移位,出现在每个元素左侧或右侧的位将被删除;它们不能移位至相邻的元素。

这里写图片描述

带符号元素的向量上发生的右移位由指令附加的类型指定,并会将符号扩展至每一个元素。这与ARM编码中可能用到的算术移位相同。应用到无符号向量的移位不会发生符号扩展。

移位与插入

NEON也支持通过插入产生移位,使两个不同向量的位相结合。例如,左移位与插入(VSLI)可使源向量的每一个元素均向左移位。每个元素右侧新插入的位就是目标向量中的对应位。

这里写图片描述

移位与计算

最后,NEON还支持向量元素向右移位,并将结果计入到另一个向量中。这种方法对于先在高精度条件下进行临时计算,然后再将结果与低精度计算器相结合的情况非常有用。

指令修改器

每个移位指令都能拥有一个或多个修改器。这些修改器并不改变移位运算本身,而是通过调整输入值或输出值,消除偏差或饱和状况,保持一定的范围。共有五种移位修改器:

  • 舍位修改器 (Rounding),以R前缀表示,可以纠正右移时舍位导致的偏差。
  • 窄修改器(Narrow),以N后缀表示,可以让结果中每个元素的位数减半。它代表Q(128位)源和D(64位)目标寄存器。
  • 长修改器(Long),以L后缀表示,可以让结果中每个元素的位数加倍。它代表D源和Q目标寄存器。
  • 饱和修改器(Saturating),以Q前缀表示,可以在最大和最小可表范围内设置每个结果元素,前提是结果未超出该范围。向量的位数和符号类型可用于确定饱和范围。
  • 无符号饱和修改器 (Unsigned Saturating),以Q前缀和U后缀表示,与饱和修改器类似,但在进行带符号或无符号输入时,结果将在无符号范围内表现为饱和。

这些修改器的部分组合并未表现出有用的运算,因此NEON也没有提供相应指令。例如,饱和右移位(应称为VQSHR)其实就毫无必要,因为右移位只会让结果变得更小,因而值根本无法超出有效范围。

可用移位表

NEON提供的所有移位指令均在下表中列出。它们根据先前提到的修改器进行排列。如果你还是不太确定修改器各个字母代表的含义,请利用下表选择需要的指令。

这里写图片描述

示例:转换颜色深度

颜色深度之间的转换是图形处理中经常需要的运算。通常,输入或输出数据都是RGB565 16位颜色格式,但RGB888格式的数据处理起来更为方便。对于NEON而言尤其如此,因为它无法为RGB565这样的数据类型提供本机支持。

这里写图片描述

但是,NEON仍然可以有效地处理RGB565数据,上文中介绍的向量移位便提供了处理方法。

从565到888

首先,我们来看如何将RGB565转换为RGB888。假设寄存器q0中有8个16位像素,我们想要在d2、d3和d4这三个寄存器中将红色、绿色和蓝色分离成8位的元素。

这里写图片描述

每个指令的效果都在上面备注中做了描述,但总而言之,每个通道上执行的运算为:
利用移位推掉元素任意一端的位数,清除相邻通道的颜色数据。
使用第二次移位将颜色数据放置到每个元素最重要的位上,并缩短位数将元素大小从16位减至8位。
请注意在这个顺序中使用元素大小来确定8位和16位元素的位置,以进行部分掩码运算。

一个小问题

你可能会注意到,如果使用上述代码转换到RGB888格式,白色显得不够白。这是因为,对于每个通道而言,最低的2或3位是零,而不是1;白色在RGB565中表示为(0x1F, 0x3F, 0x1F),而在RGB888中,却变成了 (0xF8, 0xFC, 0xF8)。这可以通过移位来解决,将部分最重要的位插入到低位。

从888到565

现在,我们来看反向运算,即从RGB888转换为RGB565。这里,我们假设RGB888数据为上述代码产生的格式;在d0、d1和d2这三个寄存器上,每个寄存器均包含每种颜色的8个元素。结果将存储为q2格式的8个16位RGB565元素。

这里写图片描述

同样,每个指令的详细说明在备注中列出,但总而言之,对于每个通道而言:

  • 将每个元素的长度扩展至16位,并将颜色数据移至最重要的位上。
  • 使用插入右移位,将每个颜色通道放置到结果寄存器中。

结论

NEON提供的强大的移位指令范围让你能够:

  • 利用舍入和饱和,通过二次幂快速进行向量的除法和乘法运算。
  • 通过移位将一个向量位复制到另一个向量位。
  • 在高精度条件下进行临时计算,并在低精度条件下计算结果。

Martyn是处理器领域的资深软件工程师,已在ARM工作了近10年。他主要负责改善ARM平台上软件的性能和体验。他对使用汇编语言和SIMD实现软件优化非常感兴趣,尤其是在图形和多媒体领域。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整下载http://vdisk.weibo.com/s/nfF_Q ===================================================================2013-1-1 自动对输出的EXE动画文件进行加密处理,这是一个重要升级,意味着只有自己 的加密狗才可以打开/编辑自己设计的EXE,而别人只能播放EXE而不能打开EXE, 杜绝了骗图、偷图等盗版行为,并切底阻止他人非法提取自己的TOL、图片及动画效果. ===================================================================2012-09-01 1、AVI动画加入MP3音乐功能 2、增加1024X16编译系统 3、NeonPlay 中的程序编辑中块操作中增加直接删除节拍功能 4、NeonPlay 图元移动中增加图元再制次数选项 5、NeonEdit 增加单线芯片的1024X16控制器的输出修改 6、NeonPlay 中修改属性设置过行列数后,再次显示属性时显示行列数都是1的错误 7、NeonPlay 修改图元分割时默认是图元分割 8、NeonPlay 修改花样编辑自动花样V型花样的V型移动和V型翻转的从下到上,从右到左的错误 9、NeonEdit 修改自动花样下V型花样V型移动和V型翻转中从右到左,从下到下在空节 拍生成第一节拍出错的错误 ===================================================================2012-07-03 增加功能 1、NeonPlay支持AVI动画文件输出,播放更通用,同时最大限度保护了设计者的版权 2、修改NeonPlay中动画大高度遮罩时播放演示错误 3、修改NeonEdit编译中单线芯片中2048点控制器线路定义的错误 4、修正编译系统的加密功能 5、升级DMX512的编译系统 6、输出bin文件功能普通用户受限制 ===================================================================2012-05-13 增加功能 1、Neonplay 网格设计区工具菜单下增加Flash/SWF转网格[TOL]功能 2、NeonEdit节拍编辑菜单下增加Flash/SWF转网格[TOL/COT]功能 ===================================================================2012-04-06 1、升级软件保护机制 2、增加编译系统:2048x16 3、修改 NeonPlay 菜单下打开不起作用的错误 4、修正 NeonEdit 修改调色板后面有空白的错误 5、修正工具栏里的节点编辑不起作用---注意:只能编辑贝兹曲线和折 线,每次只能编辑一个图元:一个贝兹曲线或者一个折线 ===================================================================2012-03-10 1、采集器2012增加了保存256等级的cot文件功能,单次最大采集5万帧. 采集器2012需要加密狗才能运行 2、修正NeonEdit另存cot文件的错误 3、NeonPlay 修改了删除遮罩时撤销和返回的错误 4、Neonplay 修改自由变换删除后,再撤销的错误 5、NeonPlay 修改了png遮罩变反 6、点击版本号或者点击NeonPlay的<>菜单可显示最近更新历史 ===================================================================2012-02-28 该版本为重要升级,新版本支持256等级的网格文件和色盘文件, 新256等级网格文件采用.COT扩展名保存,原有的128等级网格 文件.TOL继续保持兼容. 1,增加.COT的256等级网格文件 2,色盘增加256等级颜色 3,色盘增加全选和七种颜色的自定义 4,修正自由变换出错、遮罩删除、图片遮罩反 5,修正与杀毒软件的兼容性 ===================================================================2011-12-08 1,增加导入大图片文件功能,在<>菜单里的最下面 2,增加了 png 图片转成遮罩层 3,平铺后任意变形能否增加弧度调整功能。 如果建筑有弧度需要分解后分跟调整很麻烦!解决方法是 用分割成线段组,不要把它们打断 ===================================================================2011-10-31 增加单线1024X8的编译 ===================================================================2011-10-18 增加DMX512系列控制器的编译 1, 170点X8通道 2, 512点X8通道 3,1024点X8通道 ===================================================================2011-07-22 1,解决输出的EXE被当病毒杀 2,升级单线芯片的编译系统 ===================================================================2011-07-07 1.动画像素提升到:1024*768 2.可以支持输出静态图片功能,客户可以打印静态的效果。 3.解决问题: 输出动画后,画面和制作界面大小不一致,自动裁切下面的,动画图像很靠下。 4.解决问题: 画图界面按空格画图的时候拖动画面的时候是反方向,和ps也是相反的。 5.升级了 PLAY2006 播放器 升级到 PLAY2011
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值