alex_vd пишет:
Эту часть можно упростить: коэффициенты (полюса) Вашего фильтра симметричны относительно середины. При этом можно уменьшить количество умножений...
Это так, резерв здесь есть хороший.
С выходным ШИМом можно так поступить (если освободить один таймер): допустим есть 16 битный результат, который нужно вывести через два 8 битных ШИМ. Записываете старшие 8 бит в первый таймер, младшие - во второй. Выходы первого таймера соединяем с резистором 1к, второго с резистором 256к. Вторые выводы резисторов - вместе и на нагрузочный резистор. (видел такую схему в интернете). При этом можна увеличить частоту ШИМ не уменьшая разрядность.
Идея отличная. Но таймеры все используются.
КИХ фильтр не должен возбуждаться - скорее всего он "перегружается" - переполнение аккумулятора или просто не обнуляете аккумулятор при новом цикле.
В программе идет проверка на перегрузку. Проверяется входное значение. Дальше все устроено так, что при этом аккумулятор не перегружается.
Когда аккумулятор перегружается, и старший разряд выскакивает за сетку, фильтр начинает создавать почти белый шум из младших разрядов. А в нашем случае вырастает пик на центральной частоте фильтра.