2016-05-07 13 views
0

私が達成しようとしているのは、オーディオファイル内の別々の音符を区別することです。簡単にするために、2つの音符が次々に演奏されると言うことができる。主な質問は、次の音符がいつ演奏されるかを決める方法です。
私がすでに行ってきたことは、オーディオファイルからサンプルを読み込み、JTransformsライブラリを使ってそれらのサンプルに対してフーリエ変換を行うことです。ここに私が得るものがある:
piano note E
次に、FFTから返されたデータに基づいてスペクトルを計算しました。これは私が得たものです:
piano note E
グラフの大きな「列」には高調波があり、小さなものにはノイズとその他の高調波の倍音があります。注意点FFTアルゴリズム

その後、私はオーディオファイルと同じ処理をしようとしましたが、2つの音符が次々と再生されましたが、結果は同じでした。

このようなデータを視覚化するための軽量で高速なライブラリをご存知の方はいらっしゃいますか?より大きなデータセットにJFreeChartを使用することは、私のプロセッサにとって大きな苦痛です。

+2

音符を特定する場合は、[**ピッチ検出**](https://en.wikipedia.org/wiki/Pitch_detection_algorithm)を実行する必要があります。ピッチは周波数と同じではありません。基本成分(f0)の周波数と同じことさえありません。ピッチ検出の一般的な方法であるHarmonic Product Spectrumを読んでください。 –

+0

私はこれが信号処理に関係していると信じています。 私はあなたがフィルターを適用する必要があると思う(周波数が信号に存在するかどうかを確認するためにバンドパスフィルターのように)。基本的にA、B、C、Dなどを確認するためにバンドパスフィルターを使用してください。 FFTを使用すると、特定の音符が周波数基準であるため、別の音符より前に演奏されたかどうかを知る方法がありません。 (バンドパスフィルタを使用して)ノートを見つけるまで、そして同じメソッドを適用する別の時間サンプルを取るまで、信号をチェック(FFTを適用)してみてください。 計算コストがかかるかどうかわかりません。 –

+0

@PaulRここでは、stackoverflowでシグナル処理についてのあなたの記事をたくさん見ましたが、この分野で研究を分かち合うことを決めたのであれば、何らかのブログがありますか?私はstackoverflow以外の何かを介してあなたと連絡を取ることができますか?私は現在、ピッチ認識、音声認識、ニューラルネットワークを含む多くのサブプロジェクトを持ち、インターネット上の情報の一部を読み上げる巨大なプロジェクトに取り組んでいます。 –

答えて

1

異なる周波数の連続した周波数バーストおよびそれらの時間領域パラメータのいくつかを検出するために、(予想されるバースト長よりも短い長さの)短いFFTウィンドウを重複して使用し、周波数ピークの相対的な大きさが、またはしきい値を上回る/下回る。あなたが知っていれば、先験的な周波数が含まれていますが、FFTの代わりにGoertzelフィルタを使用することができます。スライディングウィンドウや逐次近似を使用すると、より細かい時間領域の精度が得られます。

データの十分に短い時間領域のウィンドウ上で(信頼性のない単純なFFTの大きさの代わりに)ピッチ検出/推定方法を使用する点を除いて、ピッチノート(音楽など)の場合は同様のことができます。

+0

_expected burst length_とはどういう意味ですか?サンプルまたは時間(秒など)を持つ配列の長さ? Btw、Goertzelフィルターは私の場合にはあまり良くありません。なぜなら、私はこれらの周波数が出現すると周波数**と**を見つけることを試みているからです。 –

+0

ウィンドウの長さは、周波数分解能のトレードオフに影響します。したがって、より短い/短い時間分解能(より短いトーンに必要な秒またはサンプルのいずれか)は、より短いウィンドウを必要とする。ウィンドウ付きGoertzelフィルタは、ウィンドウ付きFFTと同じです(同じウィンドウ長の場合は1ビン)。 – hotpaw2

関連する問題