KalmanFilter.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*
  2. * File name : KalmanFilter.cpp
  3. * Description: Kalman Filter class
  4. * Author : Oliver Wang from Seeed studio
  5. * Version : V0.1
  6. * Create Time: 2014/04
  7. * Change Log :
  8. */
  9. /****************************************************************************/
  10. /*** Include files ***/
  11. /****************************************************************************/
  12. #include <Arduino.h>
  13. #include <KalmanFilter.h>
  14. #include <inttypes.h>
  15. #include <stdlib.h>
  16. #include <stdio.h>
  17. /* random number table */
  18. float Rand_Table[100]={
  19. 0.5377,1.8339,-2.2588,0.8622,0.3188,-1.3077,-0.4336,0.342,3.5784,
  20. 2.7694,-1.3499,3.0349,0.7254,-0.0631,0.7147,-0.2050,-0.1241,1.4897,
  21. 1.4090,1.4172,0.6715,-1.2075,0.7172,1.6302,0.4889,1.0347,0.7269,
  22. -0.3034,0.2939,-0.7873,0.8884,-1.1471,-1.0689,-0.8095,-2.9443,1.4384,
  23. 0.3252,-0.7549,1.3703,-1.7115,-0.1022,-0.2414,0.3192,0.3129,-0.8649,
  24. -0.0301,-0.1649,0.6277,1.0933,1.1093,-0.8637,0.0774,-1.2141,-1.1135,
  25. -0.0068,1.5326,-0.7697,0.3714,-0.2256,1.1174,-1.0891,0.0326,0.5525,
  26. 1.1006,1.5442,0.0859,-1.4916,-0.7423,-1.0616,2.3505,-0.6156,0.7481,
  27. -0.1924,0.8886,-0.7648,-1.4023,-1.4224,0.4882,-0.1774,-0.1961,1.4193,
  28. 0.2916,0.1978,1.5877,-0.8045,0.6966,0.8351,-0.2437,0.2157,-1.1658,
  29. -1.1480,0.1049,0.7223,2.5855,-0.6669,0.1873,-0.0825,-1.9330,-0.439,
  30. -1.7947};
  31. /* Extern variables */
  32. KalmanFilter kalmanFilter;
  33. KalmanFilter::KalmanFilter()
  34. {
  35. X_pre = 0;
  36. P_pre = 0;
  37. X_post = 0;
  38. P_post = 0;
  39. K_cur = 0;
  40. }
  41. float KalmanFilter::Gaussian_Noise_Cov(void)
  42. {
  43. int index = 0;
  44. float tmp[10]={0.0};
  45. float average = 0.0;
  46. float sum = 0.0;
  47. /* Initialize random number generator */
  48. srand((int)analogRead(0));
  49. /* Get random number */
  50. for(int i=0; i<10; i++)
  51. {
  52. index = (int)rand()%100;
  53. tmp[i] = Rand_Table[index];
  54. sum += tmp[i];
  55. }
  56. /* Calculate average */
  57. average = sum/10;
  58. /* Calculate Variance */
  59. float Variance = 0.0;
  60. for(int j = 0; j < 10; j++)
  61. {
  62. Variance += (tmp[j]-average)*(tmp[j]-average);
  63. }
  64. Variance/=10.0;
  65. return Variance;
  66. }
  67. float KalmanFilter::Filter(float origin)
  68. {
  69. float modelNoise = 0.0;
  70. float observeNoise = 0.0;
  71. /* Get model and observe Noise */
  72. modelNoise = Gaussian_Noise_Cov();
  73. observeNoise = Gaussian_Noise_Cov();
  74. /* Algorithm */
  75. X_pre = X_post;
  76. P_pre = P_post + modelNoise;
  77. K_cur = P_pre/(P_pre + observeNoise);
  78. P_post = (1 - K_cur)*P_pre;
  79. X_post = X_pre + K_cur*(origin - X_pre);
  80. return X_post;
  81. }