1. 程式人生 > 實用技巧 >統計波形圖波峰波谷大於某個幅度的數目

統計波形圖波峰波谷大於某個幅度的數目

- (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。