J'explore la reconnaissance vocale et la DSP, et je voudrais donc mettre en œuvre un analyseur de fréquence sonore simple sur mon smartphone (j'ai à la fois un iPhone et un Samsung Nexus S fonctionnant Android). J'ai déjà fait DSP de base à Matlab. P>
De ma compréhension, j'ai besoin d'effectuer une FFT pour obtenir les fréquences fondamentales d'un signal. p>
Alors maintenant, je voudrais goûter au microphone à 44100 Hz. Si j'utilise une fenêtre coulissante de taille de l'échantillon 512 avec un chevauchement à 50%, cela signifie que je dois faire une FFT tous les 256 échantillons, ou 0,00580 secondes. P>
ce taux semble vraiment élevé fort>, en particulier si je programme en Java pour Android. Mon smartphone sera-t-il capable de gérer cette vitesse? Je suis conscient que vous pouvez programmer en C / C ++ sur Android, mais je voudrais le garder avec Java pour le moment. P>
4 Réponses :
Pour l'iPhone, le cadre d'accélération pour iOS peut faire tous les FFTS que vous spécifiez à l'aide de l'ordre de 1% du temps du processeur (pourcentage exact en fonction du modèle de périphérique et des types de données FFT). P>
pour Android, vous voudrez peut-être fortement envisager d'utiliser une bibliothèque native NDK pour les calculs numériques intensifs du processeur. P>
Notez également qu'un FFT vous donnera les fréquences de pointe, qui n'inclut pas nécessairement la fréquence fondamentale ou la fréquence de la hauteur. P>
ajouté: ce page Web de référence Java suggère que les téléphones Android sont capables de 5 à plus de 50 mflops utilisant Java pour une matrice bien écrite Math. Un FFT bien écrit devrait tomber autour de peu la même plage de performances des Mflops. @Stephan Cannon a affiché que sur l'ordre de 2 Mflops peut être nécessaire pour votre spécification. P>
Ce n'était pas moi, mais j'ai presque fait voté cette réponse parce que cela commence par mentionner l'iphone et je pensais que c'était une question pure Android (je n'ai pas remarqué les balises).
Effectuer une FFT réelle à complexe nécessite ~ 5/2 N LG N Opérations à virgule flottante (ajouts et multiplications). Dans votre cas, n = 512, donc:
flops per fft ~= (5/2) * 512 * 9 = 11520
Où avez-vous obtenu cette estimation pour les flops par FFT? Pouvez-vous me signaler à une littérature? Je connais le O (n lg n) lié à l'algorithme de Cooley-Tukey, mais je n'ai pas vu d'estimation de tops.
Le papier original de Cooley-Tukey donne en fait un nombre de flop LG N plus raffiné; Les gens utilisent généralement ce nombre (et donc 5/2 N LG N pour un FFT réel à complexe, même si cela n'est pas parfaitement correct). En réalité, des algorithmes plus sophistiqués (tels qu'utilisés dans la pratique courante) nécessitent effectivement un peu moins de flops. Je ne suis pas sûr de ce que la limite inférieure de l'état actuel de l'art est, mais je pense que c'était quelque part autour de 4 n lg n quand j'ai regardé.
@ Stackoverflowuser2010: La page Wikipedia sur la FFT a de bonnes liens vers des travaux récents sur les limites de la constante.
J'ai téléchargé une référence LinPack pour mon téléphone Android Nexus S (l'application s'appelle "Linkack for Android"). Il est entièrement écrit en Java. Je reçois environ 10-20 mflops. J'espère que votre estimation de 2 mflops FFT tombe correctement dans cette plage. J'utiliserai une implémentation Java FFT. FYI Mon MacBook Pro Top-of-the-Line avec un processeur I7 obtient environ 30 GFLOPs à l'aide de l'indice de référence Native Linpack d'Intel.
Au cas où n'importe qui est intéressé, j'ai pu exécuter avec succès une FFT près de 100 fois par seconde sur mon téléphone Android. J'ai utilisé la mise en œuvre de Java FFT à partir de EE. Columbia.edu/~tronw/code/meapsoft/doc/html/...
Votre appareil Android sera capable de gérer cette amende. J'ai écrit des analyseurs de fréquence à temps réel et basé sur FFT qui ont couru sur des appareils mobiles Windows à partir de quelques années (en utilisant Pure C #), et ces dispositifs avaient des processeurs bien pires que les appareils Android actuels. L'aspect le plus coûteux de la FFT est les fonctions de la traction et, étant donné que vous utilisez une fenêtre de taille fixe, vous pouvez facilement remplacer les appels de fonction Trig avec une table de recherche pré-calculée. P>
Comme de côté, vous pouvez probablement réduire votre temps de calcul en réduisant votre taux d'échantillonnage. La parole n'a pas beaucoup d'énergie au-dessus de 8 kHz, de sorte que vous pourrez probablement annuler votre audio à 16 kHz avant de faire des FFT, sans perdre beaucoup de précision. À 16 kHz, vos FFT seraient plus petits et si plus rapides. p>
Wikipedia affirme que 16 kHz est un taux d'échantillonnage standard pour la reconnaissance vocale dans les applications de bureau. < / p>
(Je me rends compte que cela ne répond pas à la question de l'OP, mais je pense que cela pourrait être utile pour lui néanmoins, compte tenu de son application.) P>
Considérer qu'il y a d'autres méthodes d'estimation de la fréquence fondamentale, alors FFT
Je ne pense pas que OP voulait vraiment utiliser la phrase "fréquence fondamentale" dans le sens de la reconnaissance de la hauteur (c'est-à-dire trouver la fréquence dominante), car cela ne serait généralement pas quelque chose que vous utiliseriez pour la reconnaissance vocale.