Java - конвертировать byte [] в double [] и наоборот - PullRequest
0 голосов
/ 31 августа 2011

Я работаю над чем-то, связанным с чтением аудиоданных. Мне нужно преобразовать байт [] аудиоданных в двойной [] (и наоборот). Мне нужно преобразование, чтобы пропустить сигнал через фильтр нижних частот.

Для преобразования байтов формы в дубликаты я использую следующий фрагмент кода:

// 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. как снова преобразовать двойные числа в байты?

Любая помощь приветствуется

Спасибо

Самер Сами

Ответы [ 4 ]

1 голос
/ 31 августа 2011

Действительно ли это должно быть double[] Я не большой поклонник поплавка, но он даст вам более чем достаточно цифр точности и будет вдвое меньше.

Если вы хотите избежать использованиякуча использует прямую память, т.е. не использует byte [] или double [] и вместо этого использует ByteBuffer, ShortBuffer и FloatBuffer для прямой памяти.

BTW: установка порядка байтов для байтов не подходитчто угодно.

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);
0 голосов
/ 31 августа 2011

Единственные вещи, которые вы используете, которые используют много кучи, это "данные" и особенно "doubleData".Так что, если вы ищете способ уменьшить пространство кучи, вы ищете не в том месте - вы должны найти способ работать, не имея в памяти все двойники одновременно.Или ...

Знаете ли вы, как увеличить размер кучи Java?Если нет, вам нужно учиться - по умолчанию размер небольшой - всего 64 МБ, если память служит (так сказать).Например, из командной строки добавьте «-Xmx512m» для половины концерта:

java -Xmx512m MyApp
0 голосов
/ 31 августа 2011

Извлечение HugeCollections .

Библиотека огромных коллекций разработана для эффективной поддержки больших коллекций данных в памяти без влияния ГХ.Это делается с использованием кучи меньше памяти и сгенерированного кода для повышения эффективности.

Я знаю, что это не полный ответ (вы просили любую помощь ), но для обработки большого количества данныхв java вы найдете множество отличных рецептов в блоге vanillajava .

0 голосов
/ 31 августа 2011

просто случайное представление о пространстве кучи: вы можете сделать /= 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++;
}
...