You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
1.7KB

  1. #pragma once
  2. template <typename T, int order>
  3. class Poly
  4. {
  5. public:
  6. Poly();
  7. float run(float x)
  8. {
  9. fillPowers(x);
  10. return (float) doSum();
  11. }
  12. void setGain(int index, float value)
  13. {
  14. assert(index >= 0 && index < order);
  15. gains[index] = value;
  16. }
  17. private:
  18. T gains[order];
  19. // powers[0] = x, powers[1] = x**2
  20. T powers[order];
  21. void fillPowers(T);
  22. T doSum();
  23. };
  24. template <typename T, int order>
  25. inline Poly<T, order>::Poly()
  26. {
  27. assert(order == 11);
  28. for (int i = 0; i < order; ++i) {
  29. gains[i] = 0;
  30. powers[i] = 0;
  31. }
  32. }
  33. template <typename T, int order>
  34. inline void Poly<T, order>::fillPowers(T x)
  35. {
  36. T value = x;
  37. for (int i = 0; i < order; ++i) {
  38. powers[i] = value;
  39. value *= x;
  40. }
  41. }
  42. template <typename T, int order>
  43. inline T Poly<T, order>::doSum()
  44. {
  45. T ret = gains[0] * powers[0];
  46. ret += gains[1] * (2 * powers[1] - 1);
  47. ret += gains[2] * (4 * powers[2] - 3 * powers[0]);
  48. ret += gains[3] * (8 * powers[3] - 8 * powers[1] + 1);
  49. ret += gains[4] * (16 * powers[4] - 20 * powers[2] + 5 * powers[0]);
  50. ret += gains[5] * (32 * powers[5] - 48 * powers[3] + 18 * powers[1] - 1);
  51. ret += gains[6] * (64 * powers[6] - 112 * powers[4] + 56 * powers[2] - 7 * powers[0]);
  52. ret += gains[7] * (128 * powers[7] - 256 * powers[5] + 160 * powers[3] - 32 * powers[1] + 1);
  53. ret += gains[8] * (256 * powers[8] - 576 * powers[6] + 432 * powers[4] - 120 * powers[2] + 9 * powers[0]);
  54. ret += gains[9] * (512 * powers[9] - 1280 * powers[7] + 1120 * powers[5] - 400 * powers[3] + 50 * powers[1] - 1);
  55. ret += gains[10] * (1024 * powers[10] - 2816 * powers[8] + 2816 * powers[6] - 1232 * powers[4] + 220 * powers[2] - 11 * powers[0]);
  56. return ret;
  57. }