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
- #frame_slices(signal, frame_length, hop_length) ⇒ Array<Array<Float>>
- #median1d(values) ⇒ Float
- #median_filter1d(values, half) ⇒ Array<Float>
Class Method Details
.extension_loaded? ⇒ 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>>
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
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>
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 |