5

16ビットPCM形式のWaveファイルがあります。生データbyte[]とサンプルを抽出する方法があり、フロート形式、つまりfloat[]フーリエ変換を行うためにそれらが必要です。これが私のコードです、これは正しく見えますか?私はAndroidで作業しているので、javax.sound.sampledなどは利用できません。

private static short getSample(byte[] buffer, int position) {
  return (short) (((buffer[position + 1] & 0xff) << 8) | (buffer[position] & 0xff));
}

...

float[] samples = new float[samplesLength];
  for (int i = 0;i<input.length/2;i+=2){
    samples[i/2] = (float)getSample(input,i) / (float)Short.MAX_VALUE;
  }
4

3 に答える 3

7

私も同様の解決策を持っていましたが、私見は少しきれいです。残念ながら、私が知る限り、適切なライブラリメソッドはありません。*これは、偶数バイトが下位バイトであることを前提としています。

private static float[] bytesToFloats(byte[] bytes) {
    float[] floats = new float[bytes.length / 2];
    for(int i=0; i < bytes.length; i+=2) {
        floats[i/2] = bytes[i] | (bytes[i+1] << 8);
    }
    return floats;
}
于 2011-01-07T21:52:18.413 に答える
3

ByteBufferAPIを使用してみてください。 http://developer.android.com/reference/java/nio/ByteBuffer.html#asFloatBuffer()

于 2011-05-31T15:45:26.107 に答える
2

hertzsprungによって示されるように、jkによる答え。符号なしPCMでのみ機能します。Androidでは、PCM16はビッグエンディアンで署名されているため、 2の補数でエンコードされた潜在的に負の値を考慮する必要があります。これは、上位バイトが127より大きいかどうかを確認する必要があることを意味します。大きい場合は、256を掛ける前に、最初に256を減算します。

private static float[] bytesToFloats(byte[] bytes) {
    float[] floats = new float[bytes.length / 2];
    for(int i=0; i < bytes.length; i+=2) {
        floats[i/2] = bytes[i] | (bytes[i+1] < 128 ? (bytes[i+1] << 8) : ((bytes[i+1] - 256) << 8));
    }
    return floats;
}
于 2015-03-17T04:55:28.233 に答える