Least_Square.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include <stdio.h>
  2. #include "Least_Square.h"
  3. //y = Kax + Cb
  4. void least_square_init(least_square_t *ls, int samples){
  5. ls->max_samples = samples;
  6. least_square_clear(ls);
  7. }
  8. void least_square_clear(least_square_t *ls) {
  9. ls->num_samples = 0;
  10. ls->coeff.Ka = 1.0f;
  11. ls->coeff.Cb = 0.0f;
  12. ls->mul_xx = 0;
  13. ls->mul_xy = 0;
  14. ls->sum_x = 0;
  15. ls->sum_y = 0;
  16. ls->finished = 0;
  17. }
  18. int least_square_put(least_square_t *ls, double x, double y){
  19. if (!ls->finished){
  20. ls->num_samples ++;
  21. ls->mul_xx += x * x;
  22. ls->mul_xy += x * y;
  23. ls->sum_x += x;
  24. ls->sum_y += y;
  25. if (ls->num_samples == ls->max_samples){
  26. ls->coeff.Ka = (ls->num_samples * ls->mul_xy - ls->sum_x * ls->sum_y) / (ls->num_samples * ls->mul_xx - ls->sum_x * ls->sum_x);
  27. ls->coeff.Cb = ls->sum_y / ls->num_samples - ls->coeff.Ka * ls->sum_x / ls->num_samples;
  28. ls->finished = 1;
  29. }
  30. }else {
  31. ls->num_samples ++;
  32. ls->mul_xx += x * x;
  33. ls->mul_xy += x * y;
  34. ls->sum_x += x;
  35. ls->sum_y += y;
  36. ls->coeff.Ka = (ls->num_samples * ls->mul_xy - ls->sum_x * ls->sum_y) / (ls->num_samples * ls->mul_xx - ls->sum_x * ls->sum_x);
  37. ls->coeff.Cb = ls->sum_y / ls->num_samples - ls->coeff.Ka * ls->sum_x / ls->num_samples;
  38. }
  39. return ls->finished;
  40. }
  41. double get_y_by_x(least_square_t *ls, double x){
  42. return ls->coeff.Ka * x + ls->coeff.Cb;
  43. }
  44. int get_x_by_y(least_square_t *ls, double y) {
  45. if (ls->coeff.Ka == 0){
  46. return -1;
  47. }
  48. int x = (y - ls->coeff.Cb)/ls->coeff.Ka;
  49. return (x >= 0) ? x : -1;
  50. }
  51. #if 0
  52. void Least_square_method(void)
  53. {
  54. int i=0;
  55. double A = 0, B = 0, C = 0, D = 0;
  56. for(i=0;i<sample_count;i++) {
  57. A += samples[i].x * samples[i].y;
  58. B += samples[i].x;
  59. C += samples[i].y;
  60. D += samples[i].x * samples[i].x;
  61. }
  62. AA = (sample_count * A - B * C) / ( sample_count * D - B * B);
  63. BB = C / sample_count - AA * B / sample_count;
  64. sys_debug("Gain = %f, zero Off = %f\n", AA, BB);
  65. }
  66. void add_smaple(float x, float y){
  67. if (sample_count < 5){
  68. samples[sample_count].x = x;
  69. samples[sample_count].y = y;
  70. sample_count ++;
  71. sys_debug("add x = %f, y = %f\n", x, y);
  72. }
  73. if (sample_count == 5){
  74. Least_square_method();
  75. }
  76. }
  77. #endif