5

8ビットピクセルを処理するために、情報を失うことなくガンマ補正などを行うには、通常、値をアップサンプリングし、16ビットなどで処理してから、8ビットにダウンサンプリングします。

さて、これは私にとっては少し新しい分野ですので、間違った用語などを許してください。

私のニーズのために、私は「非標準」Q15で作業することを選択しました。ここでは、範囲の上半分(0.0-1.0)のみを使用し、0x8000は-1.0ではなく1.0を表します。これにより、Cでの計算がはるかに簡単になります。

しかし、SSSE3で問題が発生しました。Q15の数値を乗算するPMULHRSW命令がありますが、Q15の「標準」範囲は[-1,1-2⁻¹⁵]であるため、(my)0x8000(1.0)に0x4000(0.5)を乗算すると0xC000(- 0.5)、0x8000は-1であると見なすため。これはかなり迷惑です。

私は何が間違っているのですか?ピクセル値を0000〜7FFFの範囲に保つ必要がありますか?この種の固定点フォーマットであるという目的を打ち負かしませんか?これを回避する方法はありますか?多分いくつかのトリック?

Q15には、これらすべてについて論じているある種の決定的な論文がありますか?

4

2 に答える 2

3

個人的には、最大値を0x7FFF(〜0.99something)に制限するソリューションを使用します。

  • プロセッサを希望どおりに動作させるために、フープを飛び越える必要はありません。
  • 0-0x7FFFでの操作はコードの読者にすぐに認識されるため、「奇妙な」コードの詳細を文書化するのに長い時間を費やす必要はありません。Q形式は(私の経験では)から実行-1.0+1.0-one lsbます。1 lsbの値は、0の両側で異なるため、算術演算はそれ以外の場合はうまく機能しません。

議論の余地のあるコードレビューアのパネルに対して、「パフォーマンスの最後の0.01%」だけでなく、その余分なビットがアルゴリズムの操作にとって重要であると首尾よく主張していることを想像できない限り、誰もが理解できるコードと、どのマップに固執するか利用可能なハードウェアに。


または、前の操作を再配置して、すべてのピクセルが元のピクセルのネガになるようにします。または、以前に送信したもののネガを取り込むための次の操作。次に、Q15形式の-1.0からの値を使用します。0.0

于 2012-09-02T16:25:12.103 に答える
2

よりも「大きい」数値を使用しないことが確実な場合$8000、唯一の問題は、乗数の少なくとも1つが$8000(–1、1であることが望ましいのに)である場合です。

この場合、解決策はかなり単純です。

pmulhrsw xmm0, xmm1
psignw xmm0, xmm0

または、私たちの場合は完全に同等です(ありがとう、Peter Cordes!):

pmulhrsw xmm0, xmm1
pabsw xmm0, xmm0

これにより、負の値が乗算から正の値に戻り–1ます。

于 2017-09-16T21:04:09.563 に答える