Я не так разбираюсь в Java, поэтому, пожалуйста, держите его достаточно простым. Я, однако, попытаюсь понять все, что вы публикуете. Вот моя проблема.Преобразование Фурье байтового массива
Я написал код для записи звука с внешнего микрофона и сохранил его в .wav. Хранение этого файла имеет значение для целей архивирования. Мне нужно сделать FFT сохраненного звука.
Мой подход к загрузке wav-файла в виде байтового массива и его преобразование с проблемой: 1. Есть заголовок, способ, которым мне нужно избавиться, но я должен уметь это сделать и 2 У меня есть байтовый массив, но большинство, если не все алгоритмы FFT, я нашел в Интернете и попытался выполнить патч в моей проектной работе со сложными/двумя двойными массивами.
Я попытался обойти обе эти проблемы и, наконец, смог построить свой массив FFT в виде графика, когда узнал, что он просто возвращает мне «0». Файл .wav в порядке, я могу воспроизвести его без проблем. Я подумал, может быть преобразование байтов в двойников была проблема для меня, так вот мой подход к тому, что (я знаю, что это не очень)
byte ByteArray[] = Files.readAllBytes(wav_path);
String s = new String(ByteArray);
double[] DoubleArray = toDouble(ByteArray);
// build 2^n array, fill up with zeroes
boolean exp = false;
int i = 0;
int pow = 0;
while (!exp) {
pow = (int) Math.pow(2, i);
if (pow > ByteArray.length) {
exp = true;
} else {
i++;
}
}
System.out.println(pow);
double[] Filledup = new double[pow];
for (int j = 0; j < DoubleArray.length; j++) {
Filledup[j] = DoubleArray[j];
System.out.println(DoubleArray[j]);
}
for (int k = DoubleArray.length; k < Filledup.length; k++) {
Filledup[k] = 0;
}
Это функция, я использую, чтобы преобразовать массив байтов в два раза массив:
public static double[] toDouble(byte[] byteArray) {
ByteBuffer byteBuffer = ByteBuffer.wrap(byteArray);
double[] doubles = new double[byteArray.length/8];
for (int i = 0; i < doubles.length; i++) {
doubles[i] = byteBuffer.getDouble(i * 8);
}
return doubles;
}
Заголовок, который находится там, я знаю это, но это должно быть самой маленькой проблемой прямо сейчас. Я преобразовал массив байтов в двойной массив, а затем заполнил этот массив до следующей степени 2 с нулями, так что БПФ может фактически работать (ему нужен массив из 2^n значений). Используемый мной алгоритм БПФ получает два двойных массива в качестве входных данных, один из которых является реальным, а другой - мнимой частью. Я читал, что для этого, чтобы работать, мне пришлось бы оставить мнимый массив пустым (но его длина была такой же, как реальный массив).
Стоит упомянуть: я записываю 44100 кГц, 16 бит и моно.
При необходимости я отправлю БПФ, который я использую.
Если я пытаюсь напечатать значения двойной массив, я получаю вид странные результаты:
...
-2.0311904060823147E236
-1.3309975624948503E241
1.630738286366793E-260
1.0682002560745842E-255
-5.961832069690704E197
-1.1476447092561027E164
-1.1008407401197794E217
-8.109566204271759E298
-1.6104556241572942E265
-2.2081172620352248E130
NaN
3.643749694745671E-217
-3.9085815506127892E202
-4.0747557114875874E149
...
Я знаю, что где-то проблема лежит со мной с видом что-то очень простое, я должен быть в курсе, но Кажется, я не могу найти проблему. Наконец, мой вопрос: как я могу заставить это работать?
Вопрос в том, как вы преобразовываете значение байта в двойное значение? Эта часть кода не отображается. Вы используете https://docs.oracle.com/javase/8/docs/api/java/lang/Byte.html#doubleValue--? – lschuetze
Я включу функцию в код выше. –
Вы говорите о заголовке, является ли это частью массива байтов? Если это так, вы должны пропустить nb байтов этого заголовка перед чтением удвоений. –