FFT bibliothèque en kit Sdk d'android
Je suis en train de travailler avec le projet android.J'ai besoin de l'algorithme FFT, le processus de android accéléromètre de données.Est-il de la FFT de la bibliothèque disponible dans le sdk android?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser cette classe, ce qui est assez rapide pour l'audio en temps réel de l'analyse
Attention: ce code semble être dérivée de ici, et a une licence GPLv2.
À l'aide de la classe à: https://www.ee.columbia.edu/~ronw/code/MEAPsoft/doc/html/FFT_8java-source.html
Courte explication: appel fft() fournir x comme vous l'amplitude de données, y comme tous les zéros de la matrice de, après la fonction renvoie votre première réponse sera un[0]=x[0]^2+y[0]^2.
Explication complète: FFT est complexe transformer, il faut N nombres complexes et produit N des nombres complexes. Donc, x[0] est la partie réelle du premier numéro, y[0] est la partie complexe. Cette fonction calcule en place, de sorte que lorsque la fonction retourne x et y aura du réel et de pièces complexes de la transformation.
Une utilisation typique est de calculer le spectre de puissance de l'audio. Vos échantillons audio seulement la partie réelle, vous votre complexe de la partie est de 0. Pour calculer le spectre de puissance vous ajoutez la place du réel et de pièces complexes P[0]=x[0]^2+y[0]^2.
Aussi, il est important de noter que la transformée de Fourier, lorsqu'il est appliqué sur des nombres réels, le résultat symétrique résultat (x[0]==x[x.longueur-1]). Les données à x[x.longueur/2] les données de fréquence f=0Hz. x[0]==x[x.longueur-1] a les données pour une fréquence égale à avoir le taux d'échantillonnage (par exemple, si vous échantillonnage a été 44000Hz que cela signifie f[0] refeers à 22kHz).
Procédure complète:
Que de régler le nombre fixe à votre goût.
Le numéro 512 définit l'échantillonnage de la fenêtre, je ne vais pas l'expliquer. Juste éviter de la réduire trop.
Le nombre 1024 doit toujours être le double du dernier numéro.
Le nombre de 50, vous définit taux de mise à jour. Si votre taux d'échantillonnage est de 44000 échantillons par seconde vous taux de mise à jour sera: R=44000/1024/50 = 0.85 secondes.
kissfft est un assez décent bibliothèque qui compile sur android. Il a un plus polyvalent de licence de FFTW (même si FFTW est certes mieux).
Vous pouvez trouver une android de liaison pour kissfft dans libgdx https://github.com/libgdx/libgdx/blob/0.9.9/extensions/gdx-audio/src/com/badlogic/gdx/audio/analysis/KissFFT.java
Ou si vous souhaitez un pur Java solution essayez jTransforms
https://sites.google.com/site/piotrwendykier/software/jtransforms
Utiliser cette classe (celui qui EricLarch la réponse est dérivé d').
Notes D'Utilisation
Cette fonction remplace les entrées des tableaux avec la FFT de sortie.
Entrée
c'est à dire si votre entrée est
(1+8i 2+3j, 7-i-10-3i)
Sortie
Pour obtenir des classiques de la FFT graphique, vous voulez calculer l'amplitude des parties réelles et imaginaires.
Quelque chose comme:
Voir aussi cette StackOverflow répondre pour comment obtenir des fréquences si votre entrée a été amplitude en fonction du temps.
@J Wang
Votre sortie de l'ampleur semble mieux que la réponse donnée sur le fil que vous avez lié, mais encore de l'ampleur au carré ... l'ordre de grandeur d'un nombre complexe
est calculé comme
la réponse dans le fil relié suggère que pour un pur réel les entrées, les sorties
doit être à l'aide de un2 ou un pour la sortie parce que les valeurs de
avec
b_(i) = a_(i+N/2)
sens de la partie complexe dans leur table dans la secondela moitié de la table de sortie.
je.e la seconde moitié de la table de sortie pour une entrée de la table de reals est le conjugué de la vraie ...
donc
z = a-ia
donnant une ampleuralors, il vaut la peine de noter les facteurs d'échelle ...
Je recommande d'étudier tout cela dans un livre ou sur le wiki pour en être sûr.
Oui, il y a le
JTransforms
qui est maintenue sur github ici et disponibles en tant que Maven plugin ici.Utiliser avec:
Mais avec les plus récentes, Gradle versions, vous devez utiliser quelque chose comme: