0

FFT からピッチを見つけることに関するトピックがたくさんあることは知っています。データ サンプルを時間領域から周波数領域に変換することで、プロセス全体を十分に理解できましたが、まだいくつかの領域があります (おそらくより高度な)私は少し立ち往生しています。

私は現在のプロセスを一歩一歩進んでいきますので、誰かが私がどこで間違っているのかを理解するのを手伝ってくれることを願っています!

始める前に、ここで使用している例は、Logic で作成した Wav ファイルです。これは、A スケールのピアノ プリセットであり、キー A4から始まり、単にスケールを上げます (A4、B4、C#) 5、D5...) 120 bpmで合計4 秒間、半小節ごとに. 役立つ場合は、wav へのリンクを次に示します。

ステップ 1: メタデータと実際のサンプル データを解析します。メタデータ: channels => 2, sample_rate => 44100, byte_rate => 176400, bits_per_sample => 16, data_chunk_size => 705600, data => ...

ステップ 2: 2 つのチャネルがあるため、対応するサンプル データでいっぱいの左右の配列を用意し、それぞれを FFT に通します。各 FFT の結果から、特定の周波数の振幅と位相がわかります

ステップ 3: 各 FFT の最大振幅を見つける必要があります。これを行うには、実数/複素数の結果のすべての大きさを見つけてから、最大値を見つけます。私はMatlabを使って私を助けているので、max(abs(fft(data))). 各 FFT の最大値を見つけて得た値は1275.61084.0 でした。

ステップ 4: それぞれの FFT からそれらの最大値のインデックスを見つけ、マッピングされた周波数領域値のそのインデックスで周波数を見つけます。これにより、 1177.0 Hz1177.5 Hzが得られました。

迷っているところです!時間領域グラフをプロットし、周期を見て A4 の周期を知るだけでピッチがA4であることがわかりましたが、 FFT。私を指すための助け/場所は大歓迎です!

4

1 に答える 1

1

A4は通常440Hzです。私の推測では、440Hz の 3 次高調波が検出され、1 つずれているエラーが発生していると思われます。

使用している手順に関する観察事項を次に示します。

ステップ2:

両方のチャネルの分析を実行しても、何も得られない可能性があります。2つを合計してモノラル信号に変換します

ステップ 3:

これは、ポリフォニック信号 (または実際のモノフォニック楽器信号) では確実に機能しません。さらに、モノフォニック信号では、隣接する 2 つのビンからのパワーが同じ値を持つ場合があります。これは、各ビンが周波数応答に指数テールを持つバンドパス フィルター。正確に 2 つの帯域の中間に位置する信号は、両方に均等に寄与します。実際の信号の場合、どちらの帯域も支配的な周波数であるにもかかわらず、スペクトル内で最高のエネルギーを持たない場合があります。高調波が存在し、大きくなる可能性があることに注意してください。また、一部の実際の楽器のサウンドでは、根本的に部分音の最高のエネルギーさえない場合があることに注意してください。

FFT の位相成分は、バンドを跨いでいることを示す多くの手がかりを与えてくれます。

ステップ 4:

最高のエネルギーを持つ FFT ビンの中心周波数を見つけています。音階は 2 を底とする対数であるため、これは高い周波数では妥当な概算ですが、低い周波数では大きな FFT を使用しても機能しません (この場合、多くの CPU サイクルを消費し、損失が発生します)。時間解像度)。

これよりも良いことを行うには、短時間フーリエ変換を使用して、i) FFT データの連続するウィンドウからの位相 (Phi) ii) およびその F = dPhi/dt を利用 できます。

これにより、かなり正確な結果を得ることができます。

于 2014-11-30T18:53:12.097 に答える