Как преобразовать.WAV образец аудиоданных в двойной тип?

К сожалению, вы не можете использовать десятичные числа в значениях атрибутов, так как сам CLR на самом деле не знает о типе System.Decimal - это не примитивный тип, такой как int, double и т. Д. Компилятор C # в основном подделывает его для константных полей введите десятичное число, но оно не может достичь того же эффекта с атрибутами.

Из спецификации C # 3, раздел 17.1.3:

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

  • Один из следующих типов: bool, byte, char, double, float, int, long, sbyte, short, string, uint, ulong, ushort.
  • Тип объекта.
  • Тип System.Type.
  • Тип enum при условии, что он имеет общедоступную доступность, а типы, в которые он вложен (если есть), также имеют общедоступную доступность (§17.2).
  • Одномерные массивы вышеуказанных типов.

Далее в разделе 17.2:

Выражение E является выражением атрибут-аргумент, если все следующие утверждения> true:

  • Тип E является типом параметра атрибута (§17.1.3).
  • Во время компиляции значение E может быть преобразовано в одно из следующих значений:
    • Постоянное значение.
    • Объект System.Type.
    • Одномерный массив выражений атрибут-аргумент.
5
задан JasonMArcher 23 July 2015 в 17:28
поделиться

4 ответа

Предупреждение: целые числа и байты подписаны. Возможно, вам нужно замаскировать младшие байты при их объединении:

for (int i =0; i < length; i += 4) {
    double left = (double)((bytes [i] & 0xff) | (bytes[i + 1] << 8));
    double right = (double)((bytes [i + 2] & 0xff) | (bytes[i + 3] << 8));

    ... your code here ...

}
5
ответ дан 14 December 2019 в 01:15
поделиться

Little Endian означает, что данные имеют формат BBAA и DDCC. Вы бы просто поменяли его местами.

С начала кадра:

int left = (bytes[i+1] << 8) + bytes[i];
int right = (bytes[i+3] << 8) + bytes[i+2];

, где i - ваш индекс вашего образца.

0
ответ дан 14 December 2019 в 01:15
поделиться

Я бы лично поискал библиотеку, которая выполняет обратную замену за вас. Каждый формат аудиофайла имеет предположения о порядке байтов для вас, и получить это правильно сложно для всех поддерживаемых волновых файлов с битовой глубиной / типами данных:

  • 8bit - uint8
  • 16bit - int16
  • 24bit - int32
  • 32bit - int32 as float
  • 32bit - float
  • 64bit - double

Если вы хотите поддерживать наиболее распространенные типы файлов wave, вам потребуются преобразования с порядком байтов для всех этих типов данных.

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

Жаль, что Java не имеет поля порядка байтов в своих классах файлового ввода-вывода. Возможность просто открыть файл большой или небольшой - гораздо более простое решение этой проблемы.

0
ответ дан 14 December 2019 в 01:15
поделиться

Когда вы используете ByteBuffer ( java.nio.ByteBuffer ), вы можете использовать порядок методов;

[порядок]

публичный окончательный порядок байтового буфера (ByteOrder bo)

Modifies this buffer's byte order.

Parameters:
    bo - The new byte order, either BIG_ENDIAN or LITTLE_ENDIAN
Returns:
    This buffer

После этого вы можете получить вышеупомянутые значения с помощью;

getChar () getShort () getInt () getFloat () getDouble ()

Какой отличный язык - это Java ;-)

4
ответ дан 14 December 2019 в 01:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: