|
| fixed point udregning Fra : Joe |
Dato : 08-06-10 00:25 |
|
Hvordan skriver/udregner man følgende udtryk i C på den mest effektive måde?
R=B*X+Z-A*Y
Variablerne R,B,X,Z,A og Y er 32-bit signed.
Variablerne indeholder Q1.15 værdier (altså værdier mellem -32768 til
32767).
R skal returnere resultatet i Q1.15 format.
Tak på forhånd.
| |
Arne Vajhøj (08-06-2010)
| Kommentar Fra : Arne Vajhøj |
Dato : 08-06-10 03:36 |
|
On 07-06-2010 19:25, Joe wrote:
> Hvordan skriver/udregner man følgende udtryk i C på den mest effektive
> måde?
>
> R=B*X+Z-A*Y
>
> Variablerne R,B,X,Z,A og Y er 32-bit signed.
>
> Variablerne indeholder Q1.15 værdier (altså værdier mellem -32768 til
> 32767).
>
> R skal returnere resultatet i Q1.15 format.
Hvis det er rene heltal, så er det nok mest effektivt as is.
Hvis XYZR har et implied antal decimaler men AB er heltal så ditto.
Hvis XYZABR alle har et implied antal decimaler, så skal de
to multiplikations resultater divideres med skalerings faktoren.
Hvis det er noget helt tredie, så skal vi nok have en definition
på Q1.15 !
Arne
| |
Joe (08-06-2010)
| Kommentar Fra : Joe |
Dato : 08-06-10 09:51 |
|
>>
>> R=B*X+Z-A*Y
>>
>> Variablerne R,B,X,Z,A og Y er 32-bit signed.
>>
>> Variablerne indeholder Q1.15 værdier (altså værdier mellem -32768 til
>> 32767).
>>
>> R skal returnere resultatet i Q1.15 format.
>
> Hvis det er rene heltal, så er det nok mest effektivt as is.
>
> Hvis XYZR har et implied antal decimaler men AB er heltal så ditto.
>
> Hvis XYZABR alle har et implied antal decimaler, så skal de
> to multiplikations resultater divideres med skalerings faktoren.
>
> Hvis det er noget helt tredie, så skal vi nok have en definition
> på Q1.15 !
>
Q1.15 betyder bare en signed 16-bit værdi hvor tallet skal fortolkes som
-1*BIT(16) + sum af 2^[BIT(n)*(n-16)] fra n=1 til 15...altså et tal
mellem -32768 og 32767 som kan
fortolkes som en værdi mellem -1 og tæt på 1...
Jeg har implementeret udregningen sådan her:
R = (B*X);
tmp = (int16_t) (R>>15);
R = ((int32_t)tmp)+Z;
tmp = (int16_t)R;
R = (A*((int32_t)Y));
tmp2 = -(int16_t) (R>>15);
Rout=tmp+tmp2;
Men jeg vil tro at det kan gøres mere smart?
| |
Jens Jensen (08-06-2010)
| Kommentar Fra : Jens Jensen |
Dato : 08-06-10 17:48 |
|
Joe skrev den 08-06-2010 10:51:
> Men jeg vil tro at det kan gøres mere smart?
Hvis int er 32 bit kan denne linie nok bruges:
R = ((int32_t)((int16_t)B * (int16_t)X) - (int32_t)((int16_t)A *
(int16_t)Y)) / (1 << 15) + Z
Udtrykket udnytter, at der sker integral promotion af 16 bit værdierne
til int.
| |
|
|