2012-05-04 6 views
0

私は現在2年目のプロジェクトに取り組んでいます。私はjavaでチューナーをコーディングするはずです。私はギターチューナーを選んだ。スペクトログラムのピークを見つける

インターネットを見回した後、私はJavaコードでFFTを実行しました。私はそれを少し変更し、それを理解し、それをテストしました。私はそれがうまく動作する(私はそれのグラフを作って、単純な正弦関数を使用して別のピークを見て)知っている。

私は今、基本周波数を見つけようとしています。私が理解していることから、この周波数は最初のピークによって与えられます。

私は、例えば、私のFFTの最初の5つのピークを見つけ、それらのインデックスを私に与える方法を作りたいと思うでしょう。

私はまず、私のスペクトログラムの2つの点を2つずつ比較し、記号が変わったときにピークがあることがわかったところで簡単な方法をとった。この方法は、理想的な信号(雑音なし)で効果的です。しかし、ノイズを加えると完全に無駄になります。

私は実際にこのプロジェクトで始まりました(実際に私が上で説明した基本的な機能は私のマスターピースです...)。私のレベルのアイデアが得られます。

誰でも手伝ってもらえますか?とても感謝しております! :) 事前に感謝!

素晴らしい一日を!

fireangel

+0

ピッチはFFTのピーク周波数ではありません。ピッチ周波数は、最初のピークまたはピークではない可能性があります。特に、ギターの低い弦から録音された音の場合。 – hotpaw2

+0

可能なdupの:http://stackoverflow.com/questions/8699360/audio-analysis-frequency-vs-pitch – hotpaw2

+0

あなたのためにhotpaw2に感謝します。私はピッチの概念も考え出した。私が理解したところでは、ピッチは周波数に関連しているので、周波数を見つけることでピッチを得ることができると思った。 – fireangel3000

答えて

0

私はあなたの最善の策は、配列としてすべての値を読み込み、それらを介して実行し、「円滑な」彼らはいくつかの種類の移動平均を使用してすることになるだろうと思います。

その後、より滑らかなカーブになります。この曲線を使用してピークを見つけ、元のデータに戻ってピークインデックスを使用して実際のピークを見つけます。

擬似コード:

// Your raw data 
int[] data = getData(); 

// This is an array to hold your 'smoothed' data 
int[] newData = new int[data.length]; 

// Iterate over your data, smooth it, and read it into your smoothed array 
for (i < data.length) { 
    newData[i] = (data[i-2] + data[i-1] + data[i] + data[i+1] + data[i+2])/5; 
} 

// Use your existing peak finding function on your smoothed data, and get 
// another array of the indexes your peaks occur. 
int[] peakIndexes = yourPeakFindingFunction(newData); 

// Create an array to hold your final values. 
int[] peakValues = new int[peakIndexes.length]; 

// Iterate over your peak indexes and get the original data's value at that location. 
for(i < peakIndexes.length) { 
    peadValues[i] = data[peakIndexes[i]]; 
} 

非常に基本的な、非常にブルートフォースが、それは割り当てのための正しい軌道に乗ってあなたを取得する必要があります。

データをスムージングするためのアルゴリズムを演奏する必要があります。これは代表的なものであり、スムージングされたデータによって示される位置での実際のピークを見つけるためです(正確ではないため)。

+0

こんにちはCharles.Thanksあなたの答えのためにたくさん。私が正しく理解していれば、平滑化は私の生データの5つの値の平均値を取ることです。このように、一つの本当のピークのために、騒音から来るすべての小さなピークは減少するでしょう。あれは正しいですか? しかし、私が理解していないことは、最初のピークを探すと、実際のピークのインデックスに対応しないピークのインデックスを取得することです。そして、私は実際のものを取り戻す方法を見ていません.... – fireangel3000

+0

基本的には、小さなスパイクを平均化するだけです。平滑化された線は、フラット、上向き、下向き、ピーク、等問題は、元のデータの「本当の」ピークのいずれかの側に重大な下向きまたは上向きのスパイクがある場合、平均的な一方向または他の方向に歪み、人為的にいずれかの方向にピークを少し動かすことができることです。これらのノイズピークの影響を減らすには、アルゴリズムを使用する必要があります。 – Charles

+0

答えCharlesさんありがとう。 私は実際にハーモニック・プロダクト・スペクトラムを使って完全に新しいアプローチをとったが、今はうまく動作する。あなたの助けをたくさんあります! – fireangel3000

関連する問題