2

今、私は改善したいコードを持っています。srcデータのデータ型はbyteです。floatを使用して計算し、結果をバイトに格納したいと思います。しかし、BYTEとfloatの間でデータのデータ型を変換する方法がわかりません。私はAndroidNDKで開発しています。私が改善したいC++コードは次のとおりです。

void DoEffect(BYTE *pSrc, float rat){
//image data:BGRA
float red, green, blue;
red = pSrc[RED_CHANNEL] * rat;
green = pSrc[GREEN_CHANNEL] * rat;
blue = pSrc[BLUE_CHANNEL] * rat;

//  some step to calculate the result;
//  red = ...
//  ...
//

pSrc[RED_CHANNEL] = (BYTE)red;
pSrc[GREEN_CHANNEL] = (BYTE)green;
pSrc[BLUE_CHANNEL] = (BYTE)blue;

}

と私のネオンアセンブリコード:

void DoEffect_neon_asm(BYTE *pSrc, float rat){
__asm__ __volatile__(
        "vld4.8     {d0-d3},[%[src]]    \n"
        "vdupq.32   {d4, d5}, [%[rat]]  \n"
        "# convert src data to float?       \n"
        "code: convert byte to float        \n"
        "# calculate result         \n"
        "..                 \n"
        "# convert result to byte       \n"
        "code: convert float to byte        \n"
        :[src]"r"(pSrc), [rat]"r"(rat)
);

}

私の問題は、「neon asmcode」にリストされている「code:convert byte tofloat」と「code:convertfloattobyte」のコーディング方法です。

4

1 に答える 1

3

バイトをfloatに変換するのはかなり簡単です。以下のコードは、バイトの1つのレジスタに対してこれを実行します。

"vmovl.u8       q3, d2                      \n\t"   //Expand to 16-bit
"vmovl.u16      q10, d6                     \n\t"   //Expand to 32-bit
"vmovl.u16      q11, d7                     \n\t"
"vcvt.f32.u32   q10, q10                    \n\t"   //Convert to float
"vcvt.f32.u32   q11, q11                    \n\t"

バイトに戻すことは、ほぼ正確に逆のプロセスです。代わりにvcvt.u32.f32とを使用してください。vmovn

また、NEONを初めて使用する場合は、ドキュメントをよく読むことをお勧めします。指示を理解するのに良い方法です。

于 2013-01-24T16:32:30.120 に答える