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.6と1084.0 でした。
ステップ 4: それぞれの FFT からそれらの最大値のインデックスを見つけ、マッピングされた周波数領域値のそのインデックスで周波数を見つけます。これにより、 1177.0 Hzと1177.5 Hzが得られました。
迷っているところです!時間領域グラフをプロットし、周期を見て A4 の周期を知るだけでピッチがA4であることがわかりましたが、 FFT。私を指すための助け/場所は大歓迎です!