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

Подбор коэффициентов к FIR

Внимательно перечитайте то, что вы обозвали ерундой.

 

Пусть имеем два знаковых, для простоты трехразрядных, числа. Разрядность произведения - 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 и их тоже можно откинуть.

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


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

Если данные 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 - Это как ?

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


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

Тут я не совсем согласен: например, нужно перемножить 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.

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


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

Я предполагал умножение 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.

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


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

Да не надо ничего расширять! Если у вас аппаратный умножитель 18x18, а перемножаемые числа имеют меньшую разрядность, то синтезатор прозрачно для вас расширит эту разрядность сам. Берёте и пишите:

a : signed(15 downto 0);
b : signed(13 downto 0);
c : signed(29 downto 0);

c <= a * b;

Никаких проблем не будет!

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


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

Может мы в терминах немного расходимся (в смысле 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).

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


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

В терминах мы не расходимся. (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 ? Для увеличения точности ?

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


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

Ну если Вы только определяетесь с разрядностью аккумулятора, то разрядность коэффициентов желательно брать не меньше разрядности данных.

...

Немного не то. Разрядность коэффициентов должна быть такой, чтобы удовлетворять требованиям к АЧХ фильтра.

В ряде случаев разумный подход сильно упрощает жизнь. ;О)

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


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

Немного не то. Разрядность коэффициентов должна быть такой, чтобы удовлетворять требованиям к АЧХ фильтра.

В ряде случаев разумный подход сильно упрощает жизнь. ;О)

Я считаю, что разрядность коэффициентов должна быть такой, чтобы не ухудшать отношение сигнал-шум входного сигнала. Как известно из теории, при умножении результирующий сигнал-шум получается

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)

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


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

Я считаю, что разрядность коэффициентов должна быть такой, чтобы не ухудшать отношение сигнал-шум входного сигнала. Как известно из теории, при умножении результирующий сигнал-шум получается

SN1*SN2/(SN1+SN2) (при больших SN, само SN - в разах по напряжению).

Если мы берем коэффициенты 12-битной разрядности и данные 16-битной, то на выходе в общем случае мы получаем отношение сигнал-шум соответствующее 12-битной разрядности. Смысл брать 16-битные данные пропадает.

Теоретически, при ограниченных и достаточно небольших порядках FIR, можно так подобрать коэффициенты, чтобы они не ухудшали отношение сигнал-шум, но с требованиями к АЧХ это никак не связано.

 

Вам правильно mse написал. Разрядность коэффициентов FIR фильтра определяется только требованиями к АЧХ, например при недостаточной разрядности невозможно боковые лепестки сделать ниже. Возьмите FIR фильтр скользящее среднее там коэффициенты вообще однобитные, и ни к какому ухудшению сигнал/шум это не приводит.

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


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

Вам правильно mse написал. Разрядность коэффициентов FIR фильтра определяется только требованиями к АЧХ, например при недостаточной разрядности невозможно боковые лепестки сделать ниже. Возьмите FIR фильтр скользящее среднее там коэффициенты вообще однобитные, и ни к какому ухудшению сигнал/шум это не приводит.

Мы рассматриваем общий, а не частный случай.

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


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

Я считаю, что разрядность коэффициентов должна быть такой, чтобы не ухудшать отношение сигнал-шум входного сигнала. Как известно из теории, при умножении результирующий сигнал-шум получается

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р АСС, например, эти рассуждения чисто теоретические, но тем не менее. ;О) Когда-нить жызнь поставит перед фактом, а вы?

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


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

Что за теория такая загадошная? В первом классе умножение учил - ничего не слышал. Какой С/Ш у числа 128? И почему он больше, чем у числа 1280?

Я не говорю, что у числа есть сигнал-шум. При расчете в Матлабе, мы получаем коэффициенты в плавающей арифметике. При приведении этих коэффициентов к целым числам, мы тем самым откидываем младшие разряды, что условно можно считать квантованием по амплитуде. Теперь посчитайте, какая разница (еще раз повторяю в общем случае) будет между арифметикой с плавающей точкой (double если так будет угодно) и целочисленной, скажем 16 бит, 14 бит, 12 бит и т.д.

;О) Есть такой фильтр "среднее арифметическое". Неплохой ФНЧ, кстати. Многие фильтры, в конце концов, при определённых условиях, вырождаются имана в него. У него коэффициенты равны 1/N. Где N - его длина. Дык вот, для 8-тапового фильтра, разница между 0,125 и 0,1250000 никакая. Ну, к примеру, 0х20 и 0х2000. Можете проверить с калькулятором. ;О)

Я согласен, есть достаточно большой класс фильтров, дающих при ограниченной разрядности неплохое внеполосное подавление (тот же CIC фильтр, о котором Вы все пытаетесь сказать), но это все частные случаи.

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


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

Если данные 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) ?

Спасибо.

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


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

Я не говорю, что у числа есть сигнал-шум. При расчете в Матлабе, мы получаем коэффициенты в плавающей арифметике. При приведении этих коэффициентов к целым числам, мы тем самым откидываем младшие разряды, что условно можно считать квантованием по амплитуде. Теперь посчитайте, какая разница (еще раз повторяю в общем случае) будет между арифметикой с плавающей точкой (double если так будет угодно) и целочисленной, скажем 16 бит, 14 бит, 12 бит и т.д.

 

И что? Никакого шума к сигналу проходящему через фильтр это не добавляет. Покажите источник шума. Покажите непроходимую границу между умножением на число, где вы соглашаетесь что шума нету, и фильтром.

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


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

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

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

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

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

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

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

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

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

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