2010-12-22 49 views

回答

4

有兩個正交任務:1)讀取音頻,2)處理它。爲了獲得音頻,你可以檢查ruby-audio,說實話,我從來沒有使用它,它的文檔似乎很少。就個人而言,我會訴諸任何您的操作系統提供;例如在GNU/Linux中,我們有便利的工具,如bplay。第二個問題是如何計算音頻的FFT,這應該很容易與FFTW3

這裏是一個快速和骯髒的例子是可以獲得FFT的峯值點從標準輸入(16位,單聲道):

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 

要被調用,例如:

$ brec -s 8000 -b 16 | ruby tuner.rb 
+1

但請記住,您需要了解一些關於FFT和樂器光譜的知識,才能獲得吉他調音器的有用功能。您需要採用托克蘭的示例並對其進行更多處理 - 選取FFT的峯值將無法可靠地給出您的音調。看到一些關於基音檢測的其他帖子:http://stackoverflow.com/search?q=pitch+estimation – 2010-12-22 23:29:36