Обмеження гармонійного спектру продукту при виявленні тону


10

Я створив алгоритм визначення тону за допомогою HPS і зіткнувся з проблемою. Я початківець з обробкою сигналів, і цей сайт мені раніше допомагав, тому я хоч і повинен запитати.

Для більш високих смол ( eg. >C6:1046.50hz) я починаю отримувати дані сміття з ГЕС. Чим вище крок, тим більше сміття я отримую (під сміттям я маю на увазі частоти, які не є октавними помилками і не гармоніками і становлять приблизно 1 Гц-20 Гц)

Що я емпірично спостерігав:

  1. результати є найгіршими для вищих смол, якщо фундаментальний показник вище A6 або близько того, я отримую лише дані про сміття.

  2. FFT працює чудово навіть для дуже високого кроку (я маю на увазі, що його пік показує або основну, або одну з гармонік, але не сміття)

  3. якщо я знижую кількість гармонік, які я беру до уваги щодо HPS, сміття зменшується, але це ускладнює дискримінацію між основними та гармоніками.

Ось мій алгоритм:

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

Будь-яка допомога вдячна!

ОНОВЛЕННЯ 1: Отже, я хочу додати ще кілька речей:

  1. Частота вибірки, яку я записую, становить 44100 Гц
  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
Який показник вибірки? Який фільтр проти згладжування у вас перед АЦП?
Мартін Томпсон

Моя частота вибірки запису - 44100 Гц, вибачте, що раніше про це не згадували.
Валентин Раду

1. Вам потрібно побудувати проміжні спектри та продукти, які використовуються в обчисленні ГПС, і подивитися, звідки отримують неправильні значення. 2. Гітара та фортепіано є негармонічними , через що вершини не вирівняються ідеально. Не впевнений, який ефект від цього матиме, але ГПС передбачає ідеально гармонічні спектри.
ендоліт

Відповіді:


3

Можливо, в цих вищих тонах сигналу присутній занадто мало гармонічних частин. Алгоритм HPS досить простий і покладається на ті верхні гармоніки, щоб продовжувати складатись до тих пір, поки фундаментальне не вийде з фону. Звичайно, нам слід поцікавитися, яка ваша частота вибірки? Якщо це 8000 Гц, то є лише місце для 3-х гармонік з тактовою частотою 1000 Гц ...


Я записую в 44100 Гц, але все ж ваша відповідь змусила мене задуматися. Можливо, це щось пов’язане, і я повинен вирішити, скільки гармонік слід враховувати в лінійках, залежно від того, скільки піків я знайшов у своєму первісному FFT. Інша річ, яку я помітив, - це те, що вона працює набагато краще на струнних інструментах, ніж на моєму електричному піаніно, чи це може бути, тому що гармоніки є тижнішими у випадку з фортепіано?
Валентин Раду

@mindnoise: Схилені струнні інструменти є гармонійними, а струнні та струнні інструменти мають en.wikipedia.org/wiki/Inharmonicity . Не впевнений, чи це частина проблеми
endolith

@endolith може бути особливо тим, що: "Чим менше пружні струни (тобто чим вони коротші, товщі та жорсткіші), тим більше негармонічності вони виявляють ". і я отримую помилку саме в тих типах рядків (високі ноти). Насправді основна завжди є найсильнішою частотою в моєму FFT, коли відбувається помилка, тому це, безумовно, пов'язане з гармоніками або алгоритмом hps, проте я не впевнений, чому я отримую 20-50 Гц сміття за основні 1500 Гц. опублікує алгоритм hps.
Валентин Раду

1
@mindnoise: "Негармонічність значною мірою впливає на найнижчі та найвищі ноти у фортепіано ... Найнижчі струни, які мали б бути найдовшими, найбільш обмежені розміром фортепіано. Дизайнер короткого фортепіано змушений використовувати товсті струни для збільшення щільності маси і, таким чином, призводять до негармонічності. Найвищі струни повинні бути під найбільшим натягом, але вони також повинні бути тонкими, щоб забезпечити низьку щільність маси. Обмежена міцність сталі змушує дизайнера фортепіано використовувати дуже короткий струни, короткі довжини хвиль таким чином породжують негармонічність ".
ендоліт

2

Для деяких інструментів кількість вироблених значних гармонік може змінюватися в різних діапазонах тону. Частини найнижчих і найвищих нот для деяких фізичних інструментів можуть виявляти більшу негармонічність. Кількість гармонік, які можуть поміститися нижче відрізаного фільтра проти псевдоніму нижче Fs / 2, безумовно, буде нижчим для дуже високих нот. Ваш Оцінювач висоти тонусу HPS хоче врахувати ці фактори.

Тимчасова атака деяких приладів може виробляти ахармонічну спектральну смугу шуму, яка може перекриватися областю пошуку HPS деяких смол або їх значними гармоніками.

Потенційно обертони дуже високих частот можуть навіть обернутися Fs / 2, якщо фільтр низьких частот перед аудіо АЦП не має достатньо хорошого ослаблення смуги зупинки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.