fix dimension encode/decode error

This commit is contained in:
REAndroid 2023-05-03 14:06:43 +02:00
parent 1037986e95
commit db3a18b039

View File

@ -20,9 +20,10 @@ public class ComplexUtil {
public static String decodeComplex(boolean fraction, int complex_value){
int radixFlag = (complex_value >> COMPLEX_RADIX_SHIFT) & COMPLEX_RADIX_MASK;
Radix radix = Radix.forFlag(radixFlag);
int mantissa = (complex_value >> COMPLEX_MANTISSA_SHIFT) & COMPLEX_MANTISSA_MASK;
mantissa = mantissa << radix.getShift();
float value = mantissa * MANTISSA_MULTIPLIER;
int mantissa = (complex_value & ( COMPLEX_MANTISSA_MASK <<COMPLEX_MANTISSA_SHIFT));
float value = mantissa * radix.getMultiplier();
int unit_type = (complex_value >> COMPLEX_UNIT_SHIFT) & COMPLEX_UNIT_MASK;
Unit unit = Unit.fromFlag(fraction, unit_type);
return radix.formatFloat(fraction, value) + unit.getSymbol();
@ -132,16 +133,18 @@ public class ComplexUtil {
};
}
public enum Radix{
RADIX_23p0(0, 23),
RADIX_16p7(1, 16),
RADIX_8p15(2, 8),
RADIX_0p23(3, 0);
RADIX_23p0(0, 23, MANTISSA_MULT),
RADIX_16p7(1, 16, 1.0f/(1<<7) * MANTISSA_MULT),
RADIX_8p15(2, 8, 1.0f/(1<<15) * MANTISSA_MULT),
RADIX_0p23(3, 0, 1.0f/(1<<23) * MANTISSA_MULT);
private final int flag;
private final int shift;
Radix(int flag, int shift) {
private final float multiplier;
Radix(int flag, int shift, float multiplier) {
this.flag = flag;
this.shift = shift;
this.multiplier = multiplier;
}
public String formatFloat(boolean scale, float value){
if(this.flag == 0){
@ -195,12 +198,15 @@ public class ComplexUtil {
public int getShift() {
return shift;
}
public float getMultiplier() {
return multiplier;
}
}
private static final int COMPLEX_RADIX_SHIFT = 4;
private static final int COMPLEX_RADIX_MASK = 0x3;
private static final int COMPLEX_MANTISSA_SHIFT = 8;
private static final int COMPLEX_MANTISSA_MASK = 0xffffff;
private static final float MANTISSA_MULTIPLIER = (1.0f / (1 << 23));
private static final int COMPLEX_MANTISSA_MASK = 0x00ffffff;
private static final float MANTISSA_MULT = (1.0f / (1 << 8));
private static final int COMPLEX_UNIT_SHIFT = 0;
private static final int COMPLEX_UNIT_MASK = 0xf;
}