http://we.easyelectronics.ru/Theory/chestno-prostoy-cifrovoy-filtr.html LN(1/5%) = 2,996 LN(1/0,1%) = 6,908 Ntau = 2,996...6,908 N = Тпп / Т Alfa < EXP(-Ntau / N) Beta = 1 - Alfa Ntau = 6.908 (7?) Tpp = 100 ms T = 1.5625 ms A = -1,306122448979591836734693877551 / 58982 / 3686 B = 2,306122448979591836734693877551 / 5554 / 410 Y(n) = (Na*Y(n-1) + Nb*X(n)) >> 8 or Y(n) = Y(n-1) + [Nb*(X(n) — Y(n-1)) >> 8] uint filter(u16 x){ static u16 y = 0; static u16 z = 0; if (x >= y) { z += (x - y); } else { z += (y - x); } return y = (u16)((u32)(5554 * z) >> 16); }; // #define Na 15 #define Nb 1 #define k 4 int filter(int x){ static int y = 0; return y1 = (Na * y + Nb * x) >> k; }; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- http://electronix.ru/forum/lofiversion/index.php/t12237.html Самый простой способ, аналогичный ФНЧ, т.е. для условий, что сигнал низкочастотый и сетевая частота в нём присутствует в виде наводки как единственный высокочастоный сигнал: Частота дискретизации 1000 Гц; Подавляемая частота 50 Гц; На одном периоде подавляемой частоты получается 20 отсчетов. Для синуса при данных условиях получается, что если брать сумму выборок X(n-10)+X(n), то в результате должен получаться ноль. Но кроме синуса, какую-то часть веса выборки составляет полезный сигнал и простое суммирование приведёт к удвоению его среднего значения. Тогда делаем так: (X(n-10)+X(n))/2. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- http://chipenable.ru/index.php/programming-avr/item/162-prostoy-cifrovoy-filtr.html По сути, программа этого цифрового фильтра состоит всего из двух строчек на Си.: Dacc = Dacc + Din - Dout Dout = Dacc/K где Dout - выходное значение фильтра, Din - входное значение фильтра, K - постоянный коэффициент, который рассчитывается по формуле: K = T x SPS где T - это постоянная времени фильтра, SPS - частота дискретизации АЦП. Dacc и Dout должны сохранять свои значения, после выполнения алгоритма. Если алгоритм реализовать в виде функции, то эти переменные можно просто сделать статическими. Для 8-ми разрядных входных данных алгоритм цифрового фильтра в Си коде может выглядеть так: #define SPS 9600UL #define Trc 0.001f #define K (SPS*Trc) uint8_t Filtr(uint8_t data) { static uint16_t Dacc = 0; static uint8_t Dout = 0; uint8_t Din = data; Dacc = Dacc + Din - Dout; Dout = Dacc/(uint16_t)K; return Dout; } --- Моё: я думаю, что SPS нужно брать не частоту АЦП, а частоту выборок.