2016-09-22 3 views
1

今、私は1つのオーディオ信号処理を行っています。私は自分の電話機で録音したリアルタイムのオーディオサウンドウェーブを表示したいと思います。短い[]をdouble []に​​変換するにはどうすればよいですか?

私のオーディオフォーマットが「ENCODING_PCM_16BIT」であるという問題があります。では、16ビットのショートデータをダブルフォーマットに変更するにはどうすればよいですか?

ここは私のコードですが、正しく動作しません。誰でもこの問題を解決する手助けができますか?私は

おかげで "ダブル[] tempraw" を "ショート[]バッファ" でそれらのデータを入れたい

try { 

     AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, Sample_rate, Channel, Encording, 
       Buffersize); 

     DataOutputStream dos = new DataOutputStream(
       new BufferedOutputStream(new FileOutputStream(MainActivity.file))); 

     short[] buffer = new short[Buffersize/2]; //870 double/ 2 = 435 double 
     System.out.println("The buffer size is " + Buffersize); 
     timer1(); 
     audioRecord.startRecording(); // Start record 
     while (MainActivity.isrecord) { 
      int bufferReadResult = audioRecord.read(buffer, 0, buffer.length); 
      System.out.println("The buffer size is " + bufferReadResult); 
      for (int i = 0; i < bufferReadResult/2; i++) { 
       dos.writeShort(buffer[i]); 
       **tempraw[i] = (double)buffer[i];** 
      } 
      phase = DataProcess(tempraw); 
     } 
     audioRecord.stop(); // record stop 
     audioRecord.release(); 
     audioRecord = null; 
     dos.close(); // Output stream close 
     dos = null; 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

インターネットからコードを見た後、私はこれを作った。私はそれだけでdouble配列にint型の配列のように一つの二重

private static double shorttodouble(short[] a, int index) { 
    // TODO Auto-generated method stub 
    long l; 
    l = a[index + 0]; 
    l &= 0xffff; 
    l |= ((long) a[index + 1] << 16); 
    l &= 0xffffffffl; 
    l |= ((long) a[index + 2] << 32); 
    l &= 0xffffffffffffl; 
    l |= ((long) a[index + 3] << 48); 
    l &= 0xffffffffffffffffl; 
    l |= ((long) a[index + 4] << 64); 
    return (double)l; 
} 
+0

...しかし、それは正しくない作品の...'正確に何が正しく動作しないのですか? –

+0

私は短い[]があり、短いです。長さの番号。そして、短い4つの数字ごとに、1つのdouble値に変換されます。しかし、自分のコードで使用されている方法を使用すると、短い形式の2つの形式に変更されます。それは正しくありません。私はそれを知っているので、私は短いショート配列[短い[]バッファ=新しい短い[バッファサイズ/ 2];ダブル[] tempraw =新しいダブル[バッファサイズ/ 2/4] "。そして日食は "outofboundsexception"と伝えます – MarvinC

+0

あなたはあなたの質問を編集し、これをすべて記述する必要があります。まず、アルゴリズムの説明と実装方法を示します。その後、例外の詳細(メッセージ、スタックトレース、起点)を通知します。ところで、例外メッセージのためにGoogleにしようとすると、おそらくあなた自身がそれを理解することができます。 –

答えて

1

これを試してみてください: `---

short[] buffer = new short[size]; 
    double[] transformed = new double[buffer.length]; 
    for (int j=0;j<buffer.length;j++) { 
    transformed[j] = (double)buffer[j]; 
    } 
1

のために、ちょうどかなり遅い、2msのを働いたと思う、あなたはこの仕事をするためにループを必要とする:

short[] shorts = {1,2,3,4,5}; 
    double[] doubles = new double[shorts.length]; 

    for (int i = 0; i < shorts.length; i ++) { 
     doubles[i] = shorts[i]; 
     System.out.println(doubles[i]); 
    } 

非効率だが効果を。

+0

私はこれをチェックしています(http://blog.csdn.net/cshichao/article/details/9813973?utm_source=tuicool&utm_medium=referral)自分自身でプログラムを試してみてください。 – MarvinC

関連する問題