2014-12-03 68 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