2017-02-10 63 views
0

我在android.I中做聲音分析器應用程序可以使用AudioTrack Api.i生成18 kHz至20 kHz超聲波音頻可以使用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 kHz至20 khz.but我沒有得到我的frequency.how篩選我frequency.thank你。

+0

刪除'(INT)'投這裏:'max_magnitude =(int)的大小[I]' - 可能還有其他的問題,但是這肯定是不對的。還要注意,大多數設備在> 18 kHz時的靈敏度非常差 - 麥克風通常在15 kHz以上響應較差,抗干擾濾波器可能會進一步降低音量。 –

+0

@保羅 - [R感謝您的回覆,我刪除(INT),但它不工作,我產生14 kHz的頻率,但我不getting.This是我的日誌結果 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庫。此代碼適用於我。

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

基於Google開發人員開發的頻譜分析器應用程序,它可以高精度和高速度檢索頻率。

enter image description here