我尝试使用Processing从麦克风获取频率。我已经混合了文档中的两个示例,但“最高”并非真正以Hz为单位(a是440 Hz)。 你知道如何拥有比这更好的东西吗?在Minim处理中获取频率
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();
}
这有点抽象......当我在乐器上弹奏单个音符时,我想以Hz为单位获得价值......我不知道为什么手册中没有简单的例子。 如果您知道我可以在哪里改进我的代码,那么共享它将会很愉快。 – 2012-04-15 08:37:31
这解释了您感兴趣的位 - 赫兹转换:**如果您要求5号频段的值,则这将对应于以5/1024 * 44100 = 0.0048828125 * 44100 = 215 Hz为中心的频段。 *在你的代码中,你使用getBand(),其中,文档指出:**返回所请求频段的振幅**你可能想尝试getFreq(float freq)(例如fft.getFreq(440)) **获得频谱**中所需频率(Hz)的幅度。 – 2012-04-15 08:51:15
我想我明白为什么我有点麻烦,使用int来获得最高的返回不精确值(我在再次尝试并在未来发布我的代码时)。感谢您的回答 ! – 2012-04-15 10:24:51