Читается wav файл (16-бит) в битовый массив buffer, далее стоит задача преобразовать данный массив для "Быстрого Преобразования Фурье". Для этого использую представленный ниже алгоритм:
public static double[] readAmplitudeValues(byte[] buffer, bool isBigEndian = true)
{
int MSB, LSB; // старший и младший байты
double[] data = new double[buffer.Length / 2];
for (int i = 0; i < data.Length; i++)
{
if (isBigEndian) // задает порядок байтов во входном сигнале
{
// первым байтом будет MSB
MSB = buffer[2 * i];
// вторым байтом будет LSB
LSB = buffer[2 * i + 1];
}
else
{
// наоборот
LSB = buffer[2 * i];
MSB = buffer[2 * i + 1];
}
// склеиваем два байта, чтобы получить 16-битное вещественное число
// все значения делятся на максимально возможное - 2^15
data[i] = ((MSB << 8) | LSB) / 32768.0;
}
return data;
}
Как понять рабочий ли алгоритм (на выходе в массиве data нет отрицательных значений)? И какой шаг нужно сделать дальше?
Отрицательных чисел нет, поскольку знаковый бит 32-разрядного числа не заполняется при операции MSB << 8
Следует использовать тип short
для знаковых 16-разрядных чисел. IDeone
public static void Main()
{
byte b = 0x80;
short MSB;
short LSB;
double data;
MSB = b;
LSB = b;
data = (((short)(MSB << 8)) | LSB) / 32768.0;
Console.Out.WriteLine(data);
}
>>-0.99609375
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Допустим у меня есть база данных инструментов и различной утвари для постройки дома, починки машины и тд
Задача: вытащить данные из строк таблицы минуя строки заголовков, пустые строки и тп