Я играю с файлами AIFF, которые включают 80-битное «расширенное» значение формата, определяющее частоту дискретизации. Поскольку ни мой выбранный язык R
, ни мой настольный Mac не поддерживают этот размер изначально, мне нужно написать код преобразования. Учитывая структуру данных битов, как показано здесь и на этом изображении с этой страницы.
,
Могу ли я просто усечь часть «дроби», предполагая, что я никогда не увижу частоту дискретизации с такой высокой точностью? То есть могу ли я взять 64 бита, начиная слева, и рассматривать их как двойное число с плавающей запятой? Обратите внимание, что количество допустимых битов в экспоненте также должно быть усечено, как указано в таблице в этом вопросе
Минимальный пример: я проверил, что частота дискретизации в тестовом файле равна 44100.
10 байтов, считанных из заголовка AIFF:
40 0e ac 44 00 00 00 00 00 00
редактировать
ac 44
, поскольку 4 необработанных байта, преобразованных в десятичные числа, становятся 44100
, что соответствует ожидаемой частоте дискретизации.
Я думаю, вам нужно взять 15-битный показатель степени и вычесть из него 15360, а затем повторно сохранить его как 11 бит (при условии, что он подходит).
О, еще одна вещь. В 80-битном расширенном формате Intel явно сохраняется первый бит мантиссы («целая часть» на рисунке), поэтому требуются дальнейшие настройки.
@SteveSummit, спасибо, ты подтверждаю часть моих подозрений. Я устрою несколько операций побитового сдвига и посмотрим, повезет ли мне.
Вот прямой подход, который не требует никакого усечения.
преобразовать 15-битную экспоненту. Следуйте стандартной процедуре для парных, но теперь посчитайте ExpMul = 2^(exponent - 16383)
; последнее число равно 2^14 -1 .
Сохраните ведущий бит мантиссы (эквивалент неявной «1» в двойном формате). Вычислите значение остальных битов как десятичную дробь. (Примечание: для этого я использовал bigBits:fracB2B
).
умножай (lead_bit + fraction) * (ExpMul)
.
Значение моей выборки на самом деле дало 44100 , как я и ожидал найти.
Да, если вы усекаете дробь и корректируете показатель степени, это должно работать, но необходимое изменение битов может оказаться непростым. (То есть это не просто «взять 64 бита, начиная слева».) Чтобы получить дополнительную оценку, вы можете убедиться, что новая дробь правильно округлена, а не просто усечена.