public static double[] inverse(int overlap, double[][] specto) { DoubleFFT_1D fft = new DoubleFFT_1D(specto[0].length / 2); Window w = new BlackmanWindow(); double[][] spectoNew = specto.clone(); double[][] spectoN = new double[spectoNew.length][spectoNew[0].length * 2]; for (int i = 0; i < spectoN.length; i++) { for (int j = 0; j < spectoN[0].length; j++) { if (j < spectoNew[0].length) spectoN[i][j] = spectoNew[i][j]; else spectoN[i][j] = spectoNew[i][spectoNew[i].length - 1 - (j - spectoNew[i].length)]; } } for (int i = 0; i < spectoN.length; i++) { spectoN[i] = w.inverseW(specto[i]); fft.realInverseFull(spectoN[i], true); } int window = spectoN[0].length * 2; double[] signal = new double[spectoN.length * (window - overlap)]; for (int i = 0; i < spectoN.length; i++) { int length = spectoN[0].length; if ((window - overlap) * i + length > signal.length) length = signal.length - (window - overlap) * i; System.arraycopy(spectoN[i], 0, signal, (window - overlap) * i, length); } return signal; }