2012-05-03 3 views
2

Я пытаюсь записать звук гоночного велосипеда и проанализировать записанный звук с помощью FFT и найти частоту двигателей. Если я только свистеть, все работает нормально, я могу видеть четкий график, который соответствует моему свистунию низко и высоко и так далее. Я создаю тепловую карту с разными цветами для разных амплитуд, которые я получаю от БПФ для частоты и времени. Аудио получает записывается так:Android: уровень громкости микрофона (возможно), автоматический коэффициент усиления, FFT, Butterworth, 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-карте. Чтобы уменьшить данные i, пройдите через i2 и запишите только один раз в i2 = 0 ... 10; В следующей части приложения я разрешаю пользователю вырезать часть аудиоданных и загружать только эту часть в вектор под названием trimmed. Затем я делаю БПФ этих частот. Но похоже, что в данных есть только овердрайв.

Можно ли активировать автоматическое усиление для микрофона во время записи?

Как загрузить записанные и сохраненные аудиоданные в Audacity? (я пробовал различные параметры импорта для необработанных данных, но это не похоже на работу) Here is an example file

Я реализовал фильтр Баттерворта, если я получил это право фильтр должен быть применен перед FFT?

+0

Просто идея, было бы достаточно, чтобы вызвать audiorecord.start audiorecord.stop в цикле while (start), чтобы получить выигрыш от микрофона? Не пытаясь понять, что это приведет к быстроте. – user1222353

+0

ответил на мой комментарий: его слишком медленно, к несчастью – user1222353

ответ

0

Я не могу ответить на вопрос о получении микрофона, но что касается вопроса о фильтрах: это зависит от того, как вы поняли свой фильтр. Фильтр Баттерворта обычно реализуется как IIR (бесконечный импульсный отклик, т. Е. Выход фильтра зависит от предыдущих выходов) фильтр через Z-преобразование (recurrence relation). Если вы выбрали фильтр таким образом, тогда вы должны применить фильтр к выборкам временного домена, прежде чем принимать БПФ.

Если вам нужен фильтр, и вы все равно принимаете БПФ, вам, вероятно, лучше не использовать КИХ-фильтр через свертку и Convolution theorem вместо использования фильтров масляного фильтра или других фильтров домена s/z.