2017-09-12 4 views
1

Je vais avoir la compréhension de laVisualizer onFftDataCapture - L'index byte [] représente-t-il la fréquence?

de Android Visualiseur
onFftDataCapture((Visualizer visualizer, 
      byte[] fft, 
      int samplingRate) 

Comment puis-je savoir que la fréquence est représentée par lequel byte dans fft?

Par exemple, l'indice serait-il une représentation de la fréquence? Comme index = frequency?

Pour l'indice 0, la fréquence est de 0 Hz, l'indice 1 est de 1 Hz, etc.?

Répondre

1

La FFT produit des nombres complexes, où chaque nombre reflète des informations de domaine fréquentiel concernant un intervalle contenant des fréquences de plage continue. L'approche habituelle pour l'interprétation des données FFT est la suivante:

  • d'abord déterminer la taille du godet de fréquence en divisant la longueur de la table FFT par le taux d'échantillonnage, nous allons l'appeler bucketSize;

  • puis chaque godet avec index i (en supposant qu'il se base 0) contient des informations sur les fréquences dans la plage de i * bucketSize à (i + 1) * bucketSize Hz; Pour les signaux à valeur réelle, les valeurs de la seconde moitié de la table FFT (pour les compartiments de fréquences supérieures à samplingRate/2) ne seront qu'un miroir de la première moitié, elles sont donc généralement rejetées;

  • pour trouver l'amplitude (niveau du signal) pour les fréquences dans le seau, il faut prendre la valeur complexe de la table FFT pour ce seau, disent qu'il est a + ib et calculer sqrt(a*a + b*b).

Maintenant de retour aux résultats de onFftDataCapture. Ici, le tableau fft contient des nombres complexes en tant que paires consécutives d'octets, donc fft[0] et fft[1] comprennent le nombre complexe pour le premier compartiment, fft[2] et fft[3] - pour le second, et ainsi de suite.

Parce que, comme je l'ai mentionné, pour les signaux de valeurs réelles de la deuxième partie de la table FFT n'apporte aucun avantage, il est pas fourni dans le tableau fft. Mais puisque chaque compartiment FFT prend deux cellules de tableau, la taille de baquet en Hz sera toujours calculée comme fft.length/samplingRate. Notez que fft.length est en fait la taille de capture définie par la méthode setCaptureSize du Visualizer.

L'amplitude du seau de fréquences peut être facilement calculée en utilisant la fonction Math.hypot, par ex. pour le premier seau c'est Math.hypot(fft[0], fft[1]).