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

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

Вот не могу понять немного я, такую ситуацию.

Есть фильтр КИХ с 18 разрядными коэффициентами и АЦП с 14 рязрадами, как сделать так, а на ЦАП 12-ти рязрадное.

Вопрос вот в чем.

Какой разрядности имеет смысл брать коээфициенты, если я хочу использовать 14 разрядное АЦП?

Или это глупо?

Или имеет смысл понизить разрядность АЦП?

И как бы это реализовали те, кто код пишет ручками?

Всем спасибо :)

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


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

Есть фильтр КИХ с 18 разрядными коэффициентами и АЦП с 14 рязрадами, как сделать так, а на ЦАП 12-ти рязрадное.

Вопрос вот в чем.

Какой разрядности имеет смысл брать коээфициенты, если я хочу использовать 14 разрядное АЦП?

Или это глупо?

Или имеет смысл понизить разрядность АЦП?

И как бы это реализовали те, кто код пишет ручками?

Разрядность входного сигнала и разрядности коэффициентов друг с другом не связаны. Смотрите жаркую дискусию здесь: http://electronix.ru/forum/index.php?showtopic=37936&hl=

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


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

Разрядность входного сигнала и разрядности коэффициентов друг с другом не связаны. Смотрите жаркую дискусию здесь: http://electronix.ru/forum/index.php?showtopic=37936&hl=

 

Кстати, в той теме так и небыло полностью раскрыто: При 40b (нпример) акк., в который складываются 32-битные данные (от 64 тапов) , полученные умножением 16b отсчетов АЦП на 16b коэффициенты , окуда брать результат в 16b (так надо :), если происходит переполнение ?

 

И ещё вопрос, если все биты с 39 по 30 - нули, кроме 33, то правомерно ли брать выход как (34 downto 19) (16 бит) либо сразу 0x7FFF ?

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


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

Кстати, в той теме так и небыло полностью раскрыто: При 40b (нпример) акк., в который складываются 32-битные данные (от 64 тапов) , полученные умножением 16b отсчетов АЦП на 16b коэффициенты , окуда брать результат в 16b (так надо :) , если происходит переполнение ?
Что-то я пока не пойму, откуда берётся переполнение. Если вы складываете 64 32-битных числа, то получаете 38-битный результат.

 

И ещё вопрос, если все биты с 39 по 30 - нули, кроме 33, то правомерно ли брать выход как (34 downto 19) (16 бит) либо сразу 0x7FFF ?
Тоже не понял. Почему нули?

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


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

Что-то я пока не пойму, откуда берётся переполнение. Если вы складываете 64 32-битных числа, то получаете 38-битный результат.

 

Если при сложении 64 32 битных чисел я получу 0x12345678 - это 38-битный результат ? А если 0xA12345678 ??? и откуда 38 бит при 64 сложентии, типа 32+log2(64)

 

Тоже не понял. Почему нули?

 

Например, после суммирования получу 0x312ABDC00 откуда брать 16 бит ?

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


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

Если при сложении 64 32 битных чисел я получу 0x12345678 - это 38-битный результат ? А если 0xA12345678 ??? и откуда 38 бит при 64 сложентии, типа 32+log2(64)

2^32+2^32...=2^32*2^n=2^(32+n)=2^38 для вашего случая что меньше аккумулятора 2^40!

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


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

2^32+2^32...=2^32*2^n=2^(32+n)=2^38 для вашего случая что меньше аккумулятора 2^40!

 

Так при любом раскладе брать (37 downto 22) ? А если суммы полусится 0x 3DA1 ? Или есть адаптивный алгоритм ?

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


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

Так при любом раскладе брать (37 downto 22) ?

Почему именно 37 downto 22? Вы уверены, что при любой комбинации входных сигналов там всегда будет 0?

Дело в том, что при таком урезании вы очень много теряете.

Или есть адаптивный алгоритм ?

Есть - плавающая точка. Можете масштабировать алгоритм под ваши потребности(например знак+10бит значащих+5бит множитель ) или использовать стандартную 32рплавающую точку , только плавающая точка в железе реализуется много сложнее.

С плавающей точкой динамический диапазон будет много шире, но реализация много сложнее.

Путем простейшего обрезания - вы просто уменьшите рабочий диапазон значений после фильтра (в вашем случае это деление результата на 2^22).

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

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


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

Разрядность входного сигнала и разрядности коэффициентов друг с другом не связаны. Смотрите жаркую дискусию здесь: http://electronix.ru/forum/index.php?showtopic=37936&hl=

 

Так меня результат их перемножения интересует...

А он по-моему очень даже зависит....

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


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

Почему именно 37 downto 22? Вы уверены, что при любой комбинации входных сигналов там всегда будет 0?

Дело в том, что при таком урезании вы очень много теряете.

Нет, конечно не уверен. Ну, например, как с акк. 38 взять надо 16 бит для ЦАП. ? Вы советуете (37 downto 22) ...???

Хорошо, конкретно спрошу: а как брать 16 бит, если бит, например 34 =1 ? за счёт переполнния.

