Limitazioni dello spettro di prodotti armonici nel rilevamento del tono


10

Ho creato un algoritmo di rilevamento del passo usando HPS e sto affrontando un problema. Sono un principiante con l'elaborazione del segnale e questo sito mi ha aiutato prima, quindi ho pensato di chiedere.

Per i toni più alti ( eg. >C6:1046.50hz) sto iniziando a ottenere dati spazzatura dall'HPS. Maggiore è il tono, più immondizia ottengo (per immondizia intendo frequenze che non sono errori di ottava né armoniche e sono circa 1Hz-20Hz)

Quello che ho osservato empirico:

  1. i risultati sono peggiori per i toni più alti, se il fondamentale è sopra A6 o giù di lì, ottengo solo dati spazzatura.

  2. la FFT funziona bene anche per un tono molto alto, (intendo che il suo picco mostra sia la fondamentale o una delle sue armoniche, ma non la spazzatura)

  3. se abbasso il numero di armoniche che prendo in considerazione per l'HPS, la spazzatura diminuisce, ma ciò rende più difficile discriminare tra le fondamentali e le armoniche.

Ecco il mio algoritmo:

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

Qualsiasi aiuto è apprezzato!

AGGIORNAMENTO 1: Quindi, ci sono alcune altre cose che voglio aggiungere:

  1. La frequenza di campionamento su cui sto registrando è 44100 Hz
  2. Ho osservato che questo comportamento è appena visibile su una chitarra, ma molto visibile su un piano digitale (per la stessa nota suonata)
  3. Ecco il mio algoritmo hps, forse qualcuno con una maggiore esperienza può individuare un 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;
    }
    

1
Qual è la tua frequenza di campionamento? Quale filtro anti-aliasing hai prima dell'ADC?
Martin Thompson,

La mia frequenza di campionamento di registrazione è di 44100 Hz, mi dispiace non averlo menzionato prima.
Valentin Radu,

1. È necessario tracciare gli spettri intermedi e i prodotti utilizzati nel calcolo dell'HPS e vedere da dove sta ottenendo i valori sbagliati. 2. Chitarra e pianoforte sono inarmonici , il che farà sì che i picchi non si allineino perfettamente. Non sono sicuro di quanto effetto avrebbe, ma HPS assume spettri perfettamente armonici.
endolith

Risposte:


3

È possibile che nel segnale siano presenti troppi parziali armonici in questi toni più alti. L'algoritmo HPS è piuttosto semplice e si basa su quelle armoniche superiori per continuare a impilare fino a quando il fondamentale non emerge dallo sfondo. Naturalmente, dovremmo chiederci, qual è la tua frequenza di campionamento? Se è 8000 hz, allora c'è spazio solo per 3 armoniche di un tono di 1000 hz ...


Sto registrando a 44100 Hz, ma la tua risposta mi ha fatto riflettere. Forse è qualcosa di correlato e dovrei decidere quante armoniche prendere in considerazione nei miei hps a seconda di quanti picchi ho trovato nella mia FFT originale. Un'altra cosa che ho notato è che funziona molto meglio con gli strumenti a corda che con il mio piano elettrico, potrebbe essere perché le armoniche sono settimanali nel caso del piano?
Valentin Radu,

@mindnoise: gli strumenti a corda ad arco sono armonici, mentre gli strumenti a corda pizzicati o colpiti hanno en.wikipedia.org/wiki/Inarmonicity . Non sono sicuro se questo sia parte del problema
endolito il

@endolith potrebbe essere soprattutto perché: "Meno sono elastiche le stringhe (cioè più sono corte, più spesse e più rigide), più inarmonicità esibiscono ". e sto ottenendo l'errore esattamente su quei tipi di stringhe (note alte). In realtà, il fondamentale è sempre il freq più forte nella mia FFT quando si verifica il bug, quindi ha sicuramente a che fare con le armoniche o l'algoritmo hps, tuttavia non sono sicuro del motivo per cui ricevo immondizia da 20-50 hz per un fondamentale di 1500 hz. pubblicherà l'algoritmo hps.
Valentin Radu,

1
@mindnoise: "L'armonia influenza in gran parte le note più basse e più alte del piano ... Le corde più basse, che dovrebbero essere le più lunghe, sono più limitate dalle dimensioni del piano. Il progettista di un piano corto è costretto a usare corde spesse per aumentare la densità di massa e quindi guidate verso l'armonia. Le corde più alte devono essere sotto la massima tensione, ma devono anche essere sottili per consentire una bassa densità di massa. La resistenza limitata dell'acciaio costringe il progettista di pianoforti a usare molto stringhe le cui lunghezze d'onda corte generano così inarmonicità ".
endolith,

2

Per alcuni strumenti, il numero di armoniche significative prodotte può variare in diverse gamme di tonalità. Le parti parziali delle note più basse e più alte di alcuni strumenti fisici possono mostrare una maggiore inarmonicità. Il numero di armoniche che possono adattarsi al di sotto del valore soglia del filtro antialiasing al di sotto di Fs / 2 sarà sicuramente inferiore per le note molto alte. Il vostro stimatore del passo HPS può prendere in considerazione questi fattori.

Il transitorio di attacco di alcuni strumenti può produrre una banda spettrale aarmonica di rumore che può sovrapporsi alla regione di ricerca HPS di alcuni toni o delle loro armoniche significative.

Potenzialmente, le sfumature di frequenze molto alte potrebbero persino avvolgere Fs / 2 se il filtro passa basso prima dell'ADC audio non ha un'attenuazione della banda di arresto sufficiente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.