Преобразование между двумя представлениями с фиксированной точкой

Я пытаюсь преобразовать число из одного представления с фиксированной точкой в ​​другое. Я использую 2-дополнительное представление (представление Qmf). Это необходимо для проверки аппаратной реализации. Аппаратная реализация работает следующим образом:

Входные данные в формате Qmf. Входные данные имеют ширину 8 бит и дробную длину 6 бит. Я хочу преобразовать его в 4-битное число с 4 дробными битами (без целых битов), и у меня есть несколько сомнений относительно того же.

Я заметил, что когда я пытаюсь преобразовать числа типа 1.984375 из формата Q26 {range [-2,1.984375]} в формат Q04 {range [-0.5,0.4375]}, аппаратная реализация работает следующим образом: я читаю биты 5–2 поскольку биты 6 и 7 используются для целой части и сохраняют ее в 4-битном регистре. Таким образом, это значение интерпретируется как -0,5 при преобразовании в формат Q04. -0,5 правильно? Количество допущенных ошибок кажется огромным. Я делаю что-то неправильно ? Если вышеупомянутый подход верен. Существует ли какая-либо стандартная процедура для преобразования из одного представления с фиксированной точкой в ​​другое в программном обеспечении, которое имитирует аппаратный подход, который я описал выше. Я думаю о преобразовании числа из представления Q26 в плавающую точку и преобразовании его обратно в фиксированную точку. Есть ли более чистый способ сделать это в программном обеспечении?


person a220599    schedule 09.11.2017    source источник
comment
Поскольку число Q26 превышает максимальное значение, которое вы можете сохранить в формате Q04, преобразование должно либо сообщать об ошибке (переполнении), либо возвращать максимально возможное значение.   -  person 1201ProgramAlarm    schedule 09.11.2017
comment
Ваш формат Q0.4 предназначен для подписи [диапазон -0,5 .. + 0,4375] или без знака [0..0,9375]?   -  person NickJH    schedule 09.11.2017
comment
Я использую подписанное представление.   -  person a220599    schedule 09.11.2017
comment
@ 1201ProgramAlarm Да, это вызывает ошибки, но я хочу знать, есть ли какие-либо алгоритмы, которые позволяют мне преобразовывать из одного представления с фиксированной точкой в ​​другое.   -  person a220599    schedule 09.11.2017


Ответы (1)


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

Если ваш номер Q26 положительный (т. Е. Бит-7 равен нулю), то соответствующий номер Q04 будет от битов-2 до битов-5 вашего исходного числа, при условии, что бит-6 равен нулю. Это означает, что ваше исходное число должно быть меньше единицы.

Если ваш номер Q26 отрицательный (т. Е. Бит-7 равен единице), то соответствующий номер Q04 снова будет от битов-2 до битов-5 или вашего исходного числа, но на этот раз при условии, что бит-6 равен единице и есть хотя бы один ненулевой бит в битах 2-5. Это означает, что ваше исходное число должно быть больше минус единицы.

В каждом случае вы получите ошибку округления из-за игнорирования битов 0 и 1, которую вы, возможно, захотите учесть, добавив или вычтя единицу к младшему биту вашего числа Q04. Это, очевидно, потребует дополнительной арифметической операции и рискует выйти за пределы допустимого диапазона вашего числа Q04.

Если вы хотите поэкспериментировать с этим в Python, вы можете попробовать такую ​​библиотеку, как spfpm.

person rwp    schedule 17.02.2018