Batasan Spectrum Produk Harmonik dalam deteksi pitch

10

Saya telah membuat algoritma deteksi pitch menggunakan HPS dan saya menghadapi masalah. Saya seorang pemula dengan pemrosesan sinyal dan situs ini membantu saya sebelumnya, jadi saya pikir saya harus bertanya.

Untuk nada tinggi ( eg. >C6:1046.50hz) saya mulai mendapatkan data sampah dari HPS. Semakin tinggi pitch semakin banyak sampah yang saya dapatkan (oleh sampah saya maksud frekuensi yang bukan kesalahan oktaf atau harmonik dan sekitar 1Hz-20Hz)

Apa yang saya amati secara empiris:

  1. hasilnya terburuk untuk nada tinggi, jika fundamentalnya di atas A6 atau lebih, saya hanya mendapatkan data sampah.

  2. FFT bekerja dengan baik bahkan untuk nada yang sangat tinggi, (maksud saya maksudnya puncaknya menunjukkan fundamental atau salah satu harmoniknya, tetapi bukan sampah)

  3. jika saya menurunkan jumlah harmonik yang saya pertimbangkan untuk HPS, sampahnya berkurang, tetapi itu membuat lebih sulit untuk membedakan antara fundamental dan harmonik.

Ini algoritma saya:

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

Bantuan apa pun dihargai!

UPDATE 1: Jadi, ada beberapa hal lagi yang ingin saya tambahkan:

  1. Tingkat sampel yang saya rekam adalah 44100 Hz
  2. Saya telah mengamati bahwa perilaku ini hampir tidak terlihat pada gitar, tetapi sangat terlihat pada piano digital (untuk nada yang sama dimainkan)
  3. Berikut ini adalah algoritma hps saya, mungkin seseorang dengan pengalaman lebih besar dapat menemukan masalah.

    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;
    }
    
Valentin Radu
sumber
1
Berapa tingkat sampel Anda? Filter anti-aliasing apa yang Anda dapatkan sebelum ADC?
Martin Thompson
Tingkat sampel rekaman saya adalah 44100 Hz, maaf saya tidak menyebutkannya sebelumnya.
Valentin Radu
1. Anda perlu memplot spektrum menengah dan produk yang digunakan dalam perhitungan HPS dan melihat dari mana ia mendapatkan nilai yang salah. 2. Gitar dan piano tidak harmonis , yang akan menyebabkan puncak tidak berbaris dengan sempurna. Tidak yakin berapa banyak efek ini akan terjadi, tetapi HPS mengasumsikan spektrum harmonik sempurna.
endolith

Jawaban:

3

Bisa jadi parsial harmonik terlalu sedikit hadir dalam sinyal di nada yang lebih tinggi ini. Algoritma HPS sangat sederhana dan bergantung pada harmonisa atas untuk terus menumpuk hingga fundamental muncul dari latar belakang. Tentu saja, kita harus bertanya-tanya, berapa laju sampling Anda? Jika 8000 hz, maka hanya ada ruang untuk 3 harmonisa dari pitch 1000 hz ...

Matt M.
sumber
Saya merekam pada 44100 Hz, tetapi masih jawaban Anda membuat saya berpikir tentang hal itu. Mungkin ini sesuatu yang berhubungan dan saya harus memutuskan berapa banyak harmonisa untuk dipertimbangkan dalam hps saya tergantung pada berapa banyak puncak yang saya temukan di FFT asli saya. Hal lain yang saya amati adalah bahwa ia bekerja jauh lebih baik dengan instrumen senar daripada dengan piano listrik saya, mungkinkah ini karena harmonik lebih disukai dalam kasus piano?
Valentin Radu
@mindnoise: Instrumen string yang ditekuk bersifat harmonis, sedangkan instrumen senar yang dipetik atau dipukul memiliki en.wikipedia.org/wiki/Inharmonicity . Tidak yakin apakah itu bagian dari masalah
endolith
@endolith bisa jadi terutama karena: "Semakin tidak elastis senarnya (yaitu, semakin pendek, lebih tebal, dan lebih kaku), semakin inharmonisitasnya ." dan saya mendapatkan kesalahan persis pada jenis-jenis string (nada tinggi). Sebenarnya, fundamental selalu freq terkuat di FFT saya ketika bug terjadi, jadi pasti ada hubungannya dengan harmonik atau algoritma hps, namun saya tidak yakin mengapa saya mendapatkan 20-50 hz sampah untuk fundamental 1500 hz. akan memposting algoritma hps.
Valentin Radu
1
@mindnoise: "Ketidakarmonisan sebagian besar memengaruhi nada terendah dan tertinggi di piano ... Senar terendah, yang harus paling panjang, paling dibatasi oleh ukuran piano. Perancang piano pendek terpaksa menggunakan string tebal untuk meningkatkan kepadatan massa dan dengan demikian didorong ke inharmonicity. String tertinggi harus berada di bawah ketegangan terbesar, namun juga harus tipis untuk memungkinkan kepadatan massa rendah. Kekuatan baja yang terbatas memaksa desainer piano untuk menggunakan sangat pendek string yang panjang gelombang pendeknya menghasilkan inharmonicity. "
endolit
2

Untuk beberapa instrumen, jumlah harmonisa signifikan yang dihasilkan dapat berubah pada rentang nada yang berbeda. Bagian-bagian dari not yang paling rendah dan paling tinggi untuk beberapa instrumen fisik mungkin menunjukkan ketidakarmonisan yang lebih besar. Jumlah harmonisa yang dapat ditampung di bawah cutoff filter anti-alias di bawah Fs / 2 tentu akan lebih rendah untuk nada yang sangat tinggi. Pengukur pitch HPS Anda ingin mempertimbangkan faktor-faktor itu.

Serangan sementara dari beberapa instrumen dapat menghasilkan pita spektrum aharmonik kebisingan yang mungkin tumpang tindih dengan wilayah pencarian HPS dari beberapa nada atau harmonik signifikan mereka.

Berpotensi, nada frekuensi yang sangat tinggi bahkan mungkin membungkus Fs / 2 jika filter low pass sebelum ADC audio tidak memiliki atenuasi stop band yang cukup baik.

hotpaw2
sumber