09-11-2019, 01:22 PM
Theoretisch sollten Frequenzen bis zu Nyquist-Frequenz (halbe Sample-Rate, also 24kHz) unterscheidbar sein, aber in der konkreten Umsetzung gibt es hier zwei Einschränkungen:
1. Die Analyse-Methode aus "Frequenzverlauf" ist optimiert um auch aus kurzen Audio-Schnipseln eine Frequenz zu bestimmen. Hier wird eine Autokorrelation berechnet (was dann mit Tönen aus mehreren Frequenzen schon ein Problem darstellt) und im Grunde die Maxima abgezählt um die Periodendauer des Tons zu bestimmen. Die Nyquist-Frequenz ist der Grenzfall bei dem ein Ton zweimal pro Periode gesamplet wird, was in einer Fouriertransformation noch schön aufgelöst werden kann, wo unsere Korrelations-Abzählmethode aber recht sicher aus dem Tritt geraten wird. Bei 8kHz sind es auch nur 6 Sample pro Periode, weswegen ich vermute, dass der Algorithmus da nicht mehr sauber arbeitet.
2. Unsere Implementierung des Tongenerators (falls der hier benutzt wurde) ist auch nicht ideal. Wir berechnen den Ton einmal über eine Laufzeit von maximal einer Sekunde und spielen den dann in Schleife. Das hat zur Folge, dass kleine Nuancen nicht korrekt wieder gegeben werden, da die Phase des Tons beim Wiederholen jedes Mal wieder auf Null springt. Außerdem spielt hier eine Optimierung rein, die einen kürzeren Ton berechnen soll, aber bei hohen Frequenzen auch ihre Probleme bekommt. Ein neuer Tongenerator steht auf unserer Todo-Liste...
Ich würde empfehlen, dass du beide Fehlerquellen jeweils einmal ausschließt:
Den Ton einmal über einen Online-Tongenerator (einfach googlen, da gibt es viele) generieren und schauen, ob das Problem weg ist. Außerdem könnte es eine gute Alternative sein, die Frequenz nicht über die Autokorrelation, sondern über das Maximum einer Fourier-Transformation zu bestimmen. Die Aufnahme muss für eine gute Auflösung zwar ein ganzes Stück länger sein, aber das schadet in der Anwendung ja nicht. Auch das kannst du leicht testen, indem du dir die Frequenzen anschaust, die "Audio-Spektrum" als Peak ausspuckt.
1. Die Analyse-Methode aus "Frequenzverlauf" ist optimiert um auch aus kurzen Audio-Schnipseln eine Frequenz zu bestimmen. Hier wird eine Autokorrelation berechnet (was dann mit Tönen aus mehreren Frequenzen schon ein Problem darstellt) und im Grunde die Maxima abgezählt um die Periodendauer des Tons zu bestimmen. Die Nyquist-Frequenz ist der Grenzfall bei dem ein Ton zweimal pro Periode gesamplet wird, was in einer Fouriertransformation noch schön aufgelöst werden kann, wo unsere Korrelations-Abzählmethode aber recht sicher aus dem Tritt geraten wird. Bei 8kHz sind es auch nur 6 Sample pro Periode, weswegen ich vermute, dass der Algorithmus da nicht mehr sauber arbeitet.
2. Unsere Implementierung des Tongenerators (falls der hier benutzt wurde) ist auch nicht ideal. Wir berechnen den Ton einmal über eine Laufzeit von maximal einer Sekunde und spielen den dann in Schleife. Das hat zur Folge, dass kleine Nuancen nicht korrekt wieder gegeben werden, da die Phase des Tons beim Wiederholen jedes Mal wieder auf Null springt. Außerdem spielt hier eine Optimierung rein, die einen kürzeren Ton berechnen soll, aber bei hohen Frequenzen auch ihre Probleme bekommt. Ein neuer Tongenerator steht auf unserer Todo-Liste...
Ich würde empfehlen, dass du beide Fehlerquellen jeweils einmal ausschließt:
Den Ton einmal über einen Online-Tongenerator (einfach googlen, da gibt es viele) generieren und schauen, ob das Problem weg ist. Außerdem könnte es eine gute Alternative sein, die Frequenz nicht über die Autokorrelation, sondern über das Maximum einer Fourier-Transformation zu bestimmen. Die Aufnahme muss für eine gute Auflösung zwar ein ganzes Stück länger sein, aber das schadet in der Anwendung ja nicht. Auch das kannst du leicht testen, indem du dir die Frequenzen anschaust, die "Audio-Spektrum" als Peak ausspuckt.