使用Minim获取处理频率

时间:2012-04-14 18:45:36

标签: processing minim

我尝试使用Processing从麦克风获取频率。我在doc中混合了两个例子,但“最高”并不是真正的Hz(a是440 Hz)。 你知道如何拥有比这更好的东西吗?

import ddf.minim.*;
import ddf.minim.analysis.*;

Minim minim;
AudioInput in;
FFT fft;
int highest=0;

void setup()
{
  size(1024, 200, P2D);

  minim = new Minim(this);
  minim.debugOn();

  in = minim.getLineIn(Minim.MONO, 4096, 44100);
  fft = new FFT(in.left.size(), 44100);
}

void draw()
{


  background(0);
  stroke(255);

  fft.forward(in.left);
  highest=0;
  for (int n = 0; n < fft.specSize(); n++) {
    // draw the line for frequency band n, scaling it by 4 so we can see it a bit better
    line(n/4, height, n/4, height - fft.getBand(n)*4);

    //find frequency with highest amplitude
    if (fft.getBand(n)>fft.getBand(highest))
      highest=n;
  }
  println(highest);

  //println(fft.getFreq(110));
  // draw the waveforms
  for (int i = 0; i < in.bufferSize() - 1; i++)
  {
    line(i, 50 + in.left.get(i)*50, i+1, 50 + in.left.get(i+1)*50);
    line(i, 150 + in.right.get(i)*50, i+1, 150 + in.right.get(i+1)*50);
  }
}


void stop()
{
  // always close Minim audio classes when you are done with them
  in.close();
  minim.stop();

  super.stop();
}

1 个答案:

答案 0 :(得分:3)

您需要进行一些转换,具体取决于您想要获得的内容:

  

频谱不代表个别频率,但实际上代表以特定频率为中心的频段。每个频带的中心频率通常表示为时域信号的采样率的一部分,并且等于频带的索引除以频带的总数。频带的总数通常等于时域信号的长度,但是仅向索引小于一半长度的频带提供接入,因为它们对应于低于奈奎斯特频率的频率。换句话说,给定长度为N的信号,频谱中将有N / 2个频带。

     

例如,如果构造的FFT的timeSize为1024和   如果一个44100 Hz的sampleRate,则该频谱将包含值   低于22010 Hz的频率,即奈奎斯特频率(一半)   采样率)。如果你要求5号频段的值,这将是   对应于以5/1024 * 44100 =为中心的频带   0.0048828125 * 44100 = 215 Hz。该频带的宽度等于2/1024,表示为总带宽的一部分   光谱。频谱的总带宽等于奈奎斯特   频率,在这种情况下是22100,所以带宽等于   大约50赫兹。你没有必要记住所有这些   关系,虽然了解它们是件好事。 getFreq   允许您以Hz的频率和方法查询频谱   getBandWidth将返回每个频段的带宽,单位为Hz   光谱。

来自Minim Manual, FFT section