簡體   English   中英

Java-將byte []轉換為double [],反之亦然

[英]Java - Convert byte[] to double[] and vice versa

我正在做一些涉及讀取音頻數據的工作。 我需要將音頻數據byte []轉換為double [](反之亦然)。 我需要進行轉換以使信號通過低通濾波器。

為了將格式字節轉換為雙精度,我使用以下代碼片段:

// where data is the byte array.
ByteBuffer byteBuffer = ByteBuffer.wrap(data);
// make sure that the data is in Little endian order.
byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
// every double will represent 2 bytes (16bit audio sample)
// so the double[] is half length of byte[]
double[] doubleData = new double[data.length / 2];
int i = 0;
while (byteBuffer.remaining() > 2) {
    // read shorts (16bits) and cast them to doubles
    short t = byteBuffer.getShort();
    doubleData[i] = t;
    doubleData[i] /= 32768.0;
    i++;
}

我不知道這是否是最好的方法,尤其是因為它會給“ Java內存不足的堆空間異常”提供大量數據字節。

所以總結一下:

  1. 有沒有更好的方法來進行轉換, 而不會消耗堆空間
  2. 如何再次將雙打轉換為字節?

任何幫助表示贊賞

謝謝,

薩默·薩米(Samer Samy)

它真的需要成為double[]嗎?我不是float的忠實擁護者,但它可以為您提供足夠多的精度,並且只有一半大小。

如果要避免使用堆,請使用直接內存,即不要使用byte []或double [],而應將ByteBuffer,ShortBuffer和FloatBuffer用作直接內存。

順便說一句:設置字節的字節順序沒有任何作用。

ByteBuffer bb = // use direct memory if possible.
ShortBuffer sb = bb.order(ByteOrder.LITTLE_ENDIAN).asShortBuffer();
FloatBuffer fb = ByteBuffer.allocateDirect(sb.remaining() * 4)
                 .order(ByteOrder.nativeOrder()).asFloatBuffer();
while(sb.remaining()>0)
    fb.put(sb.get() / 32768.0f);

只是關於堆空間的一個隨機想法:在以后處理數組時,可以使/= 32768.0

編輯:代碼中的錯字

short[] shortData = new short[data.length / 2];
int i = 0;
while (byteBuffer.remaining() > 2) {
    // read shorts (16bits) and cast them to doubles
    short t = byteBuffer.getShort();
    shortData[i] = t;
    i++;
}

查看HugeCollections

龐大的集合庫旨在有效地支持內存中數據的大型集合,而不會影響GC。 它使用較少的堆內存並生成代碼來提高效率。

我知道這不是一個完整的答案(您需要任何幫助 ),但是要在Java中處理大量數據,您會在vanillajava博客上找到很多不錯的食譜。

您使用的唯一使用大量堆的東西是“數據”,尤其是“ doubleData”。 因此,如果您正在尋找一種減少堆空間的方法,那么您來的地方就錯了–您必須找到一種工作方式,而不要同時擁有所有內存的兩倍。 要么...

您知道如何擴展Java堆大小嗎? 如果不是,則需要學習-默認大小很小-如果有內存可用(可以這么說),則只有64MB。 從命令行,例如,添加“ -Xmx512m”半個演出:

java -Xmx512m MyApp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM