0

私は現在、2年目のプロジェクトに取り組んでいます。Javaでチューナーをコーディングすることになっています。私はギターチューナーをすることにしました。

インターネットで調べたところ、FFT を実行するための Java コードが見つかりました。私はそれを少し変更し、それを理解し、テストしました。私はそれが正常に動作することを知っています (グラフを作成し、単純なサイン関数を使用してさまざまなピークを調べました)。

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

したがって、たとえば FFT の最初の 5 つのピークを見つけて、それらのインデックスを提供するメソッドを作成したいと思います。

最初に、スペクトログラムの各ポイントを 2 つずつ比較する簡単な方法を実行し、符号が変化したときに、そこにピークがあることを知りました。この方法は、理想的な信号 (ノイズなし) でうまく機能します。でもノイズを入れたら全然ダメ。

私はJavaが本当に苦手です(私は実際にこのプロジェクトから始めました。基本的に、上記の単純な関数は私のマスターピースです....私のレベルを理解してください)。

誰でも私を助けることができますか?とても感謝しております!:) 前もって感謝します!

すてきな一日を!

ファイアエンジェル

4

1 に答える 1

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]];
}

非常に基本的で非常に強引ですが、任務に向けて適切な軌道に乗せることができます。

データを平滑化して代表的なものにし、平滑化されたデータが示す位置で実際のピークを見つけるアルゴリズムをいじる必要があります (正確ではないため)。

于 2012-05-04T18:03:47.713 に答える