rloc 56 17 октября, 2007 Опубликовано 17 октября, 2007 · Жалоба Внимательно перечитайте то, что вы обозвали ерундой. Пусть имеем два знаковых, для простоты трехразрядных, числа. Разрядность произведения - 3+3=6 разрядов. А мы хотим 5. Но хотеть не вредно... Минимальное трехразрядное число --- это (-4) (100 в двоичной форме). Произведение (-4)*(-4)=16. В двоичном виде знаковое 16 имеет вид 010000, т.е. 6 разрядов, как и положено. И где здесь два одинаковых старших разряда, я вас внимательно спрашиваю? :) Чуть выше шла речь, как перемножить 16*18, имея 18*18 умножитель, т.е. разница этих двух разрядностей составляет 2, у Вас - (3+3)-5=1. Пример некорректный. Подразумевалось, что 16*18 -> [33:0] и два старших разряда 34, 35 будут равны 33 разряду, и их можно откинуть. Либо 16*18 -> [35:2], тогда два младших разряда 0,1 равны 0 и их тоже можно откинуть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vLx0F 0 17 октября, 2007 Опубликовано 17 октября, 2007 · Жалоба Если данные 16 бит, и на выходе Вы хотите получить 18 бит, то можно поступить двумя путями: 1) дополнить 16 бит недостающими 2 разрядами, т.е. D(17)=D(16)=D(15), где D(15) - это старший бит (MSB) данных, а после перемножения взять биты с 36-18-2 по 36-2-1 Тут я не совсем согласен: например, нужно перемножить 2 16-битных числа с помощъю 18х18 - умножителеей. Т.е. мы рассширяем 2х16 бит до 18 и получаем 36 битный результат. Теперь нужно получить из 36 опять 16-битный результат. Получается старший значимый бит (для 16х16) = 35-(36-32+1)=30-бит - это второй знаковый бит для умножения 16х16. А у Вас получается для 16x16 дополненых до 18 "36-2-1"=33 - Это как ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rloc 56 17 октября, 2007 Опубликовано 17 октября, 2007 · Жалоба Тут я не совсем согласен: например, нужно перемножить 2 16-битных числа с помощъю 18х18 - умножителеей. Т.е. мы рассширяем 2х16 бит до 18 и получаем 36 битный результат. Теперь нужно получить из 36 опять 16-битный результат. Получается старший значимый бит (для 16х16) = 35-(36-32+1)=30-бит - это второй знаковый бит для умножения 16х16. А у Вас получается для 16x16 дополненых до 18 "36-2-1"=33 - Это как ? Я предполагал умножение 16*18, прошу прощения если не правильно понял вопроса. Если нужно 16*16 (знаковое расширение старших бит до 18*18), то берутся разряды с 36-4-16 по 36-4-1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vLx0F 0 17 октября, 2007 Опубликовано 17 октября, 2007 · Жалоба Я предполагал умножение 16*18, прошу прощения если не правильно понял вопроса. Если нужно 16*16 (знаковое расширение старших бит до 18*18), то берутся разряды с 36-4-16 по 36-4-1. Может мы в терминах немного расходимся (в смысле 16 бит = 15 downto 0), но мне кажется, что надо при 16*16 брать (36-5-1 downto 36-16-5), т.е. (30 downto 15) брать 2 -ой MSB. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 18 октября, 2007 Опубликовано 18 октября, 2007 · Жалоба Да не надо ничего расширять! Если у вас аппаратный умножитель 18x18, а перемножаемые числа имеют меньшую разрядность, то синтезатор прозрачно для вас расширит эту разрядность сам. Берёте и пишите: a : signed(15 downto 0); b : signed(13 downto 0); c : signed(29 downto 0); c <= a * b; Никаких проблем не будет! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rloc 56 18 октября, 2007 Опубликовано 18 октября, 2007 · Жалоба Может мы в терминах немного расходимся (в смысле 16 бит = 15 downto 0), но мне кажется, что надо при 16*16 брать (36-5-1 downto 36-16-5), т.е. (30 downto 15) брать 2 -ой MSB. В терминах мы не расходимся. (15 downto 0)*(15 downto 0)=(31 downto 0), но никак не (30 downto 0). Берем старшие 16 разрядов и получаем (31 downto 16). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vLx0F 0 18 октября, 2007 Опубликовано 18 октября, 2007 · Жалоба В терминах мы не расходимся. (15 downto 0)*(15 downto 0)=(31 downto 0), но никак не (30 downto 0). Берем старшие 16 разрядов и получаем (31 downto 16). Ну так 1 MSB надож, говорят пропустить :) В терминах мы не расходимся. (15 downto 0)*(15 downto 0)=(31 downto 0), но никак не (30 downto 0). Берем старшие 16 разрядов и получаем (31 downto 16). Это Вы про умножитель 16x16 или 18x18 ? Я вотчто имел ввиду, что, если 16*16 на умножителе 18х18, то, что считать MSB 35-й и снимать тогда данные с (36-2 downto 36-18-1) и оперировать тогда уже расширенными битами и на основе этого acc рассчитывать (хотя не понимаю зачем использовать ненужные 35-32 е биты), или 31-ый и снимать данные с (32-2 downto 32-16-1) ??? И почему реккомендуют брать 2-ой MSB ? Для увеличения точности ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mse 0 18 октября, 2007 Опубликовано 18 октября, 2007 · Жалоба Ну если Вы только определяетесь с разрядностью аккумулятора, то разрядность коэффициентов желательно брать не меньше разрядности данных. ... Немного не то. Разрядность коэффициентов должна быть такой, чтобы удовлетворять требованиям к АЧХ фильтра. В ряде случаев разумный подход сильно упрощает жизнь. ;О) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rloc 56 18 октября, 2007 Опубликовано 18 октября, 2007 · Жалоба Немного не то. Разрядность коэффициентов должна быть такой, чтобы удовлетворять требованиям к АЧХ фильтра. В ряде случаев разумный подход сильно упрощает жизнь. ;О) Я считаю, что разрядность коэффициентов должна быть такой, чтобы не ухудшать отношение сигнал-шум входного сигнала. Как известно из теории, при умножении результирующий сигнал-шум получается SN1*SN2/(SN1+SN2) (при больших SN, само SN - в разах по напряжению). Если мы берем коэффициенты 12-битной разрядности и данные 16-битной, то на выходе в общем случае мы получаем отношение сигнал-шум соответствующее 12-битной разрядности (если у нас только шумы квантования). Смысл брать 16-битные данные пропадает, а меньшая разрядность коэффициентов может пригодиться в случаях, когда сигнал-шум определяется не шумами квантования, а просто очень высоким уровнем шума. Теоретически, при ограниченных и достаточно небольших порядках FIR, можно так подобрать коэффициенты, чтобы они не ухудшали отношение сигнал-шум, но с требованиями к АЧХ это никак не связано. Я вотчто имел ввиду, что, если 16*16 на умножителе 18х18, то, что считать MSB 35-й и снимать тогда данные с (36-2 downto 36-18-1) и оперировать тогда уже расширенными битами и на основе этого acc рассчитывать (хотя не понимаю зачем использовать ненужные 35-32 е биты), или 31-ый и снимать данные с (32-2 downto 32-16-1) ??? И почему реккомендуют брать 2-ой MSB ? Для увеличения точности ? Для увеличения точности рекомендуют обычно брать не дополнительные MSB, а дополнительные LSB, т.е. скажем вместо (31 downto 16) => (31 downto 14), в идеальном случае все разряды (31 downto 0) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
petrov 7 18 октября, 2007 Опубликовано 18 октября, 2007 · Жалоба Я считаю, что разрядность коэффициентов должна быть такой, чтобы не ухудшать отношение сигнал-шум входного сигнала. Как известно из теории, при умножении результирующий сигнал-шум получается SN1*SN2/(SN1+SN2) (при больших SN, само SN - в разах по напряжению). Если мы берем коэффициенты 12-битной разрядности и данные 16-битной, то на выходе в общем случае мы получаем отношение сигнал-шум соответствующее 12-битной разрядности. Смысл брать 16-битные данные пропадает. Теоретически, при ограниченных и достаточно небольших порядках FIR, можно так подобрать коэффициенты, чтобы они не ухудшали отношение сигнал-шум, но с требованиями к АЧХ это никак не связано. Вам правильно mse написал. Разрядность коэффициентов FIR фильтра определяется только требованиями к АЧХ, например при недостаточной разрядности невозможно боковые лепестки сделать ниже. Возьмите FIR фильтр скользящее среднее там коэффициенты вообще однобитные, и ни к какому ухудшению сигнал/шум это не приводит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rloc 56 18 октября, 2007 Опубликовано 18 октября, 2007 · Жалоба Вам правильно mse написал. Разрядность коэффициентов FIR фильтра определяется только требованиями к АЧХ, например при недостаточной разрядности невозможно боковые лепестки сделать ниже. Возьмите FIR фильтр скользящее среднее там коэффициенты вообще однобитные, и ни к какому ухудшению сигнал/шум это не приводит. Мы рассматриваем общий, а не частный случай. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mse 0 18 октября, 2007 Опубликовано 18 октября, 2007 · Жалоба Я считаю, что разрядность коэффициентов должна быть такой, чтобы не ухудшать отношение сигнал-шум входного сигнала. Как известно из теории, при умножении результирующий сигнал-шум получается SN1*SN2/(SN1+SN2) (при больших SN, само SN - в разах по напряжению). Если мы берем коэффициенты 12-битной разрядности и данные 16-битной, то на выходе в общем случае мы получаем отношение сигнал-шум соответствующее 12-битной разрядности. Смысл брать 16-битные данные пропадает. Теоретически, при ограниченных и достаточно небольших порядках FIR, можно так подобрать коэффициенты, чтобы они не ухудшали отношение сигнал-шум, но с требованиями к АЧХ это никак не связано. Что за теория такая загадошная? В первом классе умножение учил - ничего не слышал. Какой С/Ш у числа 128? И почему он больше, чем у числа 1280? ;О) Есть такой фильтр "среднее арифметическое". Неплохой ФНЧ, кстати. Многие фильтры, в конце концов, при определённых условиях, вырождаются имана в него. У него коэффициенты равны 1/N. Где N - его длина. Дык вот, для 8-тапового фильтра, разница между 0,125 и 0,1250000 никакая. Ну, к примеру, 0х20 и 0х2000. Можете проверить с калькулятором. ;О) Коэффициент, это множитель. И СШ сигнала он не ухудшит, бо СШ произведения-накопления это 1/2ЛСБ для округления или 1 для усечения. И то, это при приведении содержимого АСС к выходной разрядности данных. А вот АЧХ покорёжит, мама дорогая, как. Но если 16р коэфф вам даст выброс в полосе подавления, например -70Дб, а 14р -60 при ТЗ -50Дб, то смысла в 16-р К нет. Конечно, при аппаратных умножителях 18*18 и 48р АСС, например, эти рассуждения чисто теоретические, но тем не менее. ;О) Когда-нить жызнь поставит перед фактом, а вы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rloc 56 18 октября, 2007 Опубликовано 18 октября, 2007 · Жалоба Что за теория такая загадошная? В первом классе умножение учил - ничего не слышал. Какой С/Ш у числа 128? И почему он больше, чем у числа 1280? Я не говорю, что у числа есть сигнал-шум. При расчете в Матлабе, мы получаем коэффициенты в плавающей арифметике. При приведении этих коэффициентов к целым числам, мы тем самым откидываем младшие разряды, что условно можно считать квантованием по амплитуде. Теперь посчитайте, какая разница (еще раз повторяю в общем случае) будет между арифметикой с плавающей точкой (double если так будет угодно) и целочисленной, скажем 16 бит, 14 бит, 12 бит и т.д. ;О) Есть такой фильтр "среднее арифметическое". Неплохой ФНЧ, кстати. Многие фильтры, в конце концов, при определённых условиях, вырождаются имана в него. У него коэффициенты равны 1/N. Где N - его длина. Дык вот, для 8-тапового фильтра, разница между 0,125 и 0,1250000 никакая. Ну, к примеру, 0х20 и 0х2000. Можете проверить с калькулятором. ;О) Я согласен, есть достаточно большой класс фильтров, дающих при ограниченной разрядности неплохое внеполосное подавление (тот же CIC фильтр, о котором Вы все пытаетесь сказать), но это все частные случаи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vLx0F 0 18 октября, 2007 Опубликовано 18 октября, 2007 · Жалоба Если данные 16 бит, и на выходе Вы хотите получить 18 бит, то можно поступить двумя путями: 1) дополнить 16 бит недостающими 2 разрядами, т.е. D(17)=D(16)=D(15), где D(15) - это старший бит (MSB) данных, а после перемножения взять биты с 36-18-2 по 36-2-1 Я извеняюсь за, наверное глупые вопросы, т.к. с FPGA я работал тока для упрвления, интерфейсов и т.п., а тут пришлось :) Данные и коэфф у меня изначально 16 бит. Умножитель 18x18. Ессно всё расширяю до 18 бит и после умножения, конечно - 36. Мне нужно входное значение назовём S умножить на ещё некоторые 16 бит(тож расширенные до 18) назавём A1 (смысл не важен) и 18 бит вогнать в тапы, чтоб потом умножить на коэфф уже FIR'a и т.д. Так вот, после умножения S*A1-> 36 бит, а снять надо 18 и в тапы их. Почему Вы рекомендуете брать MSB (уже для 18-битнрого числа) как 36-2-1=33, хотя _реально_ данные умножения лежат (31 downto 0). Почему нельзя взять (30 downto 13) и в тап, а там уже умножаем на 16-битный коэфф FIR'a, расширенного ессно до 18) ? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
petrov 7 18 октября, 2007 Опубликовано 18 октября, 2007 · Жалоба Я не говорю, что у числа есть сигнал-шум. При расчете в Матлабе, мы получаем коэффициенты в плавающей арифметике. При приведении этих коэффициентов к целым числам, мы тем самым откидываем младшие разряды, что условно можно считать квантованием по амплитуде. Теперь посчитайте, какая разница (еще раз повторяю в общем случае) будет между арифметикой с плавающей точкой (double если так будет угодно) и целочисленной, скажем 16 бит, 14 бит, 12 бит и т.д. И что? Никакого шума к сигналу проходящему через фильтр это не добавляет. Покажите источник шума. Покажите непроходимую границу между умножением на число, где вы соглашаетесь что шума нету, и фильтром. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться