-
- Дык, эта. Мониторить значения сигнала до фильтра, и если они больше
выхода фильтра, то и учесть. Не? - Бapбoc(29.08.2020 22:46)
- Это зачем так перректально? Вроде бы "проблему" уже решили... - my504(30.08.2020 09:23)
- Нет там никакой ошибки накопления IBAH(121 знак., 28.08.2020 15:25)
- Допустим, out = 50. Тогда out*20/1024 == 0. Вот эти 50 единиц
застрянут в фильтре и будут постоянно идти на выход, даже если x
уже пол дня как нулевой. - fk0(28.08.2020 15:37)
- дык какая разница чего там застряло в out, если out*20/1024 == 0,
данный алгоритм ничем не отличается от флоат реализации, та же
точность половина младшего разряда - IBAH(28.08.2020 18:19)
- Это как это какая разница? 8) То есть на выходе фильтра торчит
сигнал, который не падает в ноль из-за обнуления входного
воздействия при делении, а у вас нет разницы? При флоате и
фикспойнте деление не приведет к нулю и фильтр будет нормально
работать. ЗЫ. Только неделю назад исправил такую ошибку в коде
предшественника, есличо. Как раз из-за проблемы с защелкиванием
выходного сигнала в фильтре. - my504(28.08.2020 22:58)
- А разве это IBAH(378 знак., 31.08.2020 13:42)
- Это как это какая разница? 8) То есть на выходе фильтра торчит
сигнал, который не падает в ноль из-за обнуления входного
воздействия при делении, а у вас нет разницы? При флоате и
фикспойнте деление не приведет к нулю и фильтр будет нормально
работать. ЗЫ. Только неделю назад исправил такую ошибку в коде
предшественника, есличо. Как раз из-за проблемы с защелкиванием
выходного сигнала в фильтре. - my504(28.08.2020 22:58)
- это потому что ты неправильно такой фильтр строишь. нормальная реализация содержит ещё более младшие биты, которые учитывает, но не выдаёт наружу - Mahagam(28.08.2020 15:44)
- дык какая разница чего там застряло в out, если out*20/1024 == 0,
данный алгоритм ничем не отличается от флоат реализации, та же
точность половина младшего разряда - IBAH(28.08.2020 18:19)
- Допустим, out = 50. Тогда out*20/1024 == 0. Вот эти 50 единиц
застрянут в фильтре и будут постоянно идти на выход, даже если x
уже пол дня как нулевой. - fk0(28.08.2020 15:37)
- Это не ошибка. Это порог. Причем он при определенной ситуации может
стать ловушкой, когда слишком малое входное значение не сможет
уменьшить текущее значение фильтра. Решается фикспойнтом для
значения фильтра. То есть нужно добавить справа к значению фильтра
нужное число дробных разрядов и каждое новое входное значение левым
сдвигом делать фикспойнтом. При выводе значения фильтра наружу
восстанавливать целочисленную разрядность правым сдвигом. - my504(27.08.2020 23:12)
- Если добавить 8 "лишних" бит справа сдвиги будут не нужны. :-)) - Boвa(28.08.2020 09:53)
- Спасибо! Дельный совет. Тем более при умножении всё равно запас по
разрядам должен быть. Dingo(379 знак., 28.08.2020 05:52)
- Смоделировал в эксельке свой способ. Дополнительная ось для
выходов, чтобы видно лучше было. α = 3/256; Dingo(245 знак., 28.08.2020 07:10, картинка)
- Про плавучку принято жаловаться, что медленно. Приятно встретить
человека, который не торопится без надобности. Рукопожимаю,
коллега. - SciFi(28.08.2020 08:04)
- Я один и тот же код для PIC переписывал с long'ов на плавучку. И
стало быстрей. Потому, что long'и 32-битные (а в 16 бит не лезет),
а плавучка в не-PRO Hitech-C версии хорошо оптимизирована на
ассемблере руками и 24-битная. Причём там мантисса-то 16-битная
вовсе (которую нужно долго перемножать). Просто меньше операций, не
говоря уж, что прорамма сильно проще и короче. Проблема
целочисленных вычислений, что нужна немеряная разрядность (особенно
если у тебя в выражении fk0(164 знак., 28.08.2020 11:33)
- 1) Зачем нужна немеряная разрядность, если АЦП 16- разрядный? 2)
Что за фантазия считать в 16 разрядах, если все 16-разрядные машины
имеют умножитель, дающий 32-разрядный результат? - Kpoк(28.08.2020 15:49)
- Затем, что x2 например. Или результат умножения в том же фильтре. И не лезет либо снизу, либо сверху. Т.е. вообще осмысленный результат влезает, но с другим множителем. А поскольку аргументы той же суммы отнормированы по одной единице, то кто-то уже не умещается. Фантазия возникает на PIC18 или x51, у которых каждый байтик нужно протаскивать через игольное ушко регистрое DPTR или WREG, что в общем-то не быстро (и ещё переноса где-то нет). На MSP430, PIC24 или fk0(39 знак., 28.08.2020 16:55)
- Почему генератор? Полосовик на 16q16 получается устойчивым. Другое
дело, что на ПИК такое умножать вспотеешь. Или речь про 16р на всё?
А с плывучкой тоже проблема, если нет бочечного шыфтера.
Нормализаццыя-денормализаццыя легко может затрахать. - mse homjak(28.08.2020 12:02)
- 16q16 -- это таки 32-бита. Шифтер же сейчас есть даже у пиков,
более того у, даже трёхцилиндровых (pic24/dspic), есть относительно
быстрый делитель. А как у любительких армов? У некоторых нет вот. - fk0(28.08.2020 12:31)
- Дык, про 24/30/33 и речи быть не должно. Даже для 32 бит. Сратый
АВР должен такое легко пережёвывать. С млачшими ПИКами, да, могут
быть проблемы. - mse homjak(28.08.2020 12:46)
- Младшие пики - это у которых нет аппаратного умножителя. А, скажем, ДСПИК при 32 разрядах делает один шаг фильтра за 6 шагов. - Kpoк(28.08.2020 13:44)
- Дык, про 24/30/33 и речи быть не должно. Даже для 32 бит. Сратый
АВР должен такое легко пережёвывать. С млачшими ПИКами, да, могут
быть проблемы. - mse homjak(28.08.2020 12:46)
- 16q16 -- это таки 32-бита. Шифтер же сейчас есть даже у пиков,
более того у, даже трёхцилиндровых (pic24/dspic), есть относительно
быстрый делитель. А как у любительких армов? У некоторых нет вот. - fk0(28.08.2020 12:31)
- 1) Зачем нужна немеряная разрядность, если АЦП 16- разрядный? 2)
Что за фантазия считать в 16 разрядах, если все 16-разрядные машины
имеют умножитель, дающий 32-разрядный результат? - Kpoк(28.08.2020 15:49)
- На плавучку принято жаловаться, что она неточно. Любой умножитель в
16-разрядных машинах даёт 32-разпядный результат. Плавучка хранит
только 24 из них. - Kpoк(28.08.2020 09:26)
- если исходные данные имеют три значащих разряда, а остальное шумы - то и 24-х разрядная плавучка будет иметь 3 значащих разряда, а не 24. - Mahagam(28.08.2020 10:37)
- Я один и тот же код для PIC переписывал с long'ов на плавучку. И
стало быстрей. Потому, что long'и 32-битные (а в 16 бит не лезет),
а плавучка в не-PRO Hitech-C версии хорошо оптимизирована на
ассемблере руками и 24-битная. Причём там мантисса-то 16-битная
вовсе (которую нужно долго перемножать). Просто меньше операций, не
говоря уж, что прорамма сильно проще и короче. Проблема
целочисленных вычислений, что нужна немеряная разрядность (особенно
если у тебя в выражении fk0(164 знак., 28.08.2020 11:33)
- Про плавучку принято жаловаться, что медленно. Приятно встретить
человека, который не торопится без надобности. Рукопожимаю,
коллега. - SciFi(28.08.2020 08:04)
- Смоделировал в эксельке свой способ. Дополнительная ось для
выходов, чтобы видно лучше было. α = 3/256; Dingo(245 знак., 28.08.2020 07:10, картинка)
- Если a больше, чем 0.5 (а именно так и должно быть), то ошибка не только
не накапливается, но и рассасывается со временем. Kceния(406 знак., 27.08.2020 22:48)
- О сколько нам открытий чудных... Я так больше, чем 0.3 никогда не использую - Kpoк(27.08.2020 22:58)
- Если принять, что а = 2^-n и отнормировать к формату результата, то
и умножение сдвигами делается и ошибки не будет. к примеру, выход
16 бит, вход 10: а = 2^-6. Даже на ПИК проце отлично работало. - Visitor(27.08.2020 18:37)
- Ну вот пример для беззнаковых интов: Visitor(35 знак., 28.08.2020 14:23)
- Допустим y=x=0 изначально. Пришло один раз x=30. А потом одни нули.
Эти 30 застрянут навсегда на выходе (потому, что 30/32 = 0). - fk0(28.08.2020 15:39)
- А ты дальше используй не аккумулятор фильтра, а y>>6. И
ничего не выходе не зависнет. - Nikolay_Po(29.08.2020 13:20)
- Верно, писал усреднение отсчетов АЦП лет 12 назад, про выходной сдвиг забыл. - Visitor(29.08.2020 14:16)
- А ты дальше используй не аккумулятор фильтра, а y>>6. И
ничего не выходе не зависнет. - Nikolay_Po(29.08.2020 13:20)
- Допустим y=x=0 изначально. Пришло один раз x=30. А потом одни нули.
Эти 30 застрянут навсегда на выходе (потому, что 30/32 = 0). - fk0(28.08.2020 15:39)
- Вот это "Даже на ПИК" звучит оскорбительно. Тем более, что честные пиководы в этой формуле обходятся одним умножением. - Kpoк(27.08.2020 22:16)
- Ах целочисленными. Так что мешает a представить как N/(2^k). Например 0.1 = 410/4096 = 410
>> 12. Тогда получается y[n] = (410*x + 3686*y[n-1])
>> 12. - fk0(27.08.2020 20:30)
- "Изобретение" фикспойнта? ))) - my504(28.08.2020 06:21)
- Слишком громко сказано. Никогда "фикспоинтом" это не называл и
никакого отношения к одноимённым библиотекам оно не имеет. Понятно,
что в целых числах нельзя работать с числами от нуля до единицы, но
что мешает всё выражение домножить на некоторую величину -- идея в
этом. Не обязательно 24Q8 или что-то ещё, величина может быть
любая, на которую удобно делить и которая с одной стороны ещё не
наткнётся на переполнение сверху, и с другой позволит приемлимую
погрешность вычислений fk0(253 знак., 28.08.2020 11:24)
- Тут есть одна тонкость. При мониторинге переменных в отладчике использовать фикспойнт гораздо удобнее, чем множитель, исключающий деление входного значения фильтра. Скажем, в МПЛАБ Х можно настроить отображение переменных формата фикспойнт с настраиваемой разрядностью. То есть в вотч я наблюдаю десятичное дробное значение. - my504(28.08.2020 12:38)
- Раз уж ещё раз упомянули - может кините ссылок или материалов на
толковый въезд по теме? А то зачастую "вот библиотека для 24Q8,
пользуйтесь. А я, может хочу 12Q4 и понимать, как оно работает до
битика. Как-то попадалось у TI, но тогда не особо надо было, а
сейчас найти не могу. Пустыня долго хранит, а теперь General ещё и
теги прикрутил! - Dingo(28.08.2020 09:32)
- Какие ещё материалы по теме? Справочник Выгодского по элементарной математике? fk0(1 знак., 28.08.2020 11:22, картинка)
- Это очень просто. например, берёте 16р mse homjak(312 знак., 28.08.2020 10:24)
- Даже и не знаю что Вам посоветовать читать. Слишком элементарная тема. Фикспойнт - это разновидность целого. В DSP библиотеках фикспойнт переопределен как обычный int соответствующей разрядности. И все. Преобразование из целого в дробное с фиксированной точкой - это левый сдвиг целого на число разрядов дробной части. А наоборот - это правый сдвиг с округлением. Округление - это прибавление к дробному 0,5 (....000000.100000...В) перед сдвигом. Вот и вся "математика". - my504(28.08.2020 10:08)
- Чего там въезжать? Арифметика из программы 2-го класса начальной
школы. Вот, например, нагуглилось: - SciFi(28.08.2020 10:04, ссылка)
- У меня
лучшеподробней Dingo(3 знак., 28.08.2020 10:08, ссылка)- А вот еще одно достойное изложение - - MBedder(28.08.2020 11:52, ссылка)
- У меня
- Слишком громко сказано. Никогда "фикспоинтом" это не называл и
никакого отношения к одноимённым библиотекам оно не имеет. Понятно,
что в целых числах нельзя работать с числами от нуля до единицы, но
что мешает всё выражение домножить на некоторую величину -- идея в
этом. Не обязательно 24Q8 или что-то ещё, величина может быть
любая, на которую удобно делить и которая с одной стороны ещё не
наткнётся на переполнение сверху, и с другой позволит приемлимую
погрешность вычислений fk0(253 знак., 28.08.2020 11:24)
- "Изобретение" фикспойнта? ))) - my504(28.08.2020 06:21)
- +100500 - LordN(27.08.2020 19:19)
- Ну вот пример для беззнаковых интов: Visitor(35 знак., 28.08.2020 14:23)
- Оно же сходится к X при n -> бесконечности. При больших a ~= 1 -- быстро. - fk0(27.08.2020 13:44)
- Дык, эта. Мониторить значения сигнала до фильтра, и если они больше
выхода фильтра, то и учесть. Не? - Бapбoc(29.08.2020 22:46)