Ruby中的快速傅里叶变换输出操作

Ruby中的快速傅里叶变换输出操作,ruby,audio,fft,wav,equalizer,Ruby,Audio,Fft,Wav,Equalizer,我正在为音频构建一个可视均衡器,我不知道FFT的输出是什么。我的最终目标是向装备蓝牙的Arduino发送6个数字(1个低音、4个中音和1个高音)的简化阵列。数字将表示每列中要点亮的LED数量(1列表示低音,1列表示高音,等等) 第一步是将音频信号转换为数字表示。 为了做到这一点,我想以固定的时间间隔将某些频率组合成离散的桶,即60到250赫兹的低音 我已经获得了一个300Hz的wav文件,我正试图使用rubyFFTW3gem对其进行反褶积。我期望一个正弦波在1秒的采样过程中完成300个周期。当我

我正在为音频构建一个可视均衡器,我不知道FFT的输出是什么。我的最终目标是向装备蓝牙的Arduino发送6个数字(1个低音、4个中音和1个高音)的简化阵列。数字将表示每列中要点亮的LED数量(1列表示低音,1列表示高音,等等)

第一步是将音频信号转换为数字表示。 为了做到这一点,我想以固定的时间间隔将某些频率组合成离散的桶,即60到250赫兹的低音

我已经获得了一个300Hz的wav文件,我正试图使用ruby
FFTW3
gem对其进行反褶积。我期望一个正弦波在1秒的采样过程中完成300个周期。当我传入一个300 Hz音调的1s样本时,
fft.length=1024
fft[0]=22528

我一直在使用这些对话,作为我的主要参考点,RubyGem的文档令人困惑

这是我的密码:

require "ruby-audio"
require "fftw3"
require "narray"

# Audio sample rate and block size:
SAMPLE_RATE = 44100
# break the audio into chunks (called windows, or frames)
# pass them sequentially to the FFT.
# gives a frequency profile that changes over time
# e.g. 1024, 2048, 4096, 8192, etc..
WINDOW = 2048
# samplerate/window => 44100/2048 = 10.7
# Updates about 11 times/second
# RESOLUTION = (1.0*SAMPLE_RATE/WINDOW)

filename = ARGV[0]

wave = Array.new # length is window size/2
fft = Array.new(WINDOW/2,[])

begin
  # extracting audio from wav with ruby-audio
  buf = RubyAudio::Buffer.float(WINDOW)
  RubyAudio::Sound.open(filename) 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/2]\
      # na = array to be transformed
      j=0
      fft_slice.each do |x|
        # getting the real part of the complex number
        x = x.abs
        fft[j] << x; j+=1
      end
    end
  end

rescue => err
    # log.error "error reading audio file: " + err
    puts 'There was an error, exiting!'
    exit
end
需要“ruby音频”
需要“fftw3”
需要“narray”
#音频采样率和块大小:
抽样率=44100
#将音频分成块(称为窗口或帧)
#按顺序将它们传递给FFT。
#提供随时间变化的频率配置文件
#例如1024、2048、4096、8192等。。
窗口=2048
#采样器/窗口=>44100/2048=10.7
#更新约11次/秒
#分辨率=(1.0*采样率/窗口)
filename=ARGV[0]
wave=Array.new#长度为窗口大小/2
fft=数组。新建(窗口/2,[])
开始
#使用ruby audio从wav中提取音频
buf=RubyAudio::Buffer.float(窗口)
RubyAudio::Sound.open(文件名)do | snd|
而snd.read(buf)!=0
波浪-混凝土(buf.to_a)
na=NArray.to_na(buf.to_a)
fft_slice=FFTW3.fft(na).到_a[0,窗口/2]\
#na=要转换的数组
j=0
fft|u切片。每个do|x|
#求复数的实部
x=x.abs
fft[j]错误
#log.error“读取音频文件时出错:”+err
放置“出现错误,正在退出!”
出口
结束
最里面的数组表示频率,最外面的数组表示时间的流逝,或者相反。如何知道哪个数组索引表示特定的频率

我不确定如何测试,看看它是否准确地创造了正确的频率。有没有一个好的方法来查看我丢失的数据,无论是视觉上还是其他方面


谢谢你的指点

我不懂ruby,所以你能解释一下函数的哪一部分取x值并将其放入位于j位置的fft数组中吗。然后它增加j,这样下一个值将在下一个索引处。所以它与赋值的a=相同?类似,但是
fft[j]我不知道ruby,那么你能解释一下函数的
fft[j]部分是如何取x值并将其放入位于j位置的fft数组中的吗。然后它增加j,这样下一个值将在下一个索引处。所以它与赋值的a=相同?类似,但
fft[j]