Class: SPCore::PolynomialResampling

Inherits:
Object
  • Object
show all
Defined in:
lib/spcore/resampling/polynomial_resampling.rb

Overview

polynomial interpolation.

Class Method Summary collapse

Class Method Details

.upsample(input, upsample_factor) ⇒ Object

Raises:

  • (ArgumentError)


6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/spcore/resampling/polynomial_resampling.rb', line 6

def self.upsample input, upsample_factor
  raise ArgumentError, "input.size is less than four" unless input.size >= 4
  raise ArgumentError, "upsample_factor is not greater than 1" unless upsample_factor > 1
  
  output = Array.new((upsample_factor * input.size).to_i)
  
  input_size_f = input.size.to_f
  input_size_minus_1 = input.size - 1
  input_size_minus_2 = input.size - 2
  output_size_f = output.size.to_f
  output.each_index do |i|
    
    i_f = i.to_f
    index_into_input = (i_f / output_size_f) * input_size_f
    index_into_input_i = index_into_input.to_i
    
    if(index_into_input <= 1.0) # before second sample
      point1 = input[0]
      point2 = input[0]
      point3 = input[1]
      point4 = input[2]
      x = index_into_input
      output[i] = Interpolation.cubic_hermite(point1, point2, point3, point4, x)
    elsif(index_into_input >= input_size_minus_1) # past last sample
      point1 = input[input_size_minus_1 - 1]
      point2 = input[input_size_minus_1]
      point3 = input[input_size_minus_1]
      point4 = input[input_size_minus_1]
      x = index_into_input - index_into_input.floor
      output[i] = Interpolation.cubic_hermite(point1, point2, point3, point4, x)
    elsif(index_into_input >= input_size_minus_2)  # past second-to-last sample
      point1 = input[index_into_input_i - 1]
      point2 = input[index_into_input_i]
      point3 = input[input_size_minus_1]
      point4 = input[input_size_minus_1]
      x = index_into_input - index_into_input.floor
      output[i] = Interpolation.cubic_hermite(point1, point2, point3, point4, x)
    else # general case
      point1 = input[index_into_input_i - 1]
      point2 = input[index_into_input_i]
      point3 = input[index_into_input_i + 1]
      point4 = input[index_into_input_i + 2]
      x = index_into_input - index_into_input.floor
      output[i] = Interpolation.cubic_hermite(point1, point2, point3, point4, x)
    end
  end
end