All Downloads are FREE. Search and download functionalities are using the official Maven repository.

musicg.dsp.LinearInterpolation Maven / Gradle / Ivy

/*
 *
 *  *
 *  *  * Copyright 2015 Skymind,Inc.
 *  *  *
 *  *  *    Licensed under the Apache License, Version 2.0 (the "License");
 *  *  *    you may not use this file except in compliance with the License.
 *  *  *    You may obtain a copy of the License at
 *  *  *
 *  *  *        http://www.apache.org/licenses/LICENSE-2.0
 *  *  *
 *  *  *    Unless required by applicable law or agreed to in writing, software
 *  *  *    distributed under the License is distributed on an "AS IS" BASIS,
 *  *  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  *  *    See the License for the specific language governing permissions and
 *  *  *    limitations under the License.
 *  *
 *
 */

package musicg.dsp;

/**
 * Construct new data points within the range of a discrete set of known data points by linear equation
 * 
 * @author Jacquet Wong
 */
public class LinearInterpolation {

	public LinearInterpolation(){
		
	}
	
	/**
	 * Do interpolation on the samples according to the original and destinated sample rates
	 * 
	 * @param oldSampleRate	sample rate of the original samples
	 * @param newSampleRate	sample rate of the interpolated samples
	 * @param samples	original samples
	 * @return interpolated samples
	 */
	public short[] interpolate(int oldSampleRate, int newSampleRate, short[] samples) {

		if (oldSampleRate==newSampleRate){
			return samples;
		}
		
		int newLength = Math.round(((float)samples.length/oldSampleRate*newSampleRate));
		float lengthMultiplier=(float)newLength/samples.length;
        short[] interpolatedSamples = new short[newLength];

        // interpolate the value by the linear equation y=mx+c        
        for (int i = 0; i < newLength; i++){
            
        	// get the nearest positions for the interpolated point
        	float currentPosition = i / lengthMultiplier;
            int nearestLeftPosition = (int)currentPosition;
            int nearestRightPosition = nearestLeftPosition + 1;
            if (nearestRightPosition>=samples.length){
            	nearestRightPosition=samples.length-1;
            }
            
            float slope=samples[nearestRightPosition]-samples[nearestLeftPosition];	// delta x is 1
            float positionFromLeft = currentPosition - nearestLeftPosition;
            
            interpolatedSamples[i] = (short)(slope*positionFromLeft+samples[nearestLeftPosition]);	// y=mx+c
        }
        
        return interpolatedSamples;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy