private static Dataset ifft1d(final Dataset a, final int n, final int axis) { Dataset result = null; Dataset dest = null; int[] shape; PositionIterator pi; int[] pos; boolean[] hit; switch (a.getDtype()) { case Dataset.FLOAT32: case Dataset.COMPLEX64: FloatFFT_1D ffft = new FloatFFT_1D(n); float[] fdata = null; shape = a.getShape(); shape[axis] = n; result = new ComplexFloatDataset(shape); dest = new ComplexFloatDataset(new int[] {n}); fdata = (float[]) dest.getBuffer(); pi = a.getPositionIterator(axis); pos = pi.getPos(); hit = pi.getOmit(); while (pi.hasNext()) { Arrays.fill(fdata, 0.f); a.copyItemsFromAxes(pos, hit, dest); ffft.complexInverse(fdata, true); result.setItemsOnAxes(pos, hit, fdata); } break; case Dataset.FLOAT64: case Dataset.COMPLEX128: DoubleFFT_1D dfft = new DoubleFFT_1D(n); double[] ddata = null; shape = a.getShape(); shape[axis] = n; result = new ComplexDoubleDataset(shape); dest = new ComplexDoubleDataset(new int[] {n}); ddata = (double[]) dest.getBuffer(); pi = a.getPositionIterator(axis); pos = pi.getPos(); hit = pi.getOmit(); while (pi.hasNext()) { Arrays.fill(ddata, 0.); a.copyItemsFromAxes(pos, hit, dest); dfft.complexInverse(ddata, true); result.setItemsOnAxes(pos, hit, ddata); } break; default: logger.warn("Non-float dataset not yet supported"); break; } return result; }
public static void coupe100(AudioSignal input) { int fs = input.samplingRate; int N = input.getLength(); float[] Y = Arrays.copyOf(input.data, 2 * N); FloatFFT_1D fft = new FloatFFT_1D(N); fft.realForwardFull(Y); int threshold = 100 * 2; Arrays.fill(Y, 0, Math.round(threshold * (float) N / fs), 0); Arrays.fill(Y, Math.round(2 * N - threshold * (float) N / fs), 2 * N - 1, 0); fft.complexInverse(Y, true); for (int i = 0; i < N; i++) { input.data[i] = Y[2 * i]; } }