vLx0F 0 9 декабря, 2007 Опубликовано 9 декабря, 2007 · Жалоба PS Все таки, советую не парится, и сделать обычное округление (не просто усечение, а с учетом значения отбрасываемой части, как я выше написал). Это так ? reg15 <= signed(reg(31 downto 16)) + reg(15) Так в основном и поступают. Можно по вкусу и дизеринг(рандомизацию преслувутую) сделать, но в FPGA обычно не до дизеринга - логику всегда найдется на что-то более значимое потратить... И всё таки как эту рандомизацию делают: в биты на уровне собственных шумов лабуду слчайную подмешивают ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Singer 0 9 декабря, 2007 Опубликовано 9 декабря, 2007 · Жалоба Это так ? reg15 <= signed(reg(31 downto 16)) + reg(15) И всё таки как эту рандомизацию делают: в биты на уровне собственных шумов лабуду слчайную подмешивают ? Все правильно поняли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vLx0F 0 9 декабря, 2007 Опубликовано 9 декабря, 2007 · Жалоба Все правильно поняли. Значит, подводя итоги: 1. Определяю эффективную разрядность акк, либо 32b(ннапример) + log2(N) (n -тапсы), либо подовая max значение при заданных коэфф. (в каждый тап всунуть по макс. значению и складывать и двигать сока надо, всмысле сколько боевых значений, например 1000) ? И кстати какой способ лучше ? 2. Далее беру с акк фиксированное к-во старших бит, предварительно округлив или рандомизировать, например, (37 downto 22), акк - 38 и значащие биты - 16. И ВСЁ ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kuzis 0 29 февраля, 2008 Опубликовано 29 февраля, 2008 (изменено) · Жалоба Эффективную разрядность аккумулятора нужно определить следующим образом. Фактически нужно вычислить максимальное число, которое возможно на выходе фильтра. Абсолютная величина этого чилса вычисляется как сумма модулей всех коэффициентов фильтра, умноженная на максимальную амплитуду сигнала. Возмите от него логарифм по основанию 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. Изменено 29 февраля, 2008 пользователем Михаил_K Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться