現在,我正在進行一個音頻信號處理,並且我想要實時顯示我手機錄製的音頻聲波。如何將short []轉換爲double []?
這是我的音頻格式爲「ENCODING_PCM_16BIT」的問題。那麼如何將16位短數據更改爲雙格式呢?
這是我的代碼,但它的工作不正確。誰能幫我解決這個問題嗎?
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();
}
我希望把這些數據在 「短[]緩衝區」,以 「雙[] tempraw」
謝謝!
當我看了一些來自互聯網的代碼後,我做了這個。我認爲它的工作,只是很慢,2ms的一個雙
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;
}
'...但它工作不正常...'究竟不能正常工作? –
我有一個簡短的[],並有short.length數字。對於每四個短號碼,他們將轉換爲一個雙值。但是,如果我使用我的代碼中使用的方式,只需將其中一個短號碼更改爲雙重格式即可。這是不正確的。我知道,因爲我初始化短陣列就像那樣「short [] buffer = new short [Buffersize/2]; double [] tempraw = new double [Buffersize/2/4]」。日蝕告訴我,「outofboundsexception」 – MarvinC
你必須編輯你的問題,並描述所有這一切。首先,向我們展示算法描述和實現。然後發佈異常詳情:消息,堆棧跟蹤,原點。順便嘗試谷歌異常信息,可能你可以自己搞清楚。 –