Преобразование wav файла для БПФ

187
04 февраля 2020, 19:00

Читается 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 нет отрицательных значений)? И какой шаг нужно сделать дальше?

Answer 1

Отрицательных чисел нет, поскольку знаковый бит 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
READ ALSO
Возможно ли создавать таблицы бд во время выполнения программы и как это можно реализовать с помощью EF? [дубликат]

Возможно ли создавать таблицы бд во время выполнения программы и как это можно реализовать с помощью EF? [дубликат]

Допустим у меня есть база данных инструментов и различной утвари для постройки дома, починки машины и тд

171
Ряд вопросов при работе с EXCEL таблицей через С# (interop)

Ряд вопросов при работе с EXCEL таблицей через С# (interop)

Задача: вытащить данные из строк таблицы минуя строки заголовков, пустые строки и тп

183
Работа с DataGridView

Работа с DataGridView

В DataGridView1 созданы столбцы к примеру

168
MySQL как составить SQL запрос?

MySQL как составить SQL запрос?

База данных MySQLИмеется таблица battles и players

255