Гармонические ограничения спектра продуктов при обнаружении основного тона


10

Я сделал алгоритм определения высоты тона, используя HPS, и я столкнулся с проблемой. Я новичок в обработке сигналов, и этот сайт помог мне раньше, поэтому я должен спросить.

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

Что я наблюдал эмпирически:

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

  2. БПФ отлично работает даже для очень высокого шага (под тонкой я имею в виду, что его пик показывает либо фундаментальную, либо одну из его гармоник, но не мусор)

  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. Вам нужно построить промежуточные спектры и продукты, используемые в расчете HPS, и увидеть, откуда он получает неправильные значения. 2. Гитара и фортепиано негармоничны , что приводит к тому, что пики не выстраиваются идеально. Не уверен, какой эффект это будет иметь, но HPS предполагает совершенно гармоничные спектры.
Эндолит

Ответы:


3

Может быть так, что в этих более высоких частотах в сигнале присутствует слишком мало гармонических партиалов. Алгоритм HPS довольно прост и опирается на эти верхние гармоники, чтобы продолжать складываться до тех пор, пока фундаментальное значение не выйдет из фона. Конечно, мы должны задаться вопросом, какова ваша частота дискретизации? Если это 8000 Гц, то есть место только для 3 гармоник с шагом 1000 Гц ...


Я записываю на частоте 44100 Гц, но все же ваш ответ заставил меня задуматься об этом. Возможно, это как-то связано, и я должен решить, сколько гармоник нужно учитывать в моем hps, в зависимости от того, сколько пиков я нашел в моем оригинальном БПФ. Еще одна вещь, которую я заметил, заключается в том, что она лучше работает на струнных инструментах, чем на моем электрическом пианино. Может ли это быть из-за того, что в случае с пианино гармоники слабее?
Валентин Раду

@mindnoise: Струнные инструменты являются гармоничными, в то время как щипковые или ударные струнные инструменты имеют en.wikipedia.org/wiki/Inharmonicity . Не уверен, что это часть проблемы
эндолит

@endolith может быть особенно потому, что: «Чем менее упругие струны (то есть чем они короче, толще и жестче), тем больше негармоничности они проявляют ». и я получаю ошибку именно на этих типах строк (высокие ноты). На самом деле, фундаментальная частота всегда является самой сильной частотой в моем БПФ, когда возникает ошибка, поэтому она определенно связана с гармониками или алгоритмом hps, однако я не уверен, почему я получаю мусор 20-50 Гц для фундаментальной частоты 1500 Гц. опубликует алгоритм hps.
Валентин Раду

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

2

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.