фнч.txt 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. http://electronix.ru/forum/lofiversion/index.php/t12237.html
  2. Самый простой способ, аналогичный ФНЧ, т.е. для условий, что сигнал
  3. низкочастотый и сетевая частота в нём присутствует в виде наводки как
  4. единственный высокочастоный сигнал:
  5. Частота дискретизации 1000 Гц;
  6. Подавляемая частота 50 Гц;
  7. На одном периоде подавляемой частоты получается 20 отсчетов.
  8. Для синуса при данных условиях получается, что если брать сумму выборок
  9. X(n-10)+X(n), то в результате должен получаться ноль.
  10. Но кроме синуса, какую-то часть веса выборки составляет полезный сигнал и
  11. простое суммирование приведёт к удвоению его среднего значения. Тогда делаем
  12. так: (X(n-10)+X(n))/2.
  13. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  14. http://chipenable.ru/index.php/programming-avr/item/162-prostoy-cifrovoy-filtr.html
  15. По сути, программа этого цифрового фильтра состоит всего из двух строчек на Си.:
  16. Dacc = Dacc + Din - Dout
  17. Dout = Dacc/K
  18. где Dout - выходное значение фильтра, Din - входное значение фильтра, K -
  19. постоянный коэффициент, который рассчитывается по формуле:
  20. K = T x SPS
  21. где T - это постоянная времени фильтра, SPS - частота дискретизации АЦП.
  22. Dacc и Dout должны сохранять свои значения, после выполнения алгоритма. Если
  23. алгоритм реализовать в виде функции, то эти переменные можно просто сделать
  24. статическими.
  25. Для 8-ми разрядных входных данных алгоритм цифрового фильтра в Си коде может выглядеть так:
  26. #define SPS 9600UL
  27. #define Trc 0.001f
  28. #define K (SPS*Trc)
  29. uint8_t Filtr(uint8_t data)
  30. {
  31. static uint16_t Dacc = 0;
  32. static uint8_t Dout = 0;
  33. uint8_t Din = data;
  34. Dacc = Dacc + Din - Dout;
  35. Dout = Dacc/(uint16_t)K;
  36. return Dout;
  37. }
  38. ---
  39. Моё: я думаю, что SPS нужно брать не частоту АЦП, а частоту выборок.