1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- 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 нужно брать не частоту АЦП, а частоту выборок.
|