2012-03-27 9 views
3

Ich arbeite an einer Anwendung, die Audiosignale abtastet und Echtzeitverarbeitung (FFT und harmonisches Produktspektrum) dieser Daten benötigt.Java-Frequenzanalyse-Leistung

Ich brauche eine Abtastrate von 44100Hz und brauche eine Frequenzauflösung von 0,5 Hz, was bedeutet, dass ich 88200 Proben vor der FFT brauche. Dies dauert ca. 2 Sekunden, da die Abtastrate doppelt so groß ist. Nach dem ersten Beispiel verbessere ich jedoch die Dinge erheblich, indem ich einen Ringpuffer für die Abtastung verwende und ab diesem Zeitpunkt nur noch halb so viele Abtastungen lese.

Leider ist die Leistung immer noch recht niedrig und es gibt ziemlich viel Latenz. Dies ist ein großes Problem, da die Anwendung zeitnah auf die Eingabe reagieren muss.

Hat jemand irgendwelche Vorschläge, wie ich die Leistung verbessern könnte? Ich denke, das Hauptproblem liegt in der Anforderung für große Samples und es wäre gut, wenn es eine Möglichkeit gäbe, wie viel Audio gelesen werden könnte, während die Genauigkeit beibehalten wird. Würde Threading hier vielleicht helfen?

EDIT

Wenn es hilft zu wissen, versuche ich in Echtzeit F0 Schätzung von E-Gitarre Eingang zu tun, zusammen für Akkordanpassung mit mehreren F0-Schätzung. Ich habe Methoden, dies zu tun, die funktionieren und ziemlich genau sind, aber es ist für ein Uni-Projekt und ich habe nicht wirklich genug Zeit, um zu weit in andere Methoden als die FFT zu schauen. Wirklich, ich hoffe nur auf eine Art, den Probenahmeprozess zu beschleunigen.

+0

Ist es möglich, das Nebenläufigkeitsniveau zu verbessern? Für z.B. Teile die Datei in kleinere Stücke (für einen Start 2 Stücke) und führe das Muster unter verschiedenen Themen durch? Wenn Sie nicht von der Hardware abhängig sind (CPU-gesteuert und nicht Soundkarten-gesteuert), kann dieser "Divide and Conquer" -Ansatz helfen. – questzen

Antwort

1

Da Sie zunächst 2 Sekunden Audio aufnehmen müssen, wird dadurch die Latenzzeit unterschritten. Selbst bei einer Überlappung von 50% haben Sie immer noch eine minimale Latenz von 1s. Die FFT und andere Verarbeitung wird nur dazu beitragen, aber hoffentlich nicht um einen signifikanten Betrag (ansonsten eine schnellere FFT-Bibliothek verwenden). Sie können diese Latenz nur reduzieren, indem Sie die Frequenzauflösung opfern.

+0

Das habe ich befürchtet. Ich denke, einige Leute haben versucht, eine Art von Interpolation von Nullen mit der FFT-Eingabe zu verwenden, um die Auflösung zu erhöhen, aber immer noch weniger Samples zu verwenden. Ich könnte das versuchen und sehen, wie es funktioniert, aber ich denke, dass allein wird keine Lösung sein. – nihilo90

+1

Das Auffüllen mit Nullen gibt Ihnen keine * Genauigkeit * mehr, es interpoliert nur Ihre Frequenzbereichsdaten, so dass Sie eine offensichtliche Auflösung erhalten, aber das ist wirklich nur kosmetisch - es trennt keine Peaks, die zu nahe beieinander liegen basierend auf Ihrer Abtastrate, dh Sie können keine Informationen aus dem Nichts erhalten. Es würde wahrscheinlich helfen, wenn Sie eine hochrangige Idee von dem, was Sie versuchen, geben, da es andere Ansätze geben kann. –

+0

Ich habe die Frage mit mehr Informationen zu meinem Projekt bearbeitet. Und was das Zero Padding betrifft, macht es einen Unterschied, ob ich nur an einem bestimmten Frequenzbereich interessiert bin? Würden auch die umgebenden Bins für diese interpolierten Punkte gemittelt werden? – nihilo90

1

Mit einer FFT-Methode erhalten Sie einen Zeit-Frequenz-Kompromiss. Wenn Sie eine niedrigere Latenzzeit wünschen, müssen Sie weniger Daten verwenden, was mit einer FFT (entweder kürzer oder mit Null-Fadling) zu einer weniger genauen Frequenzschätzung führt.

Zero-Padding liefert nur eine qualitativ hochwertige Interpolation. Dies kann jedoch eine bessere Schätzung der Spitzenfrequenz liefern als nur die Verwendung der Mitte des Spitzenbereichs einer kürzeren FFT.