src/main/java/org/jcodec/scale/BaseResampler.java
public static void normalizeAndGenerateFixedPrecision(double[] taps, int precBits, short[] out) {
        double sum = 0;
        for (int i = 0; i < taps.length; i++) {
            sum += taps[i];
        }
        int sumFix = 0;
        int precNum = 1 << precBits;
        for (int i = 0; i < taps.length; i++) {
            double d = (taps[i] * precNum) / sum + precNum;
            int s = (int) d;
            taps[i] = d - s;
            out[i] = (short) (s - precNum);
            sumFix += out[i];
        }
        long tapsTaken = 0;
        while (sumFix < precNum) {
            int maxI = -1;
            for (int i = 0; i < taps.length; i++) {
                if ((tapsTaken & (1 << i)) == 0 && (maxI == -1 || taps[i] > taps[maxI]))
                    maxI = i;
            }
            out[maxI]++;
            sumFix++;
            tapsTaken |= (1 << maxI);
        }

        for (int i = 0; i < taps.length; i++) {
            taps[i] += out[i];
            if ((tapsTaken & (1 << i)) != 0)
                taps[i] -= 1;
        }
    }
public static void normalizeAndGenerateFixedPrecision(double[] taps, int precBits, short[] out) {
        double sum = 0;
        for (int i = 0; i < taps.length; i++) {
            sum += taps[i];
        }
        int sumFix = 0;
        int precNum = 1 << precBits;
        for (int i = 0; i < taps.length; i++) {
            double d = (taps[i] * precNum) / sum + precNum;
            int s = (int) d;
            taps[i] = d - s;
            out[i] = (short) (s - precNum);
            sumFix += out[i];
        }
        long tapsTaken = 0;
        while (sumFix < precNum) {
            int maxI = -1;
            for (int i = 0; i < taps.length; i++) {
                if ((tapsTaken & (1 << i)) == 0 && (maxI == -1 || taps[i] > taps[maxI]))
                    maxI = i;
            }
            out[maxI]++;
            sumFix++;
            tapsTaken |= (1 << maxI);
        }

        for (int i = 0; i < taps.length; i++) {
            taps[i] += out[i];
            if ((tapsTaken & (1 << i)) != 0)
                taps[i] -= 1;
        }
    }
public static void normalizeAndGenerateFixedPrecision ( double [ ] taps , int precBits , short [ ] out ) { double sum = 0 ; for ( int i = 0 ; i < taps . length ; i ++ ) { sum += taps [ i ] ; } int sumFix = 0 ; int precNum = 1 << precBits ; for ( int i = 0 ; i < taps . length ; i ++ ) { double d = ( taps [ i ] * precNum ) / sum + precNum ; int s = ( int ) d ; taps [ i ] = d - s ; out [ i ] = ( short ) ( s - precNum ) ; sumFix += out [ i ] ; } long tapsTaken = 0 ; while ( sumFix < precNum ) { int maxI = - 1 ; for ( int i = 0 ; i < taps . length ; i ++ ) { if ( ( tapsTaken & ( 1 << i ) ) == 0 && ( maxI == - 1 || taps [ i ] > taps [ maxI ] ) ) maxI = i ; } out [ maxI ] ++ ; sumFix ++ ; tapsTaken |= ( 1 << maxI ) ; } for ( int i = 0 ; i < taps . length ; i ++ ) { taps [ i ] += out [ i ] ; if ( ( tapsTaken & ( 1 << i ) ) != 0 ) taps [ i ] -= 1 ; } }
Converts floating point taps to fixed precision taps.

@param taps
The 64 bit double representation
@param precBits
Precision bits
@param out
Taps converted to fixed precision
Converts floating point taps to fixed precision taps .