Ich erkunde Spracherkennung und DSP und möchte daher einen einfachen Tonfrequenzanalysator auf meinem Smartphone implementieren (ich habe sowohl ein iPhone als auch ein Samsung Nexus S mit Android). Ich habe vorher grundlegende DSP in Matlab gemacht.
Nach meinem Verständnis muss ich eine FFT durchführen, um die Grundfrequenzen eines Signals zu erhalten.
Nun möchte ich das Mikrofon bei 44100 Hz abtasten. Wenn ich ein gleitendes Fenster der Stichprobengröße 512 mit 50% Überlappung verwende, bedeutet das, dass ich alle 256 Samples oder 0,00580 Sekunden eine FFT machen muss.
Diese Rate scheint wirklich hoch zu sein , besonders wenn ich in Java für Android programmiere. Wird mein Smartphone mit dieser Geschwindigkeit umgehen können? Ich bin mir bewusst, dass Sie in C / C ++ auf Android programmieren können, aber ich möchte es vorläufig bei Java behalten.
Die Durchführung einer Real-to-complex FFT erfordert ~ 5/2 n lg n Fließkommaoperationen (Additionen und Multiplikationen). In Ihrem Fall ist n = 512, also:
%Vor%172 ffts pro Sekunde erfordern also etwa 2 Millionen Fließkommaoperationen pro Sekunde. Das klingt nach viel, aber es sind wirklich nicht viele. Die Hardware eines typischen Smartphones der Armv7-Klasse ist in der Lage, Hunderte von Millionen oder Milliarden Gleitkommaoperationen pro Sekunde auszuführen.
Beachten Sie jedoch, dass Sie eine sorgfältig geschriebene Hochleistungs-FFT wünschen; schlecht geschriebene FFTs sind notorisch ineffizient. Auf dem iPhone können Sie das Accelerate-Framework verwenden (direkt in das Betriebssystem integriert und im SDK verfügbar), das eine Reihe von FFT-Funktionen bietet. Ich bin mir nicht sicher, was auf Android verfügbar ist.
Für das iPhone kann das Accelerate-Framework für iOS alle von Ihnen angegebenen FFTs in der Größenordnung von 1% der CPU-Zeit ausführen (genauer Prozentsatz abhängig vom Gerätemodell und den FFT-Datentypen).
Für Android sollten Sie in Betracht ziehen, eine native NDK-Bibliothek für prozessorintensive numerische Berechnungen zu verwenden.
Beachten Sie auch, dass eine FFT die Spitzenfrequenzen liefert, die nicht notwendigerweise die Grundfrequenz oder die Tonhöhenfrequenz einschließen.
HINZUGEFÜGT: Diese Java-Benchmark-Webseite schlägt vor, dass Android-Handys in der Lage sind Bereich von 5 bis über 50 MFlops mit Java für gut geschriebene Matrixmathematik. Eine gut geschriebene FFT sollte in MFlops ungefähr in dem gleichen Leistungsbereich liegen. @Stephan Cannon hat geschrieben, dass in der Größenordnung von 2 MFlops für Ihre Spezifikation erforderlich sein könnte.
Ihr Android-Gerät wird in der Lage sein, mit dieser Ordnung umzugehen. Ich habe Echtzeit-FFT-basierte Frequenzanalysatoren geschrieben, die auf Windows Mobile-Geräten von vor ein paar Jahren (mit reinem C #) lief, und diese Geräte hatten viel schlechtere Prozessoren als aktuelle Android-Geräte. Der rechenintensivste Aspekt von FFT sind die trigonometrischen Funktionen. Da Sie ein Fenster mit fester Größe verwenden, können Sie die Funktionen der trigonometrischen Funktion einfach durch eine vorberechnete Nachschlagetabelle ersetzen.
Nebenbei können Sie Ihre Rechenzeit reduzieren, indem Sie Ihre Abtastrate reduzieren. Sprache hat nicht viel Energie über 8 kHz, so dass Sie wahrscheinlich Ihre Audio auf 16 KHz Downsampling vor jeder FFTs durchführen können, ohne viel Genauigkeit zu verlieren. Bei 16 kHz wären Ihre FFTs kleiner und damit schneller.
Wikipedia behauptet , dass 16 kHz eine Standardabtastrate für die Spracherkennung in Desktop-Anwendungen ist.
(Mir ist klar, dass dies die Frage des OP nicht beantwortet, aber ich denke, dass es ihm trotz seines Antrags hilfreich sein könnte.)
Tags und Links android iphone audio fft signal-processing