Module: DTW::Resampler

Defined in:
lib/dtwrb/resampler.rb,
sig/dtwrb.rbs

Class Method Summary collapse

Class Method Details

.call(frames, length) ⇒ frames

Parameters:

  • (frames)
  • (::Integer)

Returns:

  • (frames)

Raises:

  • (ArgumentError)


7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/dtwrb/resampler.rb', line 7

def call(frames, length)
  raise ArgumentError, "resample length must be positive, got #{length}" unless length.positive?
  return [] if frames.empty?
  return Array.new(length) { frames.first.map(&:to_f) } if frames.length == 1 || length == 1

  last = frames.length - 1

  Array.new(length) do |index|
    position = index.to_f * last / (length - 1)
    lower = position.floor
    upper = [lower + 1, last].min
    interpolate(frames[lower], frames[upper], position - lower)
  end
end

.interpolate(from, to, fraction) ⇒ frame

Parameters:

  • (frame)
  • (frame)
  • (::Float)

Returns:

  • (frame)


22
23
24
# File 'lib/dtwrb/resampler.rb', line 22

def interpolate(from, to, fraction)
  Array.new(from.length) { |axis| (from[axis] * (1.0 - fraction)) + (to[axis] * fraction) }
end