2017-02-10 4 views
0

Я использую приложение звукового анализатора в android.I могу генерировать 18 кГц до 20 кГц ультразвукового звука, используя AudioTrack Api.i можно записывать аудио с помощью AudioRecord Api. Но я не могу знаю, как рассчитать частоту формы входных данных микрофона. Я видел несколько вопросов How to get frequency from fft result? и Get frequency wav audio using FFT and Complex class, не давая должной частоты. Пожалуйста, помогите мне. Извините за мое сообщение.Как рассчитать частотный уровень от входных данных микрофона аудиомагнитофона

Это моя частота код вычисления

int bufferSizeInBytes = 1024; 
short[] buffer = new short[bufferSizeInBytes]; 
class Recording extends Thread { 
    @Override 
    public void run() { 

     while (true) { 

       bufferReadResult = audioInput.read(buffer, 0, bufferSizeInBytes); // record data from mic into buffer      

       if(bufferReadResult > 0){ 
        calculate(); 
       }    
     } 
    } 


public void calculate() { 
    DoubleFFT_1D fft1d = new DoubleFFT_1D(bufferSizeInBytes);//using JTransforms lib 
    double[] fftBuffer = new double[bufferSizeInBytes * 2]; 
    double[] magnitude = new double[bufferSizeInBytes/2]; 

    // copy real input data to complex FFT buffer 
    for (int i = 0; i < bufferSizeInBytes - 1; ++i) { 
     fftBuffer[2 * i] = buffer[i]; 
     fftBuffer[2 * i + 1] = 0; 
    } 
    //perform FFT on fft[] buffer 
    fft1d.realForward(fftBuffer); 

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

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

    } 

    // find largest peak in power spectrum 
    double max_magnitude = magnitude[0]; 
    int max_index = 0; 
    for (int i = 0; i < magnitude.length; ++i) { 
     if (magnitude[i] > max_magnitude) { 
      max_magnitude = (int) magnitude[i]; 
      max_index = i; 
     } 
    } 
    double freq = max_index * 44100/bufferSizeInBytes; 
    Log.e("AudioBEacon", "" + freq); 
} 

}

Это мой output.Please дайте мне знать, где я сделал ошибку.

02-10 12:33:04.450 17013-17063/com.org.sohamsaa.audiobeacontransmitter E/AudioBEacon: 21662.0 
02-10 12:33:04.451 17013-17063/com.org.sohamsaa.audiobeacontransmitter E/AudioBEacon: 21317.0 
02-10 12:33:04.453 17013-17063/com.org.sohamsaa.audiobeacontransmitter E/AudioBEacon: 21791.0 
02-10 12:33:04.471 17013-17063/com.org.sohamsaa.audiobeacontransmitter E/AudioBEacon: 21748.0 
02-10 12:33:04.472 17013-17063/com.org.sohamsaa.audiobeacontransmitter E/AudioBEacon: 21533.0 
02-10 12:33:04.474 17013-17063/com.org.sohamsaa.audiobeacontransmitter E/AudioBEacon: 21834.0 
02-10 12:33:04.491 17013-17063/com.org.sohamsaa.audiobeacontransmitter E/AudioBEacon: 21533.0 
02-10 12:33:04.493 17013-17063/com.org.sohamsaa.audiobeacontransmitter E/AudioBEacon: 21705.0 
02-10 12:33:04.511 17013-17063/com.org.sohamsaa.audiobeacontransmitter E/AudioBEacon: 21533.0 
02-10 12:33:04.512 17013-17063/com.org.sohamsaa.audiobeacontransmitter E/AudioBEacon: 21447.0 
02-10 12:33:04.513 17013-17063/com.org.sohamsaa.audiobeacontransmitter E/AudioBEacon: 21490.0 
02-10 12:33:04.531 17013-17063/com.org.sohamsaa.audiobeacontransmitter E/AudioBEacon: 21576.0 
02-10 12:33:04.551 17013-17063/com.org.sohamsaa.audiobeacontransmitter E/AudioBEacon: 21619.0 
02-10 12:33:04.591 17013-17063/com.org.sohamsaa.audiobeacontransmitter E/AudioBEacon: 21877.0 
02-10 12:33:04.613 17013-17063/com.org.sohamsaa.audiobeacontransmitter E/AudioBEacon: 21576.0 
02-10 12:33:04.633 17013-17063/com.org.sohamsaa.audiobeacontransmitter E/AudioBEacon: 21920.0 
02-10 12:33:04.653 17013-17063/com.org.sohamsaa.audiobeacontransmitter E/AudioBEacon: 21791.0 

