Least_Square.c 1.8 KB

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