加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 22:28:18 所属栏目:百科 来源:网络整理
导读:我正在构建一个应该在服务器上运行并分析声音文件的工具.我想在 Ruby中这样做,因为我所有的其他工具都是用Ruby编写的.但是,我找不到一个完成这个的好方法. 很多我发现的例子一直在做可视化和图形化的东西.我只需要FFT数据,没有了.我需要获得音频数据,并对其
我正在构建一个应该在服务器上运行并分析声音文件的工具.我想在 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...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读