Limitações do espectro harmônico de produtos na detecção de afinação

10

Eu criei um algoritmo de detecção de afinação usando HPS e estou enfrentando um problema. Eu sou iniciante no processamento de sinais e este site me ajudou antes, então eu deveria perguntar.

Para arremessos mais altos ( eg. >C6:1046.50hz), estou começando a obter dados de lixo do HPS. Quanto mais alto o tom, mais lixo fico (com lixo, quero dizer frequências que não são erros de oitava nem harmônicos e estão em torno de 1Hz a 20Hz)

O que eu observei empírico:

  1. os resultados são piores para agudos mais altos, se o fundamental estiver acima da A6 ou mais, recebo apenas dados de lixo.

  2. o FFT funciona bem mesmo para um tom muito alto (com o mínimo, quero dizer que seu pico mostra o fundamental ou um de seus harmônicos, mas não o lixo)

  3. se eu diminuir o número de harmônicos que considero para o HPS, o lixo diminui, mas isso dificulta a discriminação entre o fundamental e o harmônico.

Aqui está o meu algoritmo:

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

Qualquer ajuda é apreciada!

ATUALIZAÇÃO 1: Então, quero acrescentar mais algumas coisas:

  1. A taxa de amostragem em que estou gravando é de 44100 Hz
  2. Observei que esse comportamento é pouco visível em um violão, mas muito visível em um piano digital (para a mesma nota tocada)
  3. Aqui está o meu algoritmo hps, talvez alguém com maior experiência possa detectar um problema.

    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
fonte
11
Qual é a sua taxa de amostra? Qual filtro anti-aliasing você tem antes do ADC?
Martin Thompson
Minha taxa de amostragem de gravação é de 44100 Hz, desculpe não ter mencionado antes.
Valentin Radu
1. Você precisa plotar os espectros intermediários e os produtos usados ​​no cálculo do HPS e ver de onde está obtendo os valores errados. 2. Guitarra e piano são inarmônicos , o que fará com que os picos não se alinhem perfeitamente. Não tenho certeza de quanto efeito isso teria, mas o HPS assume espectros perfeitamente harmônicos.
endolith 27/08/12

Respostas:

3

Pode ser que poucas parciais harmônicas estejam presentes no sinal nesses tons mais altos. O algoritmo HPS é bastante simples e depende desses harmônicos superiores para manter o empilhamento até o fundamental emergir do fundo. Claro, devemos nos perguntar, qual é a sua taxa de amostragem? Se é de 8000 hz, só há espaço para 3 harmônicos de um campo de 1000 hz ...

Matt M.
fonte
Estou gravando em 44100 Hz, mas ainda assim sua resposta me fez pensar sobre isso. Talvez seja algo relacionado e eu deva decidir quantos harmônicos considerar nos meus hps, dependendo de quantos picos encontrei na minha FFT original. Outra coisa que observei é que funciona muito melhor com instrumentos de cordas do que com o meu piano elétrico, isso poderia ser porque as harmônicas são semanais no caso do piano?
Valentin Radu
@mindnoise: Os instrumentos de corda curvada são harmônicos, enquanto os instrumentos de corda arrancada ou tocada têm en.wikipedia.org/wiki/Inharmonicity . Não tenho certeza se isso faz parte do problema #
21891
O @endolith pode ser especialmente porque: "Quanto menos elásticas forem as cordas (ou seja, quanto mais curtas, mais grossas e mais duras), maior a desarmonicidade que elas exibem ". e estou recebendo o erro exatamente nesses tipos de strings (notas altas). Na verdade, o fundamental é sempre a frequência mais forte na minha FFT quando o bug ocorre, por isso definitivamente tem a ver com harmônicos ou algoritmo hps, no entanto, não sei por que recebo lixo de 20 a 50 hz para um fundamental de 1500 hz. publicará o algoritmo hps.
Valentin Radu
11
@mindnoise: "A desarmonicidade afeta amplamente as notas mais alta e mais baixa do piano ... As cordas mais baixas, que teriam que ser as mais longas, são mais limitadas pelo tamanho do piano. O criador de um piano curto é forçado a usar cordas grossas para aumentar a densidade de massa e, portanto, conduzidas à desarmonicidade.As cordas mais altas devem estar sob a maior tensão, mas também devem ser finas para permitir uma baixa densidade de massa.A força limitada do aço força o projetista de piano a usar instrumentos muito curtos. cordas cujos comprimentos de onda curtos geram desarmonicidade ".
endolith
2

Para alguns instrumentos, o número de harmônicas significativas produzidas pode mudar em diferentes intervalos de afinação. As parciais das notas mais baixa e mais alta para alguns instrumentos físicos podem exibir maior desarmonicidade. O número de harmônicos que podem caber abaixo do ponto de corte do filtro anti-alias abaixo de Fs / 2 certamente será menor para notas muito altas. Seu estimador de pitch HPS pode querer levar esses fatores em consideração.

O transiente de ataque de alguns instrumentos pode produzir uma faixa espectral aharmonic de ruído que pode se sobrepor à região de pesquisa HPS de alguns arremessos ou seus harmônicos significativos.

Potencialmente, as conotações de frequências muito altas podem até envolver Fs / 2 se o filtro passa-baixo antes do ADC de áudio não tiver uma atenuação da banda de parada suficientemente boa.

hotpaw2
fonte