Jump to content
    

Округление результатов

PS Все таки, советую не парится, и сделать обычное округление (не просто усечение, а с учетом значения отбрасываемой части, как я выше написал).

Это так ?

reg15 <= signed(reg(31 downto 16)) + reg(15)

 

Так в основном и поступают. Можно по вкусу и дизеринг(рандомизацию преслувутую) сделать, но в FPGA обычно не до дизеринга - логику всегда найдется на что-то более значимое потратить...

 

И всё таки как эту рандомизацию делают: в биты на уровне собственных шумов лабуду слчайную подмешивают ?

Share this post


Link to post
Share on other sites

Это так ?

reg15 <= signed(reg(31 downto 16)) + reg(15)

И всё таки как эту рандомизацию делают: в биты на уровне собственных шумов лабуду слчайную подмешивают ?

Все правильно поняли.

Share this post


Link to post
Share on other sites

Все правильно поняли.

 

Значит, подводя итоги:

 

1. Определяю эффективную разрядность акк, либо 32b(ннапример) + log2(N) (n -тапсы), либо подовая max значение при заданных коэфф. (в каждый тап всунуть по макс. значению и складывать и двигать сока надо, всмысле сколько боевых значений, например 1000) ? И кстати какой способ лучше ?

 

2. Далее беру с акк фиксированное к-во старших бит, предварительно округлив или рандомизировать,

например, (37 downto 22), акк - 38 и значащие биты - 16.

 

И ВСЁ ?

Share this post


Link to post
Share on other sites

Эффективную разрядность аккумулятора нужно определить следующим образом. Фактически нужно вычислить максимальное число, которое возможно на выходе фильтра. Абсолютная величина этого чилса вычисляется как сумма модулей всех коэффициентов фильтра, умноженная на максимальную амплитуду сигнала. Возмите от него логарифм по основанию 2 и получите число разрядов, плюс 1 на знак. Тут вас ожидает маленькая радость. Например, если разрядность произведения равна 32, и имеется 64 произведения, которые нужно сложить, то аккумулятор должен иметь 38 рязрдов. Но вот эффективных для КИХ фильра получается обычно меньше, т.к. коэффициенты фильтра по краям сильно меньше. Что же касается битов, которые необходимо брать, то тут нужно представлять характер сигнала с которым работаете. В лоб - это старшие занчимые биты сумматора. При этом младшие биты можно либо откидывать, либо округлять если это необходимо. Если пик-фактор выходного сигнала небольшой, то именно эти биты и нужно брать. Но если величина пик-фактора сигнала на выходе большая, то можно брать и не старшие разряды, а например сдвинуться на несколько разрядов вправо. При этом возможны переполнения, которые следует обрабатывать.

Вот пример обработки переполнения:

 

if ((AccumI(20 downto 17) = "0000") or (AccumI(20 downto 17) = "1111")) then

QI<=AccumI(17 downto 0);

else

if (AccumI(20) = '1') then

QI<="100000000000000000";

else

QI<="011111111111111111";

end if;

end if;

 

Здесь из аккумулятора берутся младшие биты.

Не забывайте, что при такой обработке происходит компрессия сигнала.

 

Кстати, и не забывайте еще одно, при знаковом перемножении 14 разрядного числа на 18 разрядное, результат будет иметь 31 разряд а не 32. 32 рязряда получатся только в том случае если вы перемножаете два максимальных по модулю отрицательных числа, т.е. для данного примера это числа "1000000000000" и "100000000000000000". Как правило до такого не доводят. Т.е. если вы например работаете с 12 рязрядным сигналом, то максимально положительное число 2047, и как правило делают так, что и максимальное отрицательное число тоже -2047.

Edited by Михаил_K

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.

×
×
  • Create New...