ピッチ検出における高調波製品スペクトルの制限


10

HPSを使用してピッチ検出アルゴリズムを作成しましたが、問題に直面しています。私は信号処理の初心者ですが、このサイトは以前から役に立ちました。

より高いピッチ(eg. >C6:1046.50hz)については、HPSからガベージデータを取得し始めています。ピッチが高いほど、多くのゴミが発生します(ゴミとは、オクターブエラーや高調波ではなく、約1Hz〜20Hzの周波数を意味します)

私が経験的に観察したこと:

  1. ピッチが高くなると結果は最悪になります。ファンダメンタルズがA6程度以上の場合、ガベージデータのみを取得します。

  2. FFTは、非常に高いピッチでも正常に機能します(細かく言うと、ピークは基本波またはその高調波のいずれかを示しますが、ガベージは示しません)。

  3. HPSで考慮する高調波の数を減らすと、ゴミは減りますが、基本波と高調波を区別するのが難しくなります。

これが私のアルゴリズムです:

->raw buffer -> hann window, 16384 samples, 50% overlap -> zero padding -> FFT -> HPS

どんな助けでもありがたいです!

更新1:では、追加したいことがいくつかあります。

  1. 私が記録しているサンプルレートは44100 Hzです
  2. この振る舞いはギターではほとんど見えないが、デジタルピアノでは非常によく見えることを確認しました(同じ演奏ノートに対して)
  3. これが私のhpsアルゴリズムです、多分経験のある人が問題を見つけることができます。

    int hps(float* spectrum, int spectrumSize, int harmonics) {
    
    int i, j, maxSearchIndex, maxBin;
    maxSearchIndex = spectrumSize/harmonics;
    
    maxBin = 1;
    for (j=1; j<=maxSearchIndex; j++) {
        for (i=1; i<=harmonics; i++) { 
            spectrum[j] *= spectrum[j*i];
        }
        if (spectrum[j] > spectrum[maxBin]) {
            maxBin = j;
        }
    }
    
    // Fixing octave too high errors    
    int correctMaxBin = 1;
    int maxsearch = maxBin * 3 / 4;
    for (i=2; i<maxsearch; i++) {
        if (spectrum[i] > spectrum[correctMaxBin]) {
            correctMaxBin = i;
        }
    }
    if (abs(correctMaxBin * 2 - maxBin) < 4) {
        if (spectrum[correctMaxBin]/spectrum[maxBin] > 0.2) {
            maxBin = correctMaxBin;
        }
    }
    
    return maxBin;
    }
    

1
あなたのサンプルレートは何ですか?ADCの前に、どのアンチエイリアスフィルターを入手しましたか?
マーティントンプソン

私の録音サンプルレートは44100 Hzです。
Valentin Radu

1. HPS計算で使用される中間スペクトルと積をプロットし、どこから間違った値を取得しているかを確認する必要があります。2.ギターとピアノは調和が取れていないため、ピークが完全に揃わない場合があります。これがどの程度の影響を与えるかはわかりませんが、HPSは完全な調和スペクトルを想定しています。
エンドリス

回答:


3

これらの高いピッチの信号に存在する高調波パーシャルが少なすぎる可能性があります。HPSアルゴリズムは非常にシンプルで、基本波がバックグラウンドから現れるまで、これらの高次高調波に依存して積み重ねていきます。もちろん、あなたのサンプリングレートはどれくらいですか?それが8000 hzの場合、1000 hzピッチの3つの高調波の余地があります...


私は44100 Hzで録音していますが、それでもあなたの回答でそれについて考えさせられました。多分それは何か関連していると私は私の元のFFTで見つけたピークの数に応じて私のhpで考慮するべき高調波の数を決定する必要があります。私が観察したもう1つのことは、弦楽器の方が私のエレクトリックピアノよりもはるかにうまく機能するということです。これは、ハーモニクスがピアノの場合は弱いためでしょうか?
Valentin Radu

@mindnoise:弦楽器の弦はハーモニックですが、弦楽器を弾いたり叩いたりするとen.wikipedia.org/wiki/Inharmonicityになります。それが問題の一部であるかどうかは
わかり

@endolithは特に次の理由で発生する可能性があります。「弦の弾力性が低いほど(つまり、弦が短く、太く、硬いほど)、不調和性が高くなります。」そして、私はそれらのタイプの文字列(高音)で正確にエラーを取得しています。実際、ファンダメンタルは、バグが発生したときのFFTで常に最も強い周波数であるため、高調波またはhpsアルゴリズムと確実に関係していますが、ファンダメンタル1500 hzで20-50hzのガベージが発生する理由がわかりません。hpsアルゴリズムをポストします。
Valentin Radu

1
@mindnoise: "非調和性は、ピアノの最低音と最高音に大きく影響します...最長である必要がある最低弦は、ピアノのサイズによって最も制限されます。短いピアノの設計者は、太い弦は質量密度を上げて不調和に陥ります。最も高い弦は最大の張力をかけなければなりませんが、低い質量密度を可能にするために細くする必要があります。スチールの強度が限られているため、ピアノの設計者は非常に短く使用する必要がありますそのため、波長が短いために不調和が生じます。」
エンドリス

2

一部の楽器では、生成される重要な高調波の数が異なるピッチ範囲で変化する場合があります。一部の物理楽器の最低音と最高音の部分音は、より不調和を示す場合があります。Fs / 2以下のアンチエイリアスフィルターカットオフ以下に収まる倍音の数は、非常に高いノートでは確実に低くなります。あなたのHPSピッチ推定者mdyは、これらの要因を考慮に入れたいと考えています。

一部の楽器のアタックトランジェントは、一部のピッチのHPSサーチ領域またはそれらの重要なハーモニクスとオーバーラップするノイズの非調和スペクトルバンドを生成する場合があります。

オーディオADCの前のローパスフィルターに十分な阻止帯域減衰がない場合、潜在的に、非常に高い周波数の倍音がFs / 2をラップする可能性さえあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.