фнч.txt 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. http://we.easyelectronics.ru/Theory/chestno-prostoy-cifrovoy-filtr.html
  2. LN(1/5%) = 2,996
  3. LN(1/0,1%) = 6,908
  4. Ntau = 2,996...6,908
  5. N = Тпп / Т
  6. Alfa < EXP(-Ntau / N)
  7. Beta = 1 - Alfa
  8. Ntau = 6.908 (7?)
  9. Tpp = 100 ms
  10. T = 1.5625 ms
  11. A = -1,306122448979591836734693877551 / 58982 / 3686
  12. B = 2,306122448979591836734693877551 / 5554 / 410
  13. Y(n) = (Na*Y(n-1) + Nb*X(n)) >> 8
  14. or
  15. Y(n) = Y(n-1) + [Nb*(X(n) — Y(n-1)) >> 8]
  16. uint filter(u16 x){
  17. static u16 y = 0;
  18. static u16 z = 0;
  19. if (x >= y) {
  20. z += (x - y);
  21. } else {
  22. z += (y - x);
  23. }
  24. return y = (u16)((u32)(5554 * z) >> 16);
  25. };
  26. //
  27. #define Na 15
  28. #define Nb 1
  29. #define k 4
  30. int filter(int x){
  31. static int y = 0;
  32. return y1 = (Na * y + Nb * x) >> k;
  33. };
  34. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  35. http://electronix.ru/forum/lofiversion/index.php/t12237.html
  36. Самый простой способ, аналогичный ФНЧ, т.е. для условий, что сигнал
  37. низкочастотый и сетевая частота в нём присутствует в виде наводки как
  38. единственный высокочастоный сигнал:
  39. Частота дискретизации 1000 Гц;
  40. Подавляемая частота 50 Гц;
  41. На одном периоде подавляемой частоты получается 20 отсчетов.
  42. Для синуса при данных условиях получается, что если брать сумму выборок
  43. X(n-10)+X(n), то в результате должен получаться ноль.
  44. Но кроме синуса, какую-то часть веса выборки составляет полезный сигнал и
  45. простое суммирование приведёт к удвоению его среднего значения. Тогда делаем
  46. так: (X(n-10)+X(n))/2.
  47. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  48. http://chipenable.ru/index.php/programming-avr/item/162-prostoy-cifrovoy-filtr.html
  49. По сути, программа этого цифрового фильтра состоит всего из двух строчек на Си.:
  50. Dacc = Dacc + Din - Dout
  51. Dout = Dacc/K
  52. где Dout - выходное значение фильтра, Din - входное значение фильтра, K -
  53. постоянный коэффициент, который рассчитывается по формуле:
  54. K = T x SPS
  55. где T - это постоянная времени фильтра, SPS - частота дискретизации АЦП.
  56. Dacc и Dout должны сохранять свои значения, после выполнения алгоритма. Если
  57. алгоритм реализовать в виде функции, то эти переменные можно просто сделать
  58. статическими.
  59. Для 8-ми разрядных входных данных алгоритм цифрового фильтра в Си коде может выглядеть так:
  60. #define SPS 9600UL
  61. #define Trc 0.001f
  62. #define K (SPS*Trc)
  63. uint8_t Filtr(uint8_t data)
  64. {
  65. static uint16_t Dacc = 0;
  66. static uint8_t Dout = 0;
  67. uint8_t Din = data;
  68. Dacc = Dacc + Din - Dout;
  69. Dout = Dacc/(uint16_t)K;
  70. return Dout;
  71. }
  72. ---
  73. Моё: я думаю, что SPS нужно брать не частоту АЦП, а частоту выборок.