我正在开发一种图像处理算法,希望通过使用NEON进行优化。该算法包括将每个(RGBA,8位)像素乘以某个权重,进行一些加法,最后转换回uint8_t值。
我遇到的第一个问题是如何有效地将单个uint8_t像素加载并转换为NEON的float32x4_t。我在参考文献中搜索了适合的转换方法,但没有找到合适的,所以我使用了这段丑陋的代码:
const uint8_t* psrc = ...; // pointer to image data
float rgba[4];
for (int c = 0; c < 4; ++c) {
rgba[c] = *psrc++;
}
float32x4_t srcpix = vld1q_f32(rgba);
有没有更简洁的方法来实现这个功能?
编辑: 我想出了以下代码,但仍感觉有些繁琐:
uint8x8_t srcu8 = vld1_u8(psrc);
uint16x8_t srcu16x8 = vmovl_u8(srcu8);
uint16x4_t srcu16x4 = vget_low_u16(srcu16x8);
uint32x4_t srcu32x4 = vmovl_u16(srcu16x4);
srcpix = vcvtq_f32_u32(srcu32x4);