Да, и при пользовании RESIZE - будут 0 или 1.

 

Есть - плавающая точка. Можете масштабировать алгоритм под ваши потребности(например знак+10бит значащих+5бит множитель ) или использовать стандартную 32рплавающую точку , только плавающая точка в железе реализуется много сложнее.

С плавающей точкой динамический диапазон будет много шире, но реализация много сложнее.

Путем простейшего обрезания - вы просто уменьшите рабочий диапазон значений после фильтра (в вашем случае это деление результата на 2^22).

 

Не хотелось бы усложнять.

 

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

 

Но входной сигнал-то не всегда известен. Например, coeff*adcin может быть 0x00000123, так и 0x36780001. Так что... Пример можно расссчёта эффективной разрядности ? Плз.

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


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

Но входной сигнал-то не всегда известен.

Все известно...сигнал может принимать значения от 0 до 2^adc_width(или знаковое):)

 

Пример можно расссчёта эффективной разрядности ?

Это максимальное число, которое может получится на выходе фильтра для ваших данных и коэффициентов.

 

Вы советуете (37 downto 22) ...???

Масштабируйте выходные данные таким образом, чтобы принимаемое максимальное значение аккумулятора(выхода фильтра) соответствовало максимальному значению управляющих кодов ацп.

Если максимум в аккумуляторе 0x36780001, то на аци пойдет (30 downto 30-adcwidth+1) при простом округлении, либо (accval/constmaxval)*2^adc_width при полном округлении :).

...можно взять бумажку и посчитать - все эти взаимосвязи сами выплывут:)

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


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

Все известно...сигнал может принимать значения от 0 до 2^adc_width(или знаковое):)

Это максимальное число, которое может получится на выходе фильтра для ваших данных и коэффициентов.

Масштабируйте выходные данные таким образом, чтобы принимаемое максимальное значение аккумулятора(выхода фильтра) соответствовало максимальному значению управляющих кодов ацп.

Если максимум в аккумуляторе 0x36780001, то на аци пойдет (30 downto 30-adcwidth+1) при простом округлении, либо (accval/constmaxval)*2^adc_width при полном округлении :).

...можно взять бумажку и посчитать - все эти взаимосвязи сами выплывут:)

 

Ну опять же простой пример: acc- 38b и равен:

1. вариант 0x356DA1201 откуда брать 16 бт т?

2. вариант 0x00000234D откуда брать 16 бт т?

 

И Простой вопрос откуда 16b брать реальных.

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


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

Ну опять же простой пример: acc- 38b и равен:

1. вариант 0x356DA1201 откуда брать 16 бт т?

2. вариант 0x00000234D откуда брать 16 бт т?

 

И Простой вопрос откуда 16b брать реальных.

 

Это не простой пример, самой простой пример вот такой:

 

1. Имеем 8-ми разрядной АЦП, пусть ради еще большей простоты АЦП работает только с положительными числами. Тогда минимальное значение данных с АЦП равно 0, а максимальное 255.

 

2. Имеем самый простейший FIR фильтр всего с двумя отводами и двумя коэф. Уравнение работы фильтра:

 

y = 7*x + 1*x[i-1]

 

Как можно догадаться, фильтр имеет коэф. 7 и 1.

 

3. Легко увидеть, что минимальное значение y после фильтра ymin = 0, а максимальное ymax = 7*255 + 1*255 = 8*255 = 2040

 

4. Максимальное значение 2040 умещается без переполнения в 11-и разрядах (напомню, что мы работаем только с положительными входными числами).

 

4. Таким образом, мы получили увеличение разрядности данных АЦП после фильтра на 3 бита. Дальше у Вас 2 возможных варианта действий:

 

- В дальнейших расчетах использовать все 11 разрядов.

- Выкинуть нафиг 3 младших разряда и в дальнейшем оперировать только старшими 8-и разрядами. Естественно, при этом Вы несколько теряете в точности, так как, например, на входную последовательность 1,0,1,0,1,0,... с выхода фильтра после отбрасывания младших разрядов будут идти одни нули. Но вот тут Вы уже сами решайте, нужна вам эта точность или нет. Если сразу же после фильтра данные идут на 8-битный ЦАП, то наверно легко можно пожертвовать младшими 3-я битами.

 

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

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


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

Почему именно 37 downto 22? Вы уверены, что при любой комбинации входных сигналов там всегда будет 0?

 

Всётаки хотелось бы узнать: как не применяя плвучки, взять 16b для ЦАП из 38b акк, если 34-ый бит = 1 (т.е. произошло переполнение при положительных числах стпршие = 0, а (33 downto 0) пофигу. Я так полагаю (35 downto 20) ???

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

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


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

Всётаки хотелось бы узнать: как не применяя плвучки, взять 16b для ЦАП из 38b акк, если 34-ый бит = 1 (т.е. произошло переполнение при положительных числах стпршие = 0, а (33 downto 0) пофигу. Я так полагаю (35 downto 20) ???

http://electronix.ru/forum/index.php?showt...=40192&hl=#

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


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

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

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

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

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

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

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

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

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

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