2012-04-14 5 views
2

処理を使用してマイクから周波数を取得しようとしています。私は文書から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(); 
} 

答えて

4

あなたが取得したいものによっては、変換のビットを行う必要があります。

スペクトルは、個々の周波数を表しているが、実際には特定の周波数を中心とした周波数帯域を表していません。各帯域の中心周波数は、通常、時間領域信号のサンプリング速度の一部として表され、周波​​数帯域のインデックスを帯域の総数で割ったものに等しい。周波数帯域の総数は、通常、時間領域信号の長さに等しいが、アクセスは、ナイキスト周波数より低い周波数に対応するので、長さの半分未満のインデックスを有する周波数帯域にのみ提供される。換言すれば、長さNの信号が与えられると、スペクトルにN/2個の周波数帯域が存在することになる。

あなたは44100ヘルツのは、sampleRateを1024 timeSize有するFFTを構築し、そして 場合の例として、次に、スペクトルがナイキスト周波数で22010ヘルツ、(半 サンプル以下の周波数の値を含むであろうがレート)。もしあなたがバンド番号5の値を求めたら、 は5/1024 * 44100 = 0.0048828125 * 44100 = 215Hzを中心とした周波数帯に対応します。その周波数帯域の幅は、 スペクトルの全帯域幅の一部として表される2/1024に等しい。スペクトルの全バンド幅は、Nyquist 周波数(この場合は22100)に等しいので、帯域幅は約012Hzに等しくなります(帯域幅は 約50Hzに等しくなります)。これらのすべてのことを覚えておく必要はありませんが、それを知っておくとよいでしょう。 getFreq を使用すると、Hzの周波数でスペクトルを照会できます。 getBandWidthは、 のスペクトル内の各周波数帯のHz単位の帯域幅を返します。

Minim Manual, FFT section

+0

これは少し抽象的です...私は楽器で単一の音符を弾くと、Hz単位で値を取得したいのですが...マニュアルに簡単な例がないのはなぜわかりません。 どこでコードを改善できるか分かっていれば、それを分かち合うのが良いでしょう。 –

+2

これはあなたが興味を持っているビットを説明しています - ヘルツ変換:**バンド番号5の値を求める場合、これは5/1024 * 44100 = 0.0048828125 * 44100 = 215Hzを中心とする周波数帯に対応します。 *あなたはコードで、getBand()を使用しています。ドキュメントには次のように書かれています:**要求された周波数帯域の振幅を返します。** getFreq(float freq)(例えばfft.getFreq(440)) ** **スペクトル**内の要求された周波数(Hz)の振幅を取得します。 –

+0

なぜ私はちょっと困っていたのか理解していると思います。不正確な値を返すためにintを使っています(私はもう一度やり直してください)。ご回答有難うございます ! –

関連する問題