Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Конвертация числа
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
kanzler
Использую полосовой фильтр 16 порядка, параметры которого:
1. разрядность входных данных - 16 бит.
2. разрядность коэффициентов - 8 бит.
3. каскадны фильтр с количеством каскадов 2-го порядка - 8.

Результат получается разрядностью 24 бита, как преобразовать результат в число с разрядностью 16 бит без потери младших разрядов?
andrew_b
Цитата(kanzler @ Jun 23 2006, 07:31) *
Результат получается разрядностью 24 бита, как преобразовать результат в число с разрядностью 16 бит без потери младших разрядов?

Вы ж понимаете --- чудес-то не бывает. Не хотите терять младшие --- потеряете старшие.
kanzler
Цитата(andrew_b @ Jun 23 2006, 11:03) *
Вы ж понимаете --- чудес-то не бывает. Не хотите терять младшие --- потеряете старшие.


Понимаю что чудес нет, но может существуют способы преобразовать в 16 бит без потери?
bve
Цитата(kanzler @ Jun 23 2006, 08:31) *
Использую полосовой фильтр 16 порядка, параметры которого:
1. разрядность входных данных - 16 бит.
2. разрядность коэффициентов - 8 бит.
3. каскадны фильтр с количеством каскадов 2-го порядка - 8.

Результат получается разрядностью 24 бита, как преобразовать результат в число с разрядностью 16 бит без потери младших разрядов?


Простите, а при разрядности коэффициентов - 8, зачем Вам 16 бит входных данных?
andrew_b
Цитата(bve @ Jun 23 2006, 10:48) *
Простите, а при разрядности коэффициентов - 8, зачем Вам 16 бит входных данных?

А каким образом связаны разрядности коэффициентов и данных?
kanzler
Цитата(andrew_b @ Jun 23 2006, 14:24) *
Цитата(bve @ Jun 23 2006, 10:48) *

Простите, а при разрядности коэффициентов - 8, зачем Вам 16 бит входных данных?

А каким образом связаны разрядности коэффициентов и данных?


Вот и я думаю что они не связаны. Нужно всего лишь преобразовать число из 24 бит в 16 бит без потери информации.
vvs157
Цитата(kanzler @ Jun 23 2006, 10:35) *
Цитата(andrew_b @ Jun 23 2006, 11:03) *

Вы ж понимаете --- чудес-то не бывает. Не хотите терять младшие --- потеряете старшие.


Понимаю что чудес нет, но может существуют способы преобразовать в 16 бит без потери?


Это как? У Вас есть 24 битное число - это десятичное число - от 0 до 16777215 и Вы хотите взаимно однозначным преобразованием превратить его в 16 битное число от 0 до 65535 без потери точности. Это невозможно в принципе.
IgorV
Преобразовывая 24 бита в 16 не потерять информацию можно только если есть 8 незначащих разрядов, если их нет или их меньше, то потеря информации будет все равно, как ни крути
=GM=
Цитата(kanzler @ Jun 23 2006, 03:31) *
Использую полосовой фильтр 16 порядка, параметры которого:
1. разрядность входных данных - 16 бит.
2. разрядность коэффициентов - 8 бит.
3. каскадны фильтр с количеством каскадов 2-го порядка - 8.

Результат получается разрядностью 24 бита, как преобразовать результат в число с разрядностью 16 бит без потери младших разрядов?


Здесь вы неправы, результат теоретически должен быть 28 бит, поскольку умножение 8-битного коэффициента на 16-битное данное даёт 24 бита, плюс сложение 16 таких 24-битных произведений. Итого 28 бит. Кстати, динамический диапазон составит 168 дБ, такие сигналы только с Луны принимать(:-).

Так что, если вы определитесь с требуемым динамическим диапазоном результатов фильтрации и максимальным выходным значением результата фильтрации, просто сдвиньте ваш результат на n вправо и оставьте только старшие 16-бит.
Doka
Цитата(kanzler @ Jun 23 2006, 08:31) *
Использую полосовой фильтр 16 порядка, параметры которого:
...
3. каскадны фильтр с количеством каскадов 2-го порядка - 8.
...


судя по этой строке у Вас всёже БИХ-фильтр, сконструированный из секций 2го порядка
странно как у вас при 8бит на коэфф. ЧХ не разваливаются :-/
Вы уверены в том, что после каждого каскада у Вас не происходит округления и ваши 24 бит обеспечивает лишь последний (кстати, 1 из 8ми) каскад округление результата которого "погоду уже не делают" ?!?!
Atashi
"
Здесь вы неправы, результат теоретически должен быть 28 бит, поскольку умножение 8-битного коэффициента на 16-битное данное даёт 24 бита, плюс сложение 16 таких 24-битных произведений. Итого 28 бит.
"

