Jump to content

    
Sign in to follow this  
dak

Округление и отбрасываение разрядности

Recommended Posts

Всем привет.

 

Допустим, у меня есть вектор 48 бит, из которых мне надо только 16 бит. Известно, что вектор 48 бит получается из перемножения векторов 32 бита и 16 бит, при этом вектор 32 бита - беззнаковое число (максимум 32000, 2 в какой-то там степени), а 16 бит - число знаковое, и диапазон от -32000 до 32000 (та же степень двойки). Мне надо, чтобы оставляемый от 48 битного вектор в 16 бит был также в диапазоне от -32000 до 32000.

 

Идея в том, что тот 16 битный вектор, который умножается на 32 битный вектор - это отсчеты синуса, я не могу менять его амплитуду. Вектор 32 бита - амплитуда синуса, и хочу, чтобы выходной вектор (который также будет синусом) имел близкую амплитуду (близкую к тому значению, что записано в 32 битный вектор).

 

Рассматривал на таком примере: допустим,есть 4 битный вектор. Диапазон от -8 до 7. Если убрать младший разряд, то останется 3 бита, и диапазон будет от -4 до 3. То есть, убрать младший разряд - это практически эквивалентно тому, чтобы поделить записанное в вектор число на 2. Как я понимаю, удаление старшего бита будет иметь схожий эффект.

 

Я попробовал покрутить это все дело, но особо не вышло. Подскажите пожалуйста, как выбрать разрядность.

 

PS. Я знаю, что просто отбросить разряды нельзя и знаю что делать дальше, но вопрос сейчас именно в выборе разрядности.

Share this post


Link to post
Share on other sites

Если честно, не понял, в чём суть проблемы)

Что Вы пробовали покрутить, если можно, поподробнее?

"Убрать младшие разряды", т.е. сделать сдвиг вправо, эквивалентно делению на 2, только с одной поправкой: целочисленному делению с отбрасыванием остатка. Также здесь роль играет наличие/отсутствие знака, знаковые числа сдвигаются с небольшим отличием от беззнаковых.

Share this post


Link to post
Share on other sites
Если честно, не понял, в чём суть проблемы)

Что Вы пробовали покрутить, если можно, поподробнее?

"Убрать младшие разряды", т.е. сделать сдвиг вправо, эквивалентно делению на 2, только с одной поправкой: целочисленному делению с отбрасыванием остатка. Также здесь роль играет наличие/отсутствие знака, знаковые числа сдвигаются с небольшим отличием от беззнаковых.

Так я же написал, что хочу получить знаковое число.

Share this post


Link to post
Share on other sites

В общем...сигнал может принимать значения от 0 до 2^adc_width(или знаковое)

Масштабируйте выходные данные таким образом, чтобы принимаемое максимальное значение аккумулятора(выхода фильтра) соответствовало максимальному значению управляющих кодов ацп.

Если максимум в аккумуляторе 0x36780001, то дальше пойдет (30 downto 30-adcwidth+1) при простом округлении, либо (accval/constmaxval)*2^adc_width при полном округлении

...можно взять бумажку и посчитать - все эти взаимосвязи сами выплывут

 

можно объяснить по другому:

 

Для ответа необходимо знать (для случая простого FIR с нормированными коэффициентами):

 

разрядность входных данных - N (с учетом знака)

разрядность коэффициентов - M

тип представления коэффициентов (тип умножения) - со знаком S=1, или без S=0

МАКСИМАЛЬНЫЙ коэффициент передачи фильтра K (вернее округленный в большую сторону Lk=log2(K)

максимальная длинна фильтра D (вернее округленный в большую сторону Ld=log2(D)

 

Старший бит выходного слова будет находится в позиции MSB аккумулятора

MSB=(M*N)-S+Lk-1

 

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

чтобы К был равен степени 2 (в идеале ==1) . Это можно сделать соответствующим масштабированием коэффициентов фильтра.

 

Разрядность аккумулятора выбирается с учетом отсутствия переполнения при промежуточных операциях суммирования и в обще случае не может быть более чем

 

A=(M*N)-S+Ld.

Share this post


Link to post
Share on other sites
Для ответа необходимо знать (для случая простого FIR с нормированными коэффициентами):

 

разрядность входных данных - N (с учетом знака)

разрядность коэффициентов - M

тип представления коэффициентов (тип умножения) - со знаком S=1, или без S=0

МАКСИМАЛЬНЫЙ коэффициент передачи фильтра K (вернее округленный в большую сторону Lk=log2(K)

максимальная длинна фильтра D (вернее округленный в большую сторону Ld=log2(D)

 

Старший бит выходного слова будет находится в позиции MSB аккумулятора

MSB=(M*N)-S+Lk-1

Спасибо.

 

Эта формула вызывает вопросы. Видимо, там в скобках должно быть сложение, а не умножение.

 

"МАКСИМАЛЬНЫЙ коэффициент передачи фильтра K (вернее округленный в большую сторону Lk=log2(K)"

Не совсем понимаю, как это применить к моему случаю. Можно считать, что я отсчеты синуса умножаю на константу. Диапазон синуса -32000 до 32000, константа может принимать целые значения от 0 до 32000.

Share this post


Link to post
Share on other sites
Спасибо.

 

Эта формула вызывает вопросы. Видимо, там в скобках должно быть сложение, а не умножение.

 

"МАКСИМАЛЬНЫЙ коэффициент передачи фильтра K (вернее округленный в большую сторону Lk=log2(K)"

Не совсем понимаю, как это применить к моему случаю. Можно считать, что я отсчеты синуса умножаю на константу. Диапазон синуса -32000 до 32000, константа может принимать целые значения от 0 до 32000.

можно реализовать - первый абзац - например

 

(accval/constmaxval)*2^adc_width

Share this post


Link to post
Share on other sites

Если Ваши числа записываются в дополнительном коде, то при сдвиге вправо нужно просто добавлять знаковый бит в старший разряд, например:

Положительное 0 1001001 сдвигаем на 3 разряда

0 0100100

0 0010010

0 0001001

 

Отрицательное 1 1001001

1 1100100

1 1110010

1 1111001

 

Не уверен, что это то, что нужно именно Вам, но всё же

Share this post


Link to post
Share on other sites

Я тут вот о чем подумал. Для меня не критично, если данные задержатся на такт. В таком случае, я могу делить отсчеты на степень двойки, сдвигом. Это не дорого по ресурсам и сразу понятно, какие биты взять. Как вам такое решение?

Edited by dak

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this