0

携帯電話のマイクから入力を受け取り、周波数を計算するアプリを作成しました。Jtransform ライブラリを使用して FFT を計算し、周波数を計算しています。

この件に関する以前の質問に従いましたが、これが私が選択した方法です。

sampleSize = 1024
sampleRate = 8000

audioData is the array I have filled with mic input
fft.complexForward(audioData)

このメソッドは fft を計算し、実数と虚数を順番に格納します

re[] = real number array
im[] = imaginary number array
magnitude[i] = math.sqrt((re[i]*re[i])+(im[i]*im[i]))

次に、最大の大きさ/ピークを取得します

Frequency = sampleRate * peak/sampleSize

現在、この数値は急速に変化しており、一定の範囲内にとどまることさえありません (私の口笛/ギターの弦)

既知のギター弦周波数の配列があります (オープン E 弦は 82.407 Hz)。計算値は 1 秒間に何度も変動するため、範囲内外でこれらを比較することはまったくできません。

より安定した周波数を得るためにこの問題に適用できる方法はありますか? それとも、これはギター弦の周波数を取得する正しい方法ですか?

ありがとうございました

4

2 に答える 2

0

FFT 結果のピーク振幅は、ギターのピッチ周波数を決定する正しい方法ではありません。

音楽のピッチは人間の心理音響現象であり、多くの場合、スペクトルのピーク周波数とは大きく異なります。信頼できる結果を得るには、ピーク周波数推定器ではなく、ピッチ検出または推定方法を使用する必要があります。このようなピッチ推定方法には、加重自己相関および同様のラグ評価器、ケプストラム/ケプストラム法、ハーモニック プロダクト スペクトル、および RAPT や YAAPT などの複合アルゴリズムが含まれます。などなど、ピッチ推定法に関する研究論文は数多くあります。

于 2013-05-23T02:09:20.703 に答える