next up previous
Next: 2.1.1 ReadWave.java Up: 2 Java で FFT Previous: 2 Java で FFT

2.1 WAVE ファイルを読む

これは手助けすることにした。

Waveファイルを読み込んで、音を鳴らしながら、 音声データを数値表示するプログラム ReadWave.java を作成した。 Wave ファイルの読み込みをする部分は、 Java で Hello World! サウンド編 にある HelloWorldSound.java を参考にした。 オーディオ・データの形式は、 Java のクラス・ライブラリィが調べてくれるので、 「尋ねる」だけである。 音のビット・データを Byte の配列として読み込むわけだが、 それをどのように数値として解釈するかは、 色々場合分けが必要で結構面倒である (定番の、16ビット・ステレオ、符号付き PCM データに限れば簡単だと思うが…)。

  javac ReadWave.java
とコンパイルする。解析したい Wave ファイルのパス名を与えて実行する。 例えば
  java ReadWave piano.wav
とすると、piano.wav を入力として仕事をする。 数値データの出力は膨大なものとなるので、 次のようにリダイレクトするのが良いかもしれない。
  java ReadWave piano.wav > piano.txt

チェック用に piano.wav を ReadWave で処理した結果 piano.txt を載せておく。

ソース・プログラムは案外長いが、 (i) 16ビット・ステレオ、(ii) 8ビット・ステレオ、 (iii) 16ビット・モノラル、(iv) 8ビット・モノラル、 と4つに場合分けしてあるからである (本当はこれにエンディアンの違いと、符号の有無の違いで、 さらに場合分けする必要があるが、それは無視した)。

16ビット・ステレオの場合 (リトル・エンディアン, 符号付き)
     nBytesRead = audioInputStream.read(abData, 0, abData.length);

     if (nBytesRead >= 0) {
        for (int i = 0; i < nBytesRead; i += 4) {
            short left, right;
            left  = (short)(abData[i  ] | (abData[i+1] << 8));
            right = (short)(abData[i+2] | (abData[i+3] << 8));
            System.out.println("" + left + " " + right);
        }
     }




next up previous
Next: 2.1.1 ReadWave.java Up: 2 Java で FFT Previous: 2 Java で FFT
Masashi Katsurada
平成20年2月15日