Module: Muze::Native

Defined in:
lib/muze/native.rb

Overview

Optional native extension wrapper.

Constant Summary collapse

EXTENSION_LOADED =
if ENV.fetch("MUZE_DISABLE_NATIVE", "0") == "1"
  false
else
  begin
    require "muze/muze_ext"
    true
  rescue LoadError
    false
  end
end

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extension_loaded?Boolean

Returns:

  • (Boolean)


20
21
22
# File 'lib/muze/native.rb', line 20

def extension_loaded?
  EXTENSION_LOADED
end

Instance Method Details

#frame_slices(signal, frame_length, hop_length) ⇒ Array<Array<Float>>

Parameters:

  • signal (Array<Float>)
  • frame_length (Integer)
  • hop_length (Integer)

Returns:

  • (Array<Array<Float>>)

Raises:



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/muze/native.rb', line 29

def frame_slices(signal, frame_length, hop_length)
  raise Muze::ParameterError, "signal must be an Array" unless signal.is_a?(Array)
  unless frame_length.is_a?(Integer) && hop_length.is_a?(Integer) && frame_length.positive? && hop_length.positive?
    raise Muze::ParameterError, "frame_length and hop_length must be positive"
  end

  if signal.length <= frame_length
    return [signal + Array.new(frame_length - signal.length, 0.0)]
  end

  frame_count = ((signal.length - frame_length) / hop_length) + 1
  Array.new(frame_count) do |index|
    start = index * hop_length
    signal[start, frame_length]
  end
end

#median1d(values) ⇒ Float

Parameters:

  • values (Array<Float>)

Returns:

  • (Float)

Raises:



48
49
50
51
52
53
54
# File 'lib/muze/native.rb', line 48

def median1d(values)
  raise Muze::ParameterError, "values must be an Array" unless values.is_a?(Array)
  return 0.0 if values.empty?

  copy = values.map(&:to_f)
  quickselect!(copy, copy.length / 2)
end

#median_filter1d(values, half) ⇒ Array<Float>

Parameters:

  • values (Array<Float>)
  • half (Integer)

Returns:

  • (Array<Float>)

Raises:



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/muze/native.rb', line 59

def median_filter1d(values, half)
  raise Muze::ParameterError, "values must be an Array" unless values.is_a?(Array)
  raise Muze::ParameterError, "half must be non-negative" unless half.is_a?(Integer) && half >= 0
  return [] if values.empty?

  window = []
  output = Array.new(values.length, 0.0)
  values.length.times do |index|
    remove_sorted_value(window, values[index - half - 1]) if index > half
    entering = index + half
    insert_sorted_value(window, values[entering]) if entering < values.length
    output[index] = window[window.length / 2].to_f
  end

  output
end