findPeaks method

int findPeaks(
  1. double signalNew
)

Implementation

int findPeaks(double signalNew) {
  x++;
  cnt++;

  buffer.add(signalNew);

  if (signalNew > mx) {
    mx = signalNew;
    mxPos = x;
  }

  if (signalNew < mn) {
    mn = signalNew;
    mnPos = x;
  }

  if (cnt > MAX_BUFF_LEN) {
    cnt = 0;
    delta = getMedian(buffer.sublist(x - MAX_BUFF_LEN, x + 1)) +
        meanAbsoluteDeviation(
          buffer.sublist(x - MAX_BUFF_LEN, x + 1),
        );
    firstTry = true;
    //added
    mxPos = 0;
    mnPos = 0;
    mn = double.infinity;
    mx = -double.infinity;
  }

  if (firstTry) {
    if (signalNew < mx - delta) {
      maxtab.add([mxPos.toDouble(), mx]);
      mn = signalNew;
      mnPos = x;
      lookForMax = false;
      firstTry = false;
      cnt = 0;
      return 0; //mxPos;
    }

    if (signalNew > mn + delta) {
      mx = signalNew;
      mxPos = x;
      lookForMax = true;
      firstTry = false;
      cnt = 0;
    }

    return 0;
  } else {
    if (lookForMax) {
      if (signalNew < mx - delta) {
        if (maxtab.isNotEmpty) {
          if (mxPos - maxtab.last[0] <= MAXTAB_MIN) {
            mn = signalNew;
            mnPos = x;
            lookForMax = false;
            return 0;
          }

          if (mxPos - maxtab.last[0] >= MAXTAB_MIN &&
              mxPos - maxtab.last[0] < MAXTAB_MAX) {
            if (maxtab.last[0] > MAXTAB_CHECK_LEN) {
              slope1 = calculateSlope(
                  buffer.sublist(mxPos - MAXTAB_BUFF, mxPos + 1));
              slope2 = calculateSlope(buffer
                  .sublist(maxtab.last[0].toInt() - MAXTAB_BUFF,
                      maxtab.last[0].toInt() + 1)
                  .toList());

              if (slope1.abs() < slope2.abs() * 0.5) {
                mn = signalNew;
                mnPos = x;
                lookForMax = false;
                return 0;
              }
            }
          }
        }

        maxtab.add([mxPos.toDouble(), mx]);
        mn = signalNew;
        mnPos = x;
        lookForMax = false;

        if (mx < 2.5 * delta) {
          delta = (0.85 * delta + 0.15 * mx) * 0.7;
          ignore = 0;
        } else {
          ignore++;
          if (ignore > 5) {
            delta = getMedian(buffer.sublist(x - MAX_BUFF_LEN, x + 1)) +
                meanAbsoluteDeviation(
                    buffer.sublist(x - MAX_BUFF_LEN, x + 1));
            ignore = 0;
          }
        }
        cnt = 0;
        return mxPos;
      }
    } else {
      if (signalNew > mn + delta) {
        mx = signalNew;
        mxPos = x;
        lookForMax = true;
      }
      return 0;
    }
  }

  return 0;
}