Боюсь, мне трудно согласиться с этим утверждением.
ДЛИНА, она же разрядность, действительно увеличится. Но ТОЧНОСТЬ будет по-прежнему определяться точностью наименее точного компонента. И, как ни странно, действительно 16-р-ный выход может быть получен из ВОТ ТЕХ 24-х без потери точности! потому как они сами давно неточные. только это надо делать не ПОТОМ, а ДО ТОГО, т.е. отбрасывать лишнее в каждом члене, - что б Вы потом с ними ни делали.
Откровенно, я как-то давненько не занимался вопросами точности в таком аспекте, но не думаю, что сильно ошибаюсь. Навскидку, младших можно смело мочить, - но все ж подумать бы сначала неплохо. Как всегда, не настаиваю, а подсказываю направление... Удобная позиция, а?!
Atashi
мы здесь с коллегами посоветовались и решили расстроить Вас еще раз.
после перемножения 1-байтного на 2-байтный точность (!) результата будет соответствовать точности 1-байтного компонента. так что из результирующих 28 бит можно отбрасывать все, что начинается во втором слева байте.
можно привести формулу или сослаться на раздел "приближенные вычисления", но лучше приведу наглядное.
если измерить диаметр детали и получить "3 пальца", то, перемножая на пи с точностью до 707-го знака, все равно точность длины окружности будет +/- 1 палец.
резюме. отбрасывайте лишнее смело - оно все равно где-то потом отбросится.
=GM=
Здесь вы неправы, результат теоретически должен быть 28 бит, поскольку умножение 8-битного коэффициента на 16-битное данное даёт 24 бита, плюс сложение 16 таких 24-битных произведений. Итого 28 бит.

Цитата(Atashi @ Jul 8 2006, 19:18) *
Боюсь, мне трудно согласиться с этим утверждением.

Это с каким же утверждением? Что сумма 16-ти произведений 16-разрядных чисел и 8-разрядных чисел ТЕОРЕТИЧЕСКИ укладывается в 28 разрядов? В принципе легко показать, что результат может превысить 24 разряда. Попробуйте привести пример обратного, что результат никогда не превысит 24 бит(:-).

Цитата(Atashi @ Jul 8 2006, 19:18) *
ДЛИНА, она же разрядность, действительно увеличится.
Но ТОЧНОСТЬ будет по-прежнему определяться точностью наименее точного компонента.

Точность определяется парой чисел, увы! Автор определил разрядность входных чисел,
и вы не вправе произвольно менять их точность. Она задана!

Цитата(Atashi @ Jul 8 2006, 19:18) *
И, как ни странно, действительно 16-р-ный выход может быть получен из ВОТ ТЕХ 24-х без потери точности! потому как они сами давно неточные. только это надо делать не ПОТОМ, а ДО ТОГО, т.е. отбрасывать лишнее в каждом члене, - что б Вы потом с ними ни делали.

Ничего не понятно, поясните.
=GM=
Хотел дать один ответ на оба поста, но показалось, что будет сильно перегружено.
Теперь мой черед вас расстроить.

Цитата(Atashi @ Jul 10 2006, 06:57) *
мы здесь с коллегами посоветовались и решили расстроить Вас еще раз.
после перемножения 1-байтного на 2-байтный точность (!) результата будет соответствовать точности 1-байтного компонента. так что из результирующих 28 бит можно отбрасывать все, что начинается во втором слева байте.

Ну во-первых, там не только перемножение, но еще и сложение произведений, почему вы игнорируете вклад суммирования? Во-вторых, я думаю, автор выбрал 16-битные входные числа, исходя из динамического диапазона, т.е. они могут меняться от 1 до 65535 или вгрубе 96 дБ. И любой сигнал вы обязаны обработать. Однако, следуя вашей логике, входной 4-битный сигнал даст нуль на выходе фильтра. Фактически вы советуете автору: ерунда, вместо 16-битного ацп можно воспользоваться 12-битным... Ну а то, что входной диапазон чисел вместо 96 дБ стал 72 - ничего страшного..."можно отбрасывать".

