2012-02-08 10 views
4

javaとmatlabの両方で.wavファイルのデータを読み込み、バイトの配列として保存しようとしています。 MATLABでwavファイルを読むjava vs matlab

public byte[] readWav2(File file) throws UnsupportedAudioFileException, IOException { 

    AudioFormat audioFormat; 

    AudioInputStream inputAIS = AudioSystem.getAudioInputStream(file); 
    audioFormat = inputAIS.getFormat(); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

    // Read the audio data into a memory buffer. 
    int nBufferSize = BUFFER_LENGTH * audioFormat.getFrameSize(); 


     byte[] abBuffer = new byte[nBufferSize]; 
     while (true) { 

      int nBytesRead = inputAIS.read(abBuffer); 

      if (nBytesRead == -1) { 
       break; 
      } 
      baos.write(abBuffer, 0, nBytesRead); 
     } 

     byte[] abAudioData = baos.toByteArray(); 


     return abAudioData; 
    } 

を私はwavread関数で使用しています:

[Y, FS] = wavread('sound.wav', 'native'); 

をしかし、私は取得しています結果が異なっていて、次のように

Javaでコードが見えます。 Javaで

最初の20バイト:MATLABで

53, 0, 19, 0, -71, -1, -80, -1, -99, -1, 10, 0, 87, 0, -69, -1, 123, -1, -77, -1 

53, 19, -71, -80, -99, 10, 87, -69, -133, -77, 38, 143, 13, -100, 39, 45, -52, -83, -82, 56 

なぜJavaでの毎秒のバイトは0または-1 MATLABで存在しない場合? 0と-1をスキップしてもJavaのどこに123のMATLABがあるのですか-133ですか?なぜ違うのですか?

+0

ファイルはステレオですか?この[media page](http://pscode.org/media/#sound)で入手できる 'leftright.wav'の結果は何ですか?もっと早く助けを求めるには、[SSCCE](http://sscce.org/)を投稿してください。 –

+0

ファイルがモノではない – Radek

答えて

5

Javaは16ビットの署名付きPCMデータを返します。各サンプルは16ビットで1バイトは8ビットを保持するため、各サンプルはJavaで2バイトにまたがります。 Matlabが返すものは、16ビットサンプルの配列です。

基本的に、データは同じです。それはちょうど記憶の中で異なってレイアウトされています。

はこのように、あなたには、いくつかのビット単位の演算を行うことができ、Javaから簡単な方法でサンプルにアクセスするには:

int firstSample = (abAudioData[0]&0xFF) | (abAudioData[1]<<8); 

別の方法を、サンプルを読み取るためにjava.nioのバッファである:

ByteBuffer bb = ByteBuffer.wrap(abAudioData); 
bb.order(ByteOrder.LITTLE_ENDIAN); 
ShortBuffer sb = bb.asShortBuffer(); 

int firstSample = sb.get(); 
+0

これは、matlabコードと同じ結果を得ています。しかし今は、このデータをFFT処理のためにdoubleの配列として格納するように変換する必要があります。バイトは短いものとして保存されているので、その方法は? – Radek

+1

私はあなたがそれぞれの 'short'を通って' double'にキャストする昔ながらのループが必要だと思っています... – Joni

+0

しかし、uをdoubleに変換すると、uは変換されたバイトを変換するときと同じ結果を得ません二重に短くて – Radek

関連する問題