package com.nerdscentral.audio.pitch.algorithm; import java.lang.ref.SoftReference; import com.nerdscentral.data.OffHeapArray; public class FFTbase { private static final ThreadLocal<SoftReference<OffHeapFFT>> cachedF = new ThreadLocal<SoftReference<OffHeapFFT>>() {/**/ }; private static final ThreadLocal<SoftReference<OffHeapFFT>> cachedR = new ThreadLocal<SoftReference<OffHeapFFT>>() {/**/ }; @SuppressWarnings("resource") public static void fft(final OffHeapArray inputReal, OffHeapArray inputImag, OffHeapArray newArray, boolean forward) { newArray.checkBoundsDouble(0, inputReal.doubleSize() * 2); long n = inputReal.doubleSize(); SoftReference<OffHeapFFT> sref = forward ? cachedF.get() : cachedR.get(); OffHeapFFT transform = null; if (sref != null) { transform = sref.get(); } if (transform != null) { if (transform.size() != n) { transform.close(); transform = null; } } if (transform == null) { transform = new OffHeapFFT(n, forward); sref = new SoftReference<>(transform); if (forward) { cachedF.set(sref); } else { cachedR.set(sref); } } transform.fft(inputReal, inputImag); long length = inputReal.doubleSize() << 1; double radice = 1.0 / Math.sqrt(n); for (long i = 0; i < length; i += 2) { long i2 = i >> 1; newArray.setDouble(i, inputReal.getDouble(i2) * radice); newArray.setDouble(i + 1, inputImag.getDouble(i2) * radice); } } }