私はLibrosaを使用してモノラルギターのオーディオ信号を録音しています。ピッチを検出するためのオーディオ信号のスライシング
私は、発症時刻に応じて信号を「スライス」して、正しい時刻に音符の変化を検出するのがよいと考えました。
リブロースは、発症前に極小を検出するfunctionを提供します。私はそれらのタイミングをチェックし、それらは正しい。
ここでは、元の信号の波形と最小値の時間を示します。
[ 266240 552960 840704 1161728 1427968 1735680 1994752]
演奏メロディがE4、F4、F#4 ...、B4です。
したがって、理想的には330Hz、350Hz、...、493Hz(約)の結果が必要です。
このように、minima
配列の時刻は、ノートを再生する直前の時刻を表します。
しかし、スライスされた信号(スライスあたり1つの音符だけの10-12秒)では、私の周波数検出方法は実際には貧弱な結果を示します。 freq_from
機能がhereから直接取得され
y, sr = librosa.load(filename, sr=40000)
onset_frames = librosa.onset.onset_detect(y=y, sr=sr)
oenv = librosa.onset.onset_strength(y=y, sr=sr)
onset_bt = librosa.onset.onset_backtrack(onset_frames, oenv)
# Converting those times from frames to samples.
new_onset_bt = librosa.frames_to_samples(onset_bt)
slices = np.split(y, new_onset_bt[1:])
for i in range(0, len(slices)):
print freq_from_hps(slices[i], 40000)
print freq_from_autocorr(slices[i], 40000)
print freq_from_fft(slices[i], 40000)
:私は自分のコードにバグを見ることができないので、私は混乱しています。
これはメソッドの精度が悪いと思われますが、私は狂った結果を得ています。具体的には、freq_from_hps
戻り値:
1.33818658287
1.2078047577
0.802142642257
0.531096911977
0.987532329094
0.559638134414
0.953497587952
0.628980979055
は、これらの値は、(Hzで!)8つの対応するスライスの8つのピッチことになっています。 10000Hz周辺
freq_from_fft
戻りfreq_from_autocorr
戻るいくつかのより多くの "正常" 値に対し類似した値だけでなく、いくつかのランダムな値:
:これは、全体の信号からスペクトログラムである
242.748000585
10650.0394232
275.25299319
145.552578747
154.725859019
7828.70876515
174.180627765
183.731497068
これは、たとえば、スライス1のスペクトログラム(E4の注釈)です:
ご覧のとおり、スライスは正しく行われています。しかし、いくつかの問題があります。まず、スペクトログラムにオクターブの問題があります。私はそれにいくつかの問題を期待していた。しかし、私が上記の3つの方法から得た結果はちょうど非常に奇妙です。
これは私の信号処理の理解やコードに問題がありますか?