2014-12-03 67 views
1

我正在使用this FFT庫對設備麥克風捕捉的聲音執行FFT。我正在使用以下代碼:在聲音文件上執行dtmf解碼器的FFT android

int bufferSize = AudioRecord.getMinBufferSize(frequency, 
        channelConfiguration, audioEncoding); 
      AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, 
        frequency, channelConfiguration, audioEncoding, bufferSize); 
      int bufferReadResult; 

      try { 
       audioRecord.startRecording(); 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
       Log.e("Recording failed", e.toString()); 
      } 
      while (true) { 
       bufferReadResult = audioRecord.read(buffer, 0, blockSize); 
       if (isCancelled()) 
        break; 
       boolean bln = false; 
       for (int i = 0; i < blockSize && i < bufferReadResult; i++) { 
        toTransform[i] = (double) buffer[i]/32768.0; 
        if (buffer[i] != 0) { 
         bln = true; 
        } 
       } 
       if (bln) { 
        transformer.ft(toTransform); 
        doStuff(toTransform); 
       } else { 
        try { 
         audioRecord = new AudioRecord(
           MediaRecorder.AudioSource.DEFAULT, frequency, 
           channelConfiguration, audioEncoding, bufferSize); 
         audioRecord.startRecording(); 
        } catch (IllegalStateException e) { 
         e.printStackTrace(); 
         Log.e("Recording failed", e.toString()); 
        } 
       } 
       if (isCancelled()) 
        break; 
      } 
      try { 
       audioRecord.stop(); 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
       Log.e("Stop failed", e.toString()); 
      } 

它適用於麥克風。但是我想對聲音文件進行這種轉換(在原始文件夾中)。我嘗試使用InputStreamReader讀取聲音文件內容,但是如何使用此文件數據對文件應用轉換?我嘗試使用以下代碼的緩衝區:

InputStream ins; 
    ByteArrayOutputStream outputStream; 
    int size = 0; 
    byte[] buffer = new byte[1024]; 
ins = getResources().openRawResource(R.raw.fire); 
    outputStream = new ByteArrayOutputStream(); 
    transformer = new RealDoubleFFT(blockSize); 
while ((size = ins.read(buffer, 0, 1024)) >= 0) { 
        outputStream.write(buffer, 0, size); 
        if (isCancelled()) 
         break; 
        boolean bln = false; 
        for (int i = 0; i < buffer.length; i++) { 
         toTransform[i] = (double) buffer[i]/32768.0; 
         if (buffer[i] != 0) { 
          bln = true; 
         } 
        } 
        if (bln) { 
         transformer.ft(toTransform); 
         doStuff(toTransform); 
        } 
       } 
       ins.close(); 

但它沒有返回正確的數據。也許從文件收到的數據不是圖書館想要的。任何想法如何將FFT應用於聲音文件?

+0

聲音文件的格式是什麼?聲音文件通常包含聲音信號之外的其他信息,例如聲音信號,這會混淆你的fft。 – cgew85 2014-12-03 15:04:33

+0

您不能使用inputStreamReader,因爲該文件不是原始的二進制聲音。你需要在FFT之前解碼聲音。 – njzk2 2014-12-03 15:07:49

+0

[計算來自音頻文件的FFT]的可能重複(http://stackoverflow.com/questions/17565269/calculate-fft-from-audio-file)(這個想法是,你必須先解碼wav文件) – njzk2 2014-12-03 15:10:52

回答

0

您似乎正在轉換單個字節,但是.wav/RIFF文件的格式(通常爲44個字節)通常是16位或2個字節的小端樣本。

+0

我應該遵循什麼方法? – berserk 2014-12-04 09:15:23