2017-03-07 2 views
0

La balise audio génère une fréquence différente entre 18 kHz et 19 kHz. J'essaie d'enregistrer toutes les fréquences en utilisant AudioTrack Api. J'ai référé ce lien How to get frequency from fft result?. Je reçois toutes les données est 0 après application hanning window function.1) comment appliquer la fenêtre de hanning? 2) comment filtrer la fréquence? 3) J'enregistre le son différent de fréquence de gamme et l'enregistrent dans le format .wav formate. Je lis ce dossier audio et convertis en fréquence. Mais j'obtiens la frqeuency élevée seulement. Comment obtenir la fréquence de crête multiple ?Comment appliquer la fonction de fenêtre de hanning

int fftSize = 1024; 
public void startRecord() { 

    short[] bytebuff = new short[2 * fftSize]; 
    while (started) { 
     int bufferReadResult = audioRecord.read(bytebuff, 0, bytebuff.length); 
     if (bufferReadResult >= 0) { 

      fft(bytebuff); 

     } 
    } 
} 
public void fft(short[] bufferByte) { 
    int N = bufferByte.length; 
    DoubleFFT_1D fft1d = new DoubleFFT_1D(N); 
    double[] fft = new double[N * 2]; 
    double[] magnitude = new double[N/2]; 

    for (int i = 0; i < N; i++) {//Hann window function 

     bufferByte[i] = (byte) (bufferByte[i] * 0.5 * (1.0 - Math.cos(2.0 * Math.PI * i/(bufferByte.length))));//here i'm getting all data is zero. 
    } 

    for (int i = 0; i < N - 1; ++i) { 
     fft[2 * i] = bufferByte[i]; 
     fft[2 * i + 1] = 0; 
    } 

    fft1d.complexForward(fft); 
    // calculate power spectrum (magnitude) values from fft[] 
    for (int i = 0; i < (N/2) - 1; i++) { 

     double real = fft[2 * i]; 
     double imaginary = fft[2 * i + 1]; 
     magnitude[i] = Math.sqrt(real * real + imaginary * imaginary); 

    } 
    double max_magnitude = -1; 
    int max_index = -1; 
    for (int i = 0; i < (N/2) - 1; i++) { 
     if (magnitude[i] > max_magnitude) { 
      max_magnitude = magnitude[i]; 
      max_index = i; 
     } 
    } 
    int freq = max_index * 44100/N; 
    Log.e("AudioBEacon", "---" + freq); 

} 

Répondre

0

Vous avez un mauvais casting ici:

bufferByte[i] = (byte) (bufferByte[i] * ... 

Il devrait être:

bufferByte[i] = (short) (bufferByte[i] * ... 
+0

merci pour reply.I changé court au lieu de l'octet .Mais il n'est pas working.which fft je dois utiliser complexForward ou RealForward? – Siddharthan

+0

S'il vous plaît dites-moi comment obtenir plusieurs fréquence de pointe.je suis en train d'enregistrer une seconde.Ma balise va générer trois fréquences différentes en une seconde (comme 18000,18500 et 19000hz) .mais je reçois haute fréquence de pointe 19000hz seulement. – Siddharthan

+0

Vous aurez besoin de faire un peu de débogage - essayez aussi de déterminer l'ampleur du spectre pour voir ce qui se passe. –