2012-05-03 78 views
2

我試圖記錄比賽自行車的聲音並分析錄製的音頻與FFT並找到引擎頻率。 如果我只吹口哨,一切正常,我可以看到一個清晰的圖形,它對應着我的呼嘯聲低和高,等等。我使用不同的顏色創建了一個熱圖,用於獲取頻率與時間的FFT的不同幅度。 音頻被記錄是這樣的:Android:麥克風音量級別(可能),自動增益,FFT,巴特沃斯,Audacity

private class RecordAudio extends AsyncTask<Void, float[], Void> { 
     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
      int bufferSize = AudioRecord.getMinBufferSize(sampleRateMain, 
        channelConfiguration, audioEncoding); 
      AudioRecord audioRecord = new AudioRecord(
        MediaRecorder.AudioSource.DEFAULT, sampleRateMain, 
        channelConfiguration, audioEncoding, bufferSize); 
      short[] buffer = new short[blockSize]; 
      audioRecord.startRecording(); 
      float[] audioData = new float[blockSize]; 
      try{ 
      SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); 
      String currentDateandTime = sdf.format(new Date()); 

      BufferedWriter writer; 
      String pathtemp = Environment.getExternalStorageDirectory().getAbsolutePath(); 
      String filename ="/"+currentDateandTime; 
      path = pathtemp +filename; 
      writer = new BufferedWriter (new FileWriter(path,false)); 
      int i2=0; 
      while (started) { 
       if(i2==10){     
        datastructures tempdata = new datastructures(); 
        i2=0; 
        audioRecord.read(buffer, 0, blockSize);   
        float sum = 0; 
        for (int i = 0; i < blockSize; i++) { 
         audioData[i] = (float) (buffer[i]); 
         writer.write(audioData[i]+" "); 
          if (audioData[i] <= 0) { 
           audioData[i] = audioData[i] * (-1); 
          } 
          sum = sum + audioData[i]; 
        } 
        writer.newLine(); 
        tempdata.freqsum = sum; 
        mainData.add(tempdata); 
       } 
       i2++;     
      } 
      writer.close(); 
      } 
      catch(IOException e){ 
       e.printStackTrace(); 
      }    
      audioRecord.stop();   
     } catch (Throwable t) { 
      Log.e(TAG, "Audio recording Failed"); 
     } 
     return null; 
    } 
} 

,所以我存儲在SD卡上的audiodata。爲了減少通過i2循環的數據並且僅在i2 = 0 ... 10中記錄一次; 在應用程序的下一部分中,我讓用戶剪下一部分音頻數據,並只將該部分加載到名爲trimmed的矢量中。 然後我做了這些頻率的FFT。但似乎只有數據過載。

記錄時是否可以觸發麥克風的自動增益?

我該如何將記錄和保存的audiodata加載到Audacity中? (我嘗試了不同的進口設置了原始數據,但它似乎沒有工作) Here is an example file

我實現了一個巴特沃斯濾波器,如果我得到這個權利過濾器應FFT之前被應用?

+0

只是一個想法,是否足以在while(啓動)循環中觸發audiorecord.start audiorecord.stop以從麥克風獲得增益?沒有嘗試,我認爲這會導致速度問題。 – user1222353

+0

回答我的評論:它太慢,不幸 – user1222353

回答

0

我無法回答您的麥克風增益問題,但至於過濾器問題:這取決於您如何實現過濾器。巴特沃斯濾波器通常通過Z變換(recurrence relation)實現爲IIR(無限脈衝響應,即濾波器的輸出取決於先前的輸出)濾波器。如果以這種方式實現了濾波器,那麼在進行FFT之前應該將濾波器應用於時域採樣。

如果你需要一個濾波器,並且你正在使用FFT,你可能更適合通過卷積和Convolution theorem實現FIR濾波器,而不是使用butterworth或其他s/z域濾波器。