処理を使用してマイクから周波数を取得しようとしています。私は文書から2つの例をミックスしていますが、「最高」は実際には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単位で値を取得したいのですが...マニュアルに簡単な例がないのはなぜわかりません。 どこでコードを改善できるか分かっていれば、それを分かち合うのが良いでしょう。 –
これはあなたが興味を持っているビットを説明しています - ヘルツ変換:**バンド番号5の値を求める場合、これは5/1024 * 44100 = 0.0048828125 * 44100 = 215Hzを中心とする周波数帯に対応します。 *あなたはコードで、getBand()を使用しています。ドキュメントには次のように書かれています:**要求された周波数帯域の振幅を返します。** getFreq(float freq)(例えばfft.getFreq(440)) ** **スペクトル**内の要求された周波数(Hz)の振幅を取得します。 –
なぜ私はちょっと困っていたのか理解していると思います。不正確な値を返すためにintを使っています(私はもう一度やり直してください)。ご回答有難うございます ! –