Module: Awaaz::Utils::Resample

Defined in:
lib/awaaz/utils/resample.rb

Overview

Note:

This module is intended for internal use, but ‘read_and_resample` is public for advanced users who need manual resampling.

Resample utilities for audio data represented as Numo::NArray. Wraps the ‘libsamplerate` bindings provided by Extensions::Samplerate.

Class Method Summary collapse

Class Method Details

.read_and_resample(input_samples, input_rate, output_rate, channels, sampling_option: :sinc_fastest) ⇒ Numo::SFloat

Resamples a Numo::SFloat array of audio samples from one sample rate to another.

Examples:

Resample 44.1kHz mono audio to 48kHz

samples = Numo::SFloat.new(44100).rand
new_samples = Awaaz::Utils::Resample.read_and_resample(samples, 44100, 48000)

Parameters:

  • input_samples (Numo::SFloat)

    The audio samples to resample.

  • input_rate (Integer)

    The original sample rate (Hz).

  • output_rate (Integer)

    The desired sample rate (Hz).

  • sampling_option (Symbol, Integer) (defaults to: :sinc_fastest)

    The resampling quality option. Can be one of:

    * `:sinc_best_quality` (0)
    * `:sinc_medium_quality` (1)
    * `:sinc_fastest` (2)
    * `:zero_order_hold` (3)
    * `:linear` (4)
    

Returns:

  • (Numo::SFloat)

    The resampled audio data.

Raises:

  • (ArgumentError)

    If inputs are invalid or ratio is out of range.

  • (Awaaz::ResampleError)

    If ‘libsamplerate` returns an error.



35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/awaaz/utils/resample.rb', line 35

def read_and_resample(input_samples, input_rate, output_rate, channels, sampling_option: :sinc_fastest)
  return input_samples if input_rate == output_rate

  validate_inputs(input_samples)

  ratio = calculate_ratio(input_rate, output_rate)
  input_ptr, output_ptr, input_frames, output_frames = prepare_memory(input_samples, ratio, channels)

  data = build_src_data(input_ptr, output_ptr, input_frames, output_frames, ratio)
  perform_resampling(data, sampling_option, channels)

  convert_to_numo(output_ptr, data[:output_frames_gen] * channels)
end