Sha256: 0ca4953275652c15e2e446df2addd5eb09a9a71a8ac934562ede66a1ad4e807c

Contents?: true

Size: 1.31 KB

Versions: 3

Compression:

Stored size: 1.31 KB

Contents

module SPCore
# Finds extrema (minima and maxima).
class Extrema
  
  attr_reader :minima, :maxima, :extrema
  
  def initialize samples
    @minima = {}
    @maxima = {}
    
    global_min_idx = 0
    global_min_val = samples[0]
    global_max_idx = 0
    global_max_val = samples[0]
    
    diffs = []
    for i in (1...samples.count)
      diffs.push(samples[i] - samples[i-1])
      
      if samples[i] < global_min_val
        global_min_idx = i
        global_min_val = samples[i]
      end
      
      if samples[i] > global_max_val
        global_max_idx = i
        global_max_val = samples[i]
      end
    end
    @minima[global_min_idx] = global_min_val
    @maxima[global_max_idx] = global_max_val
    
    is_positive = diffs.first > 0.0 # starting off with positive difference?
    
    # at zero crossings there is a local maxima/minima    
    for i in (1...diffs.count)
      if is_positive
        # at positive-to-negative transition there is a local maxima
        if diffs[i] <= 0.0
          @maxima[i] = samples[i]
          is_positive = false
        end
      else
        # at negative-to-positive transition there is a local minima
        if diffs[i] > 0.0
          @minima[i] = samples[i]
          is_positive = true
        end
      end
    end
    
    @extrema = @minima.merge(@maxima)    
  end
end 
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
spcore-0.2.0 lib/spcore/analysis/extrema.rb
spcore-0.1.9 lib/spcore/analysis/extrema.rb
spcore-0.1.8 lib/spcore/core/extrema.rb