Перейти к содержанию
    

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

Всем привет.

 

Допустим, у меня есть вектор 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. Я знаю, что просто отбросить разряды нельзя и знаю что делать дальше, но вопрос сейчас именно в выборе разрядности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем...сигнал может принимать значения от 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для ответа необходимо знать (для случая простого 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо.

 

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

 

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

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

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

 

(accval/constmaxval)*2^adc_width

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

0 0100100

0 0010010

0 0001001

 

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

1 1100100

1 1110010

1 1111001

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем dak

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...