Einschränkungen des harmonischen Produktspektrums bei der Tonhöhenerkennung

10

Ich habe einen Tonhöhenerkennungsalgorithmus mit HPS erstellt und stehe vor einem Problem. Ich bin ein Anfänger in der Signalverarbeitung und diese Seite hat mir schon früher geholfen, also sollte ich fragen.

Für höhere Tonhöhen ( eg. >C6:1046.50hz) fange ich an, Mülldaten vom HPS zu erhalten. Je höher die Tonhöhe, desto mehr Müll bekomme ich (mit Müll meine ich Frequenzen, die weder Oktavfehler noch Harmonische sind und zwischen 1 Hz und 20 Hz liegen).

Was ich empirisch beobachtet habe:

  1. Die Ergebnisse sind für höhere Tonhöhen am schlechtesten. Wenn die Grundwelle über A6 oder so liegt, erhalte ich nur Mülldaten.

  2. Die FFT funktioniert auch für eine sehr hohe Tonhöhe einwandfrei (mit gut meine ich, dass ihre Spitze entweder die Grundwelle oder eine ihrer Harmonischen zeigt, aber keinen Müll).

  3. Wenn ich die Anzahl der Harmonischen reduziere, die ich für das HPS berücksichtige, verringert sich der Müll, aber das macht es schwieriger, zwischen der Grundwelle und der Harmonischen zu unterscheiden.

Hier ist mein Algorithmus:

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

Jede Hilfe wird geschätzt!

UPDATE 1: Also, es gibt noch ein paar Dinge, die ich hinzufügen möchte:

  1. Die Abtastrate, mit der ich aufnehme, beträgt 44100 Hz
  2. Ich habe beobachtet, dass dieses Verhalten auf einer Gitarre kaum sichtbar ist, auf einem Digitalpiano jedoch sehr gut sichtbar (für dieselbe gespielte Note).
  3. Hier ist mein HP-Algorithmus. Vielleicht kann jemand mit größerer Erfahrung ein Problem erkennen.

    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
quelle
1
Wie hoch ist Ihre Abtastrate? Welchen Anti-Aliasing-Filter haben Sie vor dem ADC?
Martin Thompson
Meine Abtastrate beträgt 44100 Hz, leider habe ich sie vorher nicht erwähnt.
Valentin Radu
1. Sie müssen die in der HPS-Berechnung verwendeten Zwischenspektren und Produkte zeichnen und sehen, woher die falschen Werte stammen. 2. Gitarre und Klavier sind unharmonisch , was dazu führt, dass die Spitzen nicht perfekt ausgerichtet sind. Ich bin mir nicht sicher, wie stark dies wirken würde, aber HPS geht von perfekt harmonischen Spektren aus.
Endolith

Antworten:

3

Es kann sein, dass bei diesen höheren Tonhöhen zu wenige harmonische Teiltöne im Signal vorhanden sind. Der HPS-Algorithmus ist ziemlich einfach und stützt sich auf diese oberen Harmonischen, um sich weiter zu stapeln, bis die Grundwelle aus dem Hintergrund hervorgeht. Natürlich sollten wir uns fragen, wie hoch Ihre Abtastrate ist. Wenn es 8000 Hz sind, gibt es nur Platz für 3 Harmonische mit einer Tonhöhe von 1000 Hz ...

Matt M.
quelle
Ich nehme mit 44100 Hz auf, aber Ihre Antwort hat mich trotzdem zum Nachdenken gebracht. Vielleicht hängt es damit zusammen und ich sollte entscheiden, wie viele Harmonische in meinem HP berücksichtigt werden sollen, abhängig davon, wie viele Peaks ich in meiner ursprünglichen FFT gefunden habe. Eine andere Sache, die ich beobachtet habe, ist, dass es mit Streichinstrumenten viel besser funktioniert als mit meinem E-Piano. Könnte dies daran liegen, dass die Harmonischen im Fall des Klaviers wöchentlich sind?
Valentin Radu
@mindnoise: Streichinstrumente sind harmonisch, während gezupfte oder angeschlagene Saiteninstrumente en.wikipedia.org/wiki/Inharmonicity haben . Ich
Endolith
@endolith könnte insbesondere deshalb sein, weil: "Je weniger elastisch die Saiten sind (dh je kürzer, dicker und steifer sie sind), desto unharmonischer sind sie ." und ich erhalte den Fehler genau bei diesen Arten von Zeichenfolgen (hohe Noten). Eigentlich ist die Grundwelle immer die stärkste Frequenz in meiner FFT, wenn der Fehler auftritt, also hat sie definitiv mit Harmonischen oder dem HP-Algorithmus zu tun, aber ich bin mir nicht sicher, warum ich 20-50 Hz Müll für eine Grundwelle von 1500 Hz bekomme. wird den HP-Algorithmus veröffentlichen.
Valentin Radu
1
@mindnoise: "Inharmonizität wirkt sich hauptsächlich auf die niedrigsten und höchsten Noten im Klavier aus ... Die niedrigsten Saiten, die am längsten sein müssten, sind am stärksten durch die Größe des Klaviers begrenzt. Der Designer eines kurzen Klaviers ist gezwungen, diese zu verwenden dicke Saiten zur Erhöhung der Massendichte und werden somit in die Inharmonizität getrieben. Die höchsten Saiten müssen unter der größten Spannung stehen, müssen aber auch dünn sein, um eine geringe Massendichte zu ermöglichen. Die begrenzte Festigkeit des Stahls zwingt den Klavierdesigner, sehr kurze zu verwenden Saiten, deren kurze Wellenlängen somit Inharmonizität erzeugen. "
Endolith
2

Bei einigen Instrumenten kann sich die Anzahl der erzeugten signifikanten Harmonischen über verschiedene Tonhöhenbereiche ändern. Die Teiltöne der niedrigsten und höchsten Töne einiger physikalischer Instrumente können eine größere Inharmonizität aufweisen. Die Anzahl der Harmonischen, die unter den Anti-Alias-Filter-Cutoff unter Fs / 2 passen können, ist bei sehr hohen Noten sicherlich geringer. Ihr HPS-Pitch-Schätzer möchte diese Faktoren berücksichtigen.

Der Attack-Transient einiger Instrumente kann ein aharmonisches spektrales Rauschband erzeugen, das sich mit dem HPS-Suchbereich einiger Tonhöhen oder deren signifikanten Harmonischen überlappen kann.

Möglicherweise werden die Obertöne sehr hoher Frequenzen sogar um Fs / 2 gewickelt, wenn der Tiefpassfilter vor dem Audio-ADC keine ausreichend gute Stoppbanddämpfung aufweist.

hotpaw2
quelle