我嘗試使用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