ruby – 从文件中提取快速傅里叶变换数据

我正在构建一个应该在服务器上运行并分析声音文件的工具.我想在 Ruby中这样做,因为我所有的其他工具都是用Ruby编写的.但是,我找不到一个完成这个的好方法.

很多我发现的例子一直在做可视化和图形化的东西.我只需要FFT数据,没有了.我需要获得音频数据,并对其进行FFT.我的最终目标是计算一些东西,比如所有频率(加权幅度),BPM的平均值/中值/模式,第25个百分位数和第75个百分位数,还有一些其他好的特性,以便以后可以将类似的声音聚集在一起.

首先我试图使用ruby-audio和fftw3,但是我从来没有去过这两个人真正的合作.文档不是很好,所以我真的不知道什么数据被洗牌.
接下来,我试图使用bplay / brec并限制我的Ruby脚本,只需使用STDIN并执行FFT(仍在使用fftw3).但是,由于服务器没有声卡,我无法获得播放/播放,因此我无法直接将音频直接发送到STDOUT,而无需先访问音频设备.

这是我最接近的:

# extracting audio from wav with ruby-audio
buf = RubyAudio::Buffer.float(1024)
RubyAudio::Sound.open(fname) do |snd|
    while snd.read(buf) != 0
        # ???
    end
end

# performing FFT on audio
def get_fft(input,window_size)
    data = input.read(window_size).unpack("s*")
    na = NArray.to_na(data)
    fft = FFTW3.fft(na).to_a[0,window_size/2]
    return fft
end

所以现在我被卡住了,在Google上找不到更好的结果.那么也许你们可以帮助我吗?

谢谢!

解决方法

这是我正在尝试实现的最终解决方案,非常感谢Randall Cook的有用建议.在Ruby中提取wav文件的声波和FFT的代码
require "ruby-audio"
require "fftw3"

fname = ARGV[0]
window_size = 1024
wave = Array.new
fft = Array.new(window_size/2,[])

begin
    buf = RubyAudio::Buffer.float(window_size)
    RubyAudio::Sound.open(fname) do |snd|
        while snd.read(buf) != 0
            wave.concat(buf.to_a)
            na = NArray.to_na(buf.to_a)
            fft_slice = FFTW3.fft(na).to_a[0,window_size/2]
            j=0
            fft_slice.each { |x| fft[j] << x; j+=1 }
        end
    end

rescue => err
    log.error "error reading audio file: " + err
    exit
end

# Now I can work on analyzing the "fft" and "wave" arrays...

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...