Мой диапазон частот 18 кГц до 20 khz.but я не получаю мой frequency.how, чтобы фильтровать frequency.thank вас.

+0

Удалить '(Int)' отливать здесь: 'max_magnitude = (ИНТ) величина [я];' - могут быть и другие проблемы, но это, безусловно, не так. Обратите также внимание на то, что большинство устройств имеют очень слабую чувствительность при> 18 кГц - микрофон обычно имеет плохой ответ выше 15 кГц, и фильтр слияния может также снизить уровни. –

+0

@ Paul R Спасибо за ваш ответ, и я удаляю (int). Но он не работает, и я генерирую 14 кГц, но я не получаю. Это мой результат в журнале E/AudioBEacon: 861.0 E/AudioBEacon: 21404,0 E/AudioBEacon: 21705,0 E/AudioBEacon: 21447,0 E/AudioBEacon: 215,0 E/AudioBEacon: 21705,0 E/AudioBEacon: 344,0 E/AudioBEacon: 473,0 E/AudioBEacon: 430,0 – Siddharthan

+0

что функция окна и как сделать? – Siddharthan

ответ

0

Наконец-то я нашел ответ. Просто примените FFT вместо JTransforms lib в моем коде. Этот код работает для меня.

int bufferSizeInBytes = 1024; 
short[] buffer = new short[bufferSizeInBytes]; 
class Recording extends Thread { 

    @Override 
    public void run() { 

     while() { 

      if (true) {     
       int bufferReadResult = audioInput.read(buffer, 0, bufferSizeInBytes); // record data from mic into buffer 
       if (bufferReadResult > 0) { 
        calculate(); 
       } 
      } 
     } 
    } 
} 
public void calculate() { 

    double[] magnitude = new double[bufferSizeInBytes/2]; 

    //Create Complex array for use in FFT 
    Complex[] fftTempArray = new Complex[bufferSizeInBytes]; 
    for (int i = 0; i < bufferSizeInBytes; i++) { 
     fftTempArray[i] = new Complex(buffer[i], 0); 
    } 

    //Obtain array of FFT data 
    final Complex[] fftArray = FFT.fft(fftTempArray); 
    // calculate power spectrum (magnitude) values from fft[] 
    for (int i = 0; i < (bufferSizeInBytes/2) - 1; ++i) { 

     double real = fftArray[i].re(); 
     double imaginary = fftArray[i].im(); 
     magnitude[i] = Math.sqrt(real * real + imaginary * imaginary); 

    } 

    // find largest peak in power spectrum 
    double max_magnitude = magnitude[0]; 
    int max_index = 0; 
    for (int i = 0; i < magnitude.length; ++i) { 
     if (magnitude[i] > max_magnitude) { 
      max_magnitude = (int) magnitude[i]; 
      max_index = i; 
     } 
    } 
    double freq = 44100 * max_index/bufferSizeInBytes;//here will get frequency in hz like(17000,18000..etc)   

} 
0

Просмотреть мой образец проекта. : D Github.

Эта частота получения с высокой точностью и большой скоростью основана на приложении Spectrum Analyzer, разработанном разработчиками Google.

enter image description here

Смежные вопросы