src/main/java/net/sourceforge/jaad/aac/gain/GainControl.java
private float calculateFMD(int bd, int wd, boolean prev, int maxLocGain, int samples,
			int[] loc, float[] lev, float[] fmd) {
		final int[] m = new int[samples/2];
		final int[] lct = prev ? locationPrev[bd][wd] : location[bd][wd];
		final int[] lvl = prev ? levelPrev[bd][wd] : level[bd][wd];
		final int length = lct.length;

		int lngain;
		int i;
		for(i = 0; i<length; i++) {
			loc[i+1] = 8*lct[i]; //gainc
			lngain = getGainChangePointID(lvl[i]); //gainc
			if(lngain<0) lev[i+1] = 1.0f/(float) Math.pow(2, -lngain);
			else lev[i+1] = (float) Math.pow(2, lngain);
		}

		//set start point values
		loc[0] = 0;
		if(length==0) lev[0] = 1.0f;
		else lev[0] = lev[1];
		float secLevel = lev[0];

		//set end point values
		loc[length+1] = maxLocGain;
		lev[length+1] = 1.0f;

		int j;
		for(i = 0; i<maxLocGain; i++) {
			m[i] = 0;
			for(j = 0; j<=length+1; j++) {
				if(loc[j]<=i) m[i] = j;
			}
		}

		for(i = 0; i<maxLocGain; i++) {
			if((i>=loc[m[i]])&&(i<=loc[m[i]]+7)) fmd[i] = interpolateGain(lev[m[i]], lev[m[i]+1], i-loc[m[i]]);
			else fmd[i] = lev[m[i]+1];
		}

		return secLevel;
	}
private float calculateFMD(int bd, int wd, boolean prev, int maxLocGain, int samples,
			int[] loc, float[] lev, float[] fmd) {
		final int[] m = new int[samples/2];
		final int[] lct = prev ? locationPrev[bd][wd] : location[bd][wd];
		final int[] lvl = prev ? levelPrev[bd][wd] : level[bd][wd];
		final int length = lct.length;

		int lngain;
		int i;
		for(i = 0; i<length; i++) {
			loc[i+1] = 8*lct[i]; //gainc
			lngain = getGainChangePointID(lvl[i]); //gainc
			if(lngain<0) lev[i+1] = 1.0f/(float) Math.pow(2, -lngain);
			else lev[i+1] = (float) Math.pow(2, lngain);
		}

		//set start point values
		loc[0] = 0;
		if(length==0) lev[0] = 1.0f;
		else lev[0] = lev[1];
		float secLevel = lev[0];

		//set end point values
		loc[length+1] = maxLocGain;
		lev[length+1] = 1.0f;

		int j;
		for(i = 0; i<maxLocGain; i++) {
			m[i] = 0;
			for(j = 0; j<=length+1; j++) {
				if(loc[j]<=i) m[i] = j;
			}
		}

		for(i = 0; i<maxLocGain; i++) {
			if((i>=loc[m[i]])&&(i<=loc[m[i]]+7)) fmd[i] = interpolateGain(lev[m[i]], lev[m[i]+1], i-loc[m[i]]);
			else fmd[i] = lev[m[i]+1];
		}

		return secLevel;
	}
/*
calculates a fragment modification function by interpolating the gain
values of the gain change positions