統計波形圖波峰波谷大於某個幅度的數目
阿新 • • 發佈:2020-10-26
- (void)updateWithYValue:(CGFloat)newY { if (!isnan(newY)) { if (!_shouldResetConfiguration) { _minValue = newY; _maxValue = newY; _startValue = NO; _didCheckerFindingTarget = NO; _shouldResetConfiguration = YES; }else { if (!_didCheckerFindingTarget) { _maxValue = MAX(_maxValue, newY); _minValue = MIN(_minValue, newY); CGFloat gapFromMaxValue = (ABS(_maxValue - newY)); CGFloat gapFromMinValue = (ABS(newY - _minValue));if (gapFromMaxValue >= self.minDistanceChangeForAllowRecordNumber) { _didCheckerFindingTarget = YES; _findingTopValue = NO; _criticalValue = newY; _maxValue = newY; _foundTargetCount = 1; }else if (gapFromMinValue >= self.minDistanceChangeForAllowRecordNumber) { _didCheckerFindingTarget = YES; _findingTopValue = YES; _criticalValue = newY; _minValue = newY; _foundTargetCount = 1; } } else { if (_findingTopValue) { if (newY >= _criticalValue) { _maxValue = MAX(newY, _maxValue); _minValue = newY; CGFloat gapFromMaxValue = (ABS(_maxValue - newY)); if (gapFromMaxValue >= self.minDistanceChangeForAllowRecordNumber) { _criticalValue = newY; _findingTopValue = NO; if (_foundTargetCount % 2 == 0) { [self addOneChangeCount]; } } } else { CGFloat gapFromMaxValue = (ABS(_maxValue - newY)); _minValue = MIN(_minValue, newY); CGFloat gapFromMinValue = (ABS(newY - _minValue)); if (gapFromMaxValue >= self.minDistanceChangeForAllowRecordNumber) { _foundTargetCount += 1; _criticalValue = newY; _minValue = newY; _findingTopValue = NO; if (_foundTargetCount % 2 == 0) { [self addOneChangeCount]; printf("==============>2\n"); } } else if (gapFromMinValue >= self.minDistanceChangeForAllowRecordNumber) { ///異常,需要忽略一半波形 _criticalValue = newY; _maxValue = newY; _findingTopValue = YES; } } } else { if (newY <= _criticalValue) { _minValue = MIN(newY, _minValue); _maxValue = newY; CGFloat gapFromMinValue = (ABS(newY - _minValue)); if (gapFromMinValue >= self.minDistanceChangeForAllowRecordNumber) { _foundTargetCount += 1; _criticalValue = newY; _findingTopValue = YES; if (_foundTargetCount % 2 == 0) { [self addOneChangeCount]; } } } else { CGFloat gapFromMinValue = (ABS(newY - _minValue)); _maxValue = MAX(_maxValue, newY); CGFloat gapFromMaxValue = (ABS(_maxValue - newY)); if (gapFromMinValue >= self.minDistanceChangeForAllowRecordNumber) { _foundTargetCount += 1; _criticalValue = newY; _maxValue = newY; _findingTopValue = YES; if (_foundTargetCount % 2 == 0) { [self addOneChangeCount]; } } else if (gapFromMaxValue >= self.minDistanceChangeForAllowRecordNumber) { ///異常,需要忽略一半波形 _criticalValue = newY; _minValue = newY; _findingTopValue = NO; } } } } } } }
假設第一個點為最低值,根據下一個點判斷趨勢,記錄探測接下來的值,記錄max和min,噹噹前點達到觸發臨界差值,認定觸發了一個波峰/波谷。若為波峰,保留最高值,探測下面的值,當探測到最高點到當前點差值到達臨界值認為下到一個波谷,計數加1。