private void initialise(
      int samplingRate,
      int LPOrder,
      double[] pscalesIn,
      double[] tscalesIn,
      double[] escalesIn,
      double[] vscalesIn) {
    if (pscalesIn != null) {
      pscales = new double[pscalesIn.length];
      System.arraycopy(pscalesIn, 0, pscales, 0, pscalesIn.length);
    }

    if (tscalesIn != null) {
      tscales = new double[tscalesIn.length];
      System.arraycopy(tscalesIn, 0, tscales, 0, tscalesIn.length);
    }

    if (escalesIn != null) {
      escales = new double[escalesIn.length];
      System.arraycopy(escalesIn, 0, escales, 0, escalesIn.length);
    }

    if (vscalesIn != null) {
      vscales = new double[vscalesIn.length];
      System.arraycopy(vscalesIn, 0, vscales, 0, vscalesIn.length);
    }

    fs = samplingRate;
    lpOrder = SignalProcUtils.getLPOrder(fs);
  }
  public DoubleDataSource process(DoubleDataSource inputAudio) {
    amount = MathUtils.CheckLimits(amount, MIN_AMOUNT, MAX_AMOUNT);

    double[] vscales = {amount};

    int frameLength = SignalProcUtils.getDFTSize(fs);
    int predictionOrder = SignalProcUtils.getLPOrder(fs);

    VocalTractScalingProcessor p =
        new VocalTractScalingProcessor(predictionOrder, fs, frameLength, vscales);
    FrameOverlapAddSource foas =
        new FrameOverlapAddSource(inputAudio, Window.HANNING, true, frameLength, fs, p);

    return new BufferedDoubleDataSource(foas);
  }