2017-02-11 6 views
0

Je développe l'application de lumiere. J'ai un signal porteur de certaine fréquence (19,2 kHz pour être plus précis) et j'ai besoin d'en connaître l'amplitude pendant la lecture de l'audio. J'ai parcouru quelques informations sur le traitement audio et découvert que pour obtenir le spectre de fréquence, vous devez utiliser l'algorithme FFT.Comment obtenir une amplitude de certains signaux audio de fréquence en temps réel android

J'ai essayé la bibliothèque TarsosDSP et sa classe FFT.

TarsosDSPAudioFormat format = new TarsosDSPAudioFormat((float) SAMPLE_RATE, 16, 1, true, false); 
TarsosDSPAudioFloatConverter converter = TarsosDSPAudioFloatConverter.getConverter(format); 

float[] buff = new float[bufferFloatSize]; 
final float[] amps = new float[fftSize]; 

converter.toFloatArray(tmpBuffer, buff); 

FFT fft = new FFT(bufferFloatSize, new HannWindow()); 
fft.forwardTransform(buff); 
fft.modulus(buff, amps); 

Puis-je obtenir l'indice de bande de fréquence et son amplitude calcule

int amp = (int) (10 * Math.log10(amps[index]); 

Mais je vous méprenez pas amplitude. J'ai un fichier audio avec un signal de 19,2 kHz qui a une amplitude constante de 0 dB mais la valeur de résultat de 19207 Hz varie de -39 dB à -46 dB. J'ai vérifié les fréquences voisines, peut-être que certaines d'entre elles ont 0 dBs, mais non. J'ai également vérifié les fichiers avec -36 dB et -60 dB, mais les résultats étaient respectivement de -39 à -48 dB et de -44 à -61 dB.

Comme nous pouvons le voir pour le dernier fichier, il est proche, mais il n'est pas constant et je ne peux pas prédire quand il est bon et quand il est faux.

Si quelqu'un a été confronté à ce problème, aidez-moi s'il vous plaît. Si vous connaissez tout autre FFT lib qui est réalisable pour sûr - me dire

MISE À JOUR: Ok, j'ai ajouté la fonction de TSG et l'appeler avant mon fft.forwardTransform() et après pour comparer les résultats; Les résultats sont les suivants: pour 0 dB fichier audio 19.2kHz: avant: -39 dB après - 10 dB

pour le fichier audio -36 dB 19.2kHz: avant: -75 dB après: -46 dB

pour le fichier audio -60 dB 19.2kHz: avant: -97,7 dB après: -69 dB

maintenant, les résultats sont constants et ne changent pas avec le temps ou essayer. Nous pouvons également voir qu'il y a une certaine tendance dans les résultats. Avant fft le résultat diffère de celui de droite pour -39 dBs et après pour -10dBs. Donc la question est: pourquoi avons-nous ces erreurs?

Répondre

0
In the TarsosDSP manual , the following example was given sound pressure level in db where , 

db=audioEvent.getdBSPL(); or Amplitude=audioEvent.getRMS() //root mean square of the signal. 



    float[] buffer = audioEvent.getFloatBuffer(); 



    private double soundPressureLevel(final float[] buffer) { 
    double power = 0.0D; 
    for (float element : buffer) { 
    power += element*element; 
    } 

    double value = Math.pow(power, 0.5)/ buffer.length;; 
    return 20.0*Math.log10(value); 
    } 
    }); 
+0

Pourriez-vous expliquer s'il vous plaît, pourquoi multipliez par 20 dans 20.0 * Math.log10 (value); Parce que j'ai vu la même expression multipliée par dix: 10 * Math.log10 (valeur); –

+0

les résultats pour votre fonction sur le fichier audio 0 dB 19.2kHz sont -39 dB avant l'appel FFT et -10 dB après l'appel FFT. Log.d ("test", "avant le niveau de puissance:" + soundPressureLevel (buff) + "dB"); fft.forwardTransform (buff); fft.modulus (buff, amplis); Log.d ("test", "après niveau de puissance:" + "soundPressureLevel" (buff) + "dB"); –

+0

J'ai également vérifié que les trois fichiers ont toujours les mêmes résultats, quoi de mieux, car nous avons des valeurs constantes (pas de variation comme avant) et la différence entre le bon résultat et le faux est d'environ 39 dBs (résultat avant fft) . Comme il devrait être de 0 dB et de -39 dB, il devrait être de -36 dB et de -75 dB, il devrait être de -60 dB et de -98 dB. –