Pregunta

Nunca había trabajado con características de audio en tiempo real. Me gustaría saber si hay bibliotecas rubí por ahí que me permitiría crear algo así como un afinador de guitarra.

¿Fue útil?

Solución

Hay dos tareas ortogonales: 1) Lea el audio, 2) procesarlo. Para obtener el audio podrías comprobar rubí de audio, sin embargo, para ser honesto, Nunca he utilizado y su documentación parece escasa. Personalmente me recurro a lo que su sistema operativo proporciona; por ejemplo, en GNU / Linux tenemos herramientas útiles como bplay . La segunda cuestión es cómo calcular la FFT de audio, esto debería ser fácil con FFTW3 .

Aquí está un ejemplo rápido y sucio que obtiene el punto de pico de la FFT de stdin (16 bits, mono):

require 'rubygems'
require 'fftw3'

module Tuner
  def self.peaks(input_channel, samplerate, window_size)
    Enumerator.new do |enum|
      loop do
        data = input_channel.read(window_size).unpack("s*")
        na = NArray.to_na(data)
        fft = FFTW3.fft(na).to_a[0, window_size/2]
        max_n = fft.map(&:abs).each_with_index.drop(1).max[1]
        enum.yield(max_n.to_f * samplerate / window_size)
      end
    end
  end
end

if __FILE__ == $0
  Tuner.peaks(STDIN, 8000, 1024).each { |f| puts f }
end

a ser llamado, por ejemplo:

$ brec -s 8000 -b 16 | ruby tuner.rb
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top