2012-05-03 41 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カード上のオーディオデータを格納しています: オーディオは、次のように記録します。データを減らすためにi2をループし、i2 = 0 ... 10; アプリの次の部分では、ユーザーがaudiodataの一部を切り取って、この部分だけをトリムされたベクトルにロードさせます。 私はこれらの周波数のFFTを行います。しかし、データにはオーバードライブしかないようです。

録音中にマイクの自動ゲインをトリガーすることはできますか?

記録され保存されたaudiodataをAudacityにロードするにはどうすればよいですか?私はこの権利を得たフィルタは、FFTの前に適用されなければならない場合 (私は生データの異なるインポートの設定を試みたが、動作するように見えるdoesntの) Here is an example file

私は、バターワース・フィルタを実装しましたか?

+0

マイクからゲインを得るためにwhile(started)ループでaudiorecord.start audiorecord.stopをトリガーするだけで十分でしょうか?試してみると、スピードの問題が発生すると思います。 – user1222353

+0

私のコメントに答える:その遅すぎる、不幸にも – user1222353

答えて

0

あなたのマイクゲインの問題に答えることはできませんが、フィルタに関する質問は次のとおりです。これはフィルタの実現方法によって異なります。バタワースフィルタは通常、IIR(無限インパルス応答、すなわち、フィルタの出力は前の出力に依存する)フィルタとして、Z変換を介して(recurrence relation)を介して実現される。このようにフィルタを実現した場合、FFTを実行する前に、時間領域サンプルにフィルタを適用する必要があります。

フィルタが必要な場合は、FFTをとっておけば、コンボルーションでFIRフィルタを実装し、バターワースやその他のs/zドメインフィルタではなくConvolution theoremを実装するほうが良いでしょう。

関連する問題