Wie gehe ich mit Low Fundamental um, wenn ich AMDF für die Tonhöhenextraktion verwende?


11

Ich verwende die Average Magnitude Difference Function , um die Grundfrequenz eines quasi-periodischen Audiosignals abzuschätzen. Das AMDF ist definiert als

Dn=1Nnk=nN1|Sk- -S.k- -n|

Dabei ist N. die Länge des Signals. Diese Funktion weist ein Minimum auf, wenn das Signal um einen Betrag verschoben wird, der seiner Periode entspricht.

Dies ist der Code, mit dem ich die Tonhöhe extrahiere (in Matlab):

 a = amdf(f);
 a = a/max(a);
 [p l] = findpeaks(-a, 'minpeakprominence', 0.6);
 pitch = round(sample_freq/l(1);

Ich habe es jedoch mit einem Audiosignal zu tun, bei dem die Grundfrequenz sehr niedrig ist:

Spektrum des Audiosignals

Infolgedessen tritt ein Tonhöhenverdopplungsproblem auf: Das erfasste Minimum entspricht der halben Periode des Signals (dh der zweiten Harmonischen):

AMDF des obigen Signals

Ich habe versucht, den größten Peak und nicht nur den ersten zu extrahieren, aber manchmal bleibt dieses Problem bestehen. Wie kann ich meinen Code und / oder die AMDF-Funktion verbessern, um mit niedrigen Grundwerten umzugehen?


Psychoakustik und menschliche Wahrnehmung beeinflussen die wahrgenommene Tonhöhe und Oktavunsicherheit. Möglicherweise sind Experimente erforderlich, um festzustellen, unter welchen Bedingungen der größte AMDF-Peak einen hörbaren Unterschied macht.
hotpaw2

Wie niedrig sind deine Frequenzen? Gibt es ein Beispiel für mich, um zuzuhören?
Federwander

Antworten:


10

Dies nennen wir im Pitch-Detection-Business das " Oktavproblem ".

Zunächst würde ich die AMDF in ASDF ändern. Und ich würde die Fenstergröße nicht verringern, wenn die Verzögerung zunimmt. (Außerdem ändere ich die Notation auf das, was ich für konventioneller halte. " " ist ein zeitdiskretes Signal.)x[n]

Die Average Squared Difference Function (ASDF) von in der Nachbarschaft von Probe x [ n 0 ] ist:x[n]x[n0]

Qx[k,n0]1Nn=0N1(x[n+n0N+k2]  x[n+n0N+k2+k])2

ist dieFunktion und wenn k gerade ist, dann istkfloor()k .k2=k+12=k2

Nun erweitert den Platz und überlegen , was die Summierungen aussehen wie (nicht , dass N ist bis ins Unendliche gehen, aber um Ihnen eine Idee zu geben , wenn N groß ist). Die ASDF steht in direktem Zusammenhang mit der Autokorrelation. Es ist im Wesentlichen die auf den Kopf gestellte Autokorrelation. Diese Schritte werde ich dir überlassen. Schauen Sie sich diese Antwort an.NN N

Betrachten Sie nun diese endliche "Autokorrelation" (in der Nähe der Stichprobe ), die aus dem ASDF definiert wurde:x[n0]

Rx[k,n0]=Rx[0,n0]12Qx[k,n0]

wo

Rx[0,n0]1Nn=0N1(x[n+n0N2])2

Da und Q.Qx[0,n0]=0 für alle Verzögerungen k ist, bedeutet dies, dass R x [ k , n 0 ] R x [ 0 , n 0 ] für alle Verzögerungen ist k .Qx[k,n0]0kRx[k,n0]Rx[0,n0]k

Nehmen wir für eine Minute an, dass mit der Periode P periodisch ist (und P zufällig eine ganze Zahl ist)x[n]PP

x[n+P]=x[n]n

und und R x [ m P , n 0 ] = R.Qx[mP,n0]=0 für eine beliebige ganzzahlige Anzahl von Perioden ( m ist eine ganze Zahl). Sie erhalten also einen Peak bei k = 0 und bei k gleich einem anderen Vielfachen von P, wenn xRx[mP,n0]=Rx[0,n0]Rx[k,n0]mk=0kP ist periodisch. Wenn x [ n ] istnichtperfekt periodisch, was wir vielleicht erwarten ist der größte Peak bei k = 0 , ein weiterer Peak (aber etwas kleiner) bei k = P (die Zeitwir suchen) und zunehmend kleinere Peaks für größere Vielfache von P .x[n]x[n]k=0k=PP

Das Oktavproblem tritt also aus mehreren Gründen auf. Erstens ist nicht unbedingt eine ganze Zahl. Das ist ein Interpolationsproblem, keine große Sache. P

Der zweite Grund und das schwierigere Problem ist das der Subharmonik . Stellen Sie sich vor, Sie hören einen schönen periodischen Ton mit genau A-440 Hz und es klingt wie ein A, das 9 Halbtöne über dem mittleren C liegt. Nehmen wir nun an, jemand fügt diesem Ton eine sehr kleine Amplitude (wie etwa 60 dB) A hinzu -220? Wie wird es klingen und was ist mathematisch die "wahre" Periode?


Auswahl des "richtigen" Peaks für den Zeitraum.

Angenommen, Sie führen Ihre Notiz durch einen DC-Sperrfilter, sodass der Mittelwert von Null ist. Es stellt sich heraus, dass dies den Mittelwert der Autokorrelation R x verursachtx[n] für jedes n 0 ebenfalls Null ist (oder nahe daran liegt, wenn N groß ist). Das bedeutet, dass R x [ k , n 0 ] summieren muss (über k ), um ungefähr Null zu sein, was bedeutet, dass es so viel Fläche über Null gibt wie unter.Rx[k,n0]n0NRx[k,n0]k

Okay, repräsentiert die Potenz von x [ n ] in der Nähe um n = n 0 und muss nicht negativ sein. R x [ k , n 0 ] überschreitet niemals R x [ 0 , n 0 ] , kann jedoch so groß werden, wie es ist, wenn x [ n ] periodisch ist. R x [ P , n 0 ]Rx[0,n0]x[n]n=n0Rx[k,n0]Rx[0,n0]x[n] wenn x [ n + P ] = x [ n ] . Wenn also x [ n ] mit der Periode P periodisch istund Sie eine Reihe von Peaks haben, die durch P voneinander beabstandet sind,und Sie eine Idee haben, wie hoch diese Peaks sein sollten. Und wenn die Gleichstromkomponente von R x [ k , n 0 ] Null ist, dh zwischen den Spitzen liegt,musssie negative Werte haben.Rx[P,n0]=Rx[0,n0]x[n+P]=x[n]x[n]PPRx[k,n0]

Wenn "quasi-periodisch" war, sieht ein Zyklus von x [ n ] einem benachbarten Zyklus sehr ähnlich, aber nicht so sehr einem Zyklus von x [ n ] , der zeitlich weiter unten im Signal liegt. Das heißt, der erste Peak R x [ P , n 0 ] ist höher als der zweite bei R x [ 2 P , n 0 ] oder der dritte R x [ 3 P , n 0 ].x[n]x[n]x[n]Rx[P,n0]Rx[2P,n0]Rx[3P,n0]. Man könnte die Regel verwenden, um immer den höchsten Peak auszuwählen und zu erwarten, dass der höchste Peak immer der erste ist. Aber wegen unhörbarer Subharmonik ist das manchmal nicht der Fall. manchmal ist der zweite oder möglicherweise der dritte Peak ach so etwas höher. Da die Periode wahrscheinlich keine ganzzahlige Anzahl von Abtastwerten ist, sondern k in R x [ k , n 0 ] immer eine ganze Zahl ist, liegt der wahre Peak wahrscheinlich zwischen ganzzahligen Werten von k . Selbst wenn Sie interpolieren würden, wo der glatte Peak ist (was ich empfehle und die quadratische Interpolation gut genug ist) und wie hoch er wirklich zwischen der ganzen Zahl k liegtPkRx[k,n0]kkkönnte Ihre Interpolationsalge einen Peak etwas höher oder etwas niedriger machen als er wirklich ist. Die Auswahl des absolut höchsten Peaks kann also dazu führen, dass Sie den zweiten über den ersten Peak (oder umgekehrt) fälschlicherweise auswählen, wenn Sie den anderen wirklich wollten.

Irgendwie müssen Sie die Peaks bei zunehmendem k behindern , damit der erste Peak einen leichten Vorteil gegenüber dem zweiten und der zweite gegenüber dem vierten (die nächste Oktave nach unten) usw. hat. Wie machen Sie das?k

Sie tun dies, indem Sie multiplizieren Rx[k,n0]kk=2Pk=P

kα Rx[k,n0]

x[n]PP

Rx[2P,n0]=Rx[P,n0]

aber

(2P)αRx[2P,n0]=(2P)αRx[P,n0]<PαRx[P,n0]

Der Faktor, um den die Spitze für eine Tonhöhe von einer Oktave niedriger reduziert wird, ist das Verhältnis

(2P)αRx[2P,n0]PαRx[P,n0]=(2P)αPα=2α

Wenn Sie also Ihrem ersten Peak einen Anstieg von 1% gegenüber dem zweiten Peak geben möchten, bedeutet dies, dass Sie die Tonhöhe nicht als subharmonische Tonhöhe auswählen, es sei denn, die Autokorrelation der subharmonischen Tonhöhe ist mindestens 1% höher als die erste Peak würden Sie für lösenα

2α=0.99

Dies ist die konsistente Methode, um den Peak, der der subharmonischen Tonhöhe eine Oktave darunter entspricht, zu gewichten, zu betonen oder zu beeinträchtigen.

α


1
Um Ihre letzte Frage zu beantworten: Wenn Sie eine Amplitude von 220 Hz hinzufügen, beträgt die Tonhöhe 220 Hz, wobei 440 Hz die erste Harmonische nach der Grundwelle ist (mathematisch gesehen). Mein Fall ist ähnlich, aber es gibt auch höhere Harmonische, so dass die fehlende Grundwelle aus Sicht der Wahrnehmung kein Problem darstellt. Ich verstehe nicht, wie das Ersetzen von AMDF durch ASDF das Oktavproblem lösen könnte
Firion

aber die andere Hälfte der Frage ist * "wie wird es klingen"? Beantworten Sie das und lassen Sie uns sehen, was Ihr Pitch-Detektor tun soll.
Robert Bristow-Johnson

Rx[k,n0]

Wenn Sie keine anderen höheren Harmonischen als nur die 440-Hz-Harmonische haben und der 220-Hz-Ton ausreichend niedrig ist, hören Sie eine 440-Hz-Tonhöhe. Ab einem bestimmten Pegel (ich weiß nicht, welcher) hören Sie auch den 220-Hz-Ton und damit eine 220-Hz-Tonhöhe.
Feuer

Es gibt einen Grund, warum ich -60 dB sagte. Was soll Ihr Pitch-Detektor nun sagen, dass es sich um eine 220-Hz- oder 440-Hz-Note oder etwas anderes handelt?
Robert Bristow-Johnson

0

Heuristisch gesehen liegt die Grundfrequenz der stimmhaften Sprache im Intervall [70, 400] Hz. Der erste Schritt wäre also, ein Bandpassfilter anzuwenden, um dieses Band ungefähr zu isolieren.

Zweitens können Sie eine Gewichtungsfunktion auf das Leistungsspektrum anwenden. In der Nähe der Grundwelle sollte das Gewicht nahe 1 sein, während näher am Ende des Bandes das Gewicht nahe 0 sein sollte. Diese Gewichtung ist natürlich normalisiert. Ich würde etwas Superlineares empfehlen: quadratisch, quartisch usw. - um die Oktaven wirklich abzutöten.


Wie kann ich das Gewicht anwenden? Ich weiß nicht, wo das Grundlegende ist. Außerdem ist mein Signal eine Instrumentennote, daher ist die Reichweite größer
Firion
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.