2017-05-12 9 views
0

私はLibrosaを使用してモノラルギターのオーディオ信号を録音しています。ピッチを検出するためのオーディオ信号のスライシング

私は、発症時刻に応じて信号を「スライス」して、正しい時刻に音符の変化を検出するのがよいと考えました。

リブロースは、発症前に極小を検出するfunctionを提供します。私はそれらのタイミングをチェックし、それらは正しい。

ここでは、元の信号の波形と最小値の時間を示します。

[ 266240 552960 840704 1161728 1427968 1735680 1994752] 

waveform

演奏メロディが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戻るいくつかのより多くの "正常" 値に対し類似した値だけでなく、いくつかのランダムな値:

wholespectrogram

:これは、全体の信号からスペクトログラムである

242.748000585 
10650.0394232 
275.25299319 
145.552578747 
154.725859019 
7828.70876515 
174.180627765 
183.731497068 

これは、たとえば、スライス1のスペクトログラム(E4の注釈)です: spectrograme4

ご覧のとおり、スライスは正しく行われています。しかし、いくつかの問題があります。まず、スペクトログラムにオクターブの問題があります。私はそれにいくつかの問題を期待していた。しかし、私が上記の3つの方法から得た結果はちょうど非常に奇妙です。

これは私の信号処理の理解やコードに問題がありますか?

答えて

3

これは信号処理の理解やコードに問題がありますか?

コードはわかりやすく表示されます。

検出したい周波数は、ピッチの基本周波数です(問題は「f0推定」とも呼ばれます)。

freq_from_fftのようなものを使用する前に、信号にバンドパスフィルタをかけて、ガベージトランジェントと低周波ノイズ(信号に含まれるもの)を取り除きますが、問題には関係ありません。

E2(82 Hz)〜F6(1,397 Hz)のアコースティックギターの場合、基本周波数の範囲を考えてみましょう。つまり、〜80Hz以下〜1,400Hz以下のものを取り除くことができます(バンドパスの例についてはhereを参照)。フィルタリングした後、ピーク検出を実行してピッチを見つけます(基本が実際に最もエネルギーを持っていると仮定して)。

もう1つの戦略は、各スライスの最初のXサンプルを無視することです。これらは、パーカッシブで、高調波ではなく、とにかく多くの情報を提供するものではありません。だから、あなたのスライスのうち、あなたのサンプルの最後の〜90%を見てください。

これはすべて、f0や基本周波数推定のための大きな仕事があるということです。良い出発点はISMIRです。

最後に、Librosaのpiptrack機能は、あなたが望むだけの機能を果たします。

関連する問題