Цитата(Atashi @ Jul 10 2006, 06:57) *
можно привести формулу или сослаться на раздел "приближенные вычисления", но лучше приведу наглядное.
если измерить диаметр детали и получить "3 пальца", то, перемножая на пи с точностью до 707-го знака, все равно точность длины окружности будет +/- 1 палец.

Зато точность измерения длины окружности не будет искажена числом "пи". А вот если вы вместо 707 знаков возьмете 3.1 к качестве "пи", то точность длины окружности будет зависеть не только от точности измерения диаметра, но и от "квази-пи".

Кстати, мы не знаем почему и как автор выбирал свои 8-битные коэффициенты. Теоретически опять же, может оказаться так, что это усеченные 16-битные, просто так счастливо совпало для его задачи, что все младшие восемь бит - нулевые.
Atashi
ОЧЕНЬ боюсь, что вновь не смогу согласиться... (боюсь - но пишу!)
начну, как все мы, с конца.
да, точность ПИ влияет. Если вычислить пи/256=0,0123..., то при такой дискретизации (8 бит) придется брать пи не хуже, чем до третьего знака. в любом случае, все вычисляется.
об остальном спорить не буду, тк все уже сказал. Как говорили древние, sapienti sat.
как почти всегда на форумах, исходные данные описываются не полностью или неконкретно. ПОЧЕМУ у него там 8, а не-там 16 бит - только автору известно. работаем с тем, что есть.
а вообще, сложно все это...

ps. (x+delta)*(y+delta^2)=... дельта - погрешность 8 бит,
в квадрате - это частный случай, когда 16 бит... итд. дальше все само получается. (ТО ЖЕ и при сложении, и даже при вычитании)
Atashi
вынужден сам себя поправить.
в примере с 3-мя пальцами ввиду того, что пи умножается (вместе с дельтой) на диаметр, для того, чтоб ошибка из-за округления пи была не более ошибки измерения (1/256), нужно задавать (пи/256/диаметр); а чтобы ошибка, вносимая пи-ем, была пренебрежимо малой, двигаем запятую левее.
еще раз подчеркну: я "разрешил" отбрасывать младшие зн. цифры не потому, что не боюсь потери точности, а потому, что в описанном случае они УЖЕ неточны.
mcheb
Цитата(kanzler @ Jun 23 2006, 07:31) *
Использую полосовой фильтр 16 порядка, параметры которого:
1. разрядность входных данных - 16 бит.
2. разрядность коэффициентов - 8 бит.
3. каскадны фильтр с количеством каскадов 2-го порядка - 8.

Результат получается разрядностью 24 бита, как преобразовать результат в число с разрядностью 16 бит без потери младших разрядов?

Я применяю следующий метод при умножении 8*8=>16 . Если результат больше 255 то результат == 255, если нет , беру младший байт. То есть амплитудное ограничение.
Doka
Цитата(mcheb @ Jul 14 2006, 12:44) *
Цитата(kanzler @ Jun 23 2006, 07:31) *

Использую полосовой фильтр 16 порядка, параметры которого:
1. разрядность входных данных - 16 бит.
2. разрядность коэффициентов - 8 бит.
3. каскадны фильтр с количеством каскадов 2-го порядка - 8.

Результат получается разрядностью 24 бита, как преобразовать результат в число с разрядностью 16 бит без потери младших разрядов?

Я применяю следующий метод при умножении 8*8=>16 . Если результат больше 255 то результат == 255, если нет , беру младший байт. То есть амплитудное ограничение.


круто a14.gif
только непонятно зачем вам такие "дорогие":rolleyes: 8битные шины держать, ведь уже при 16^2=256, вам и 4битных шин хватит за глаза.
Pathfinder
Atashi, вы путаете два совершенно разных понятия - погрешность входных данных и погрешность, возникающую при преобразовании.
Вы совершенно правы в том, что погрешность произведения или суммы двух величин будет больше наибольшей собственной погрешности. Но об этом в данном случае речь не идет вообще.
8-битные коэффициенты - фиксированы, поэтому можно считать, что они заданы с бесконечной точностью, ибо их погрешность скажется только на частотной характеристике и динамике фильтра. Эта погрешность вводится в коэффициенты фильтра специально, чтобы снизить разрядность и упростить умножители и сумматоры.
Про собственную погрешность 16-битных входных данных вообще ничего не известно.
Что касается преобразования, в результате обработки описанным фильтром разрядность увеличится до 28 бит, при этом преобразование выполняется с бесконечной точностью, отбрасывание младших бит эту точность ограничит некоторой величиной. Насколько это допустимо зависит от задачи.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.