找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2041|回复: 0
收起左侧

卡尔曼滤波算法,matlab程序

[复制链接]
ID:438396 发表于 2018-12-3 14:44 | 显示全部楼层 |阅读模式
  1. function T = truth(seed);
  2. %
  3. % Generate truth signals
  4. %
  5. % Input:
  6. %         seed: random number seed (allows it to generate repeatable results)
  7. %
  8. % Output:
  9. %        T: truth struct with fields...
  10. %                 L: actual levels struct w/ fields
  11. %                                 L.C (constant)
  12. %                                 L.F (filling)
  13. %                                L.S (sloshing)
  14. %                                 L.FS (filling and sloshing)
  15. %                                 L.S0 (slosh around 0)
  16. %                 m: measured values struct
  17. %                                 level/linear fields m.l.C, m.l.F, m.l.S, m.l.FS
  18. %                                 angle/nonlinear fields m.a.C, m.a.F, m.a.S, m.a.FS
  19. %                ts: time steps [second]
  20. %

  21. % misc globals
  22. d2r = pi/180.0; % constant to convert [degree] to [radian]
  23. r2d = 180.0/pi; % constant to convert [radian] to [degree]

  24. % seed random number generator
  25. randn('state',seed);

  26. % temporal parameters
  27. T.stime = 5; % length of sim [second]
  28. T.mrate = 50; % measurement rate [1/second]
  29. T.nmeas = T.stime*T.mrate + 1;

  30. % water level limits
  31. T.L_min = 0.3; % where start filling, etc. [meter]
  32. T.L_max = 1.0; % full [meter]

  33. % Angular/non-linear float parameters
  34. T.db = T.L_max + 0.02; % base for angular sensor, just above the max water [meter]
  35. T.df = 1.25*T.db; % angular sensor arm w/ float, long enough to hit bottom on empty [meter]
  36. T.ka = 1.0;

  37. % Level/linear float parameters
  38. T.kl = 1.0;

  39. % measurement noise magnitudes
  40. T.srl_m = 0.01*T.L_max; % stdev of level/linear sensor noise [meter]
  41. T.sra_d = 0.01*90; % stdev of angule/non-linear sensor noise [degree]

  42. % Filling parameters
  43. T.delay = 1; % delay to start of filling [second]
  44. frate = (T.L_max - T.L_min) / (T.stime - T.delay + 1/T.mrate); % fill rate [meter/second]
  45. fmeas = frate/T.mrate; % amount filled per measurement [meter/meas]
  46. mf = T.delay*T.mrate; % meas of first fill motion

  47. % Sloshing (sinusoidal) parameters
  48. T.sf = 10/T.stime; % slosh/sin frequency [1/second]
  49. T.sp = 0; % slosh phase [degree]
  50. T.sm = 0.05; % slosh magnitude [meter]

  51. %
  52. % Generate signals
  53. %
  54. % Four possibilities
  55. % 1. Constant level (C)
  56. % 2. Filling (F)
  57. % 3. Sloshing (S)
  58. % 4. Filling + Sloshing (FS)
  59. %

  60. % sample times
  61. T.ts = 0:1/T.mrate:T.stime;

  62. % noise signals for each sensor type
  63. n.l = T.srl_m*randn(1,T.nmeas); % level/linear noise
  64. n.a = T.sra_d*randn(1,T.nmeas); % angle/non-linear noise

  65. %
  66. % actual/true levels (generate same number/resolution as measurements)
  67. %

  68. % 1. Constant level (C)
  69. % see equation (1) in document "models"
  70. L.C = repmat(T.L_min,1,T.nmeas); % constant signal
  71. m.l.C = T.kl*L.C + n.l; % level measured = signal + level/linear noise
  72. m.a.C = T.ka*r2d*asin((T.db-L.C)/T.df) + n.a; % angle measured = signal + angle/non-linear noise

  73. % 2. Filling (F)
  74. % see equation (2) in document "models"
  75. L.F = zeros(1,T.nmeas);
  76. L.F(1:mf-1) = T.L_min;
  77. L.F(mf:T.nmeas) = T.L_min:fmeas:T.L_max;
  78. m.l.F = T.kl*L.F + n.l; % level measured = signal + level/linear noise
  79. m.a.F = T.ka*r2d*asin((T.db-L.F)/T.df) + n.a; % angle measured = signal + angle/non-linear noise

  80. % 3. Sloshing (S)
  81. % see equation (3) in document "models"
  82. L.S0 = T.sm*sin(2*pi*T.ts*T.sf + T.sp*d2r); % around 0
  83. L.S = T.L_min + L.S0;
  84. m.l.S = T.kl*L.S + n.l; % level measured = signal + level/linear noise
  85. m.a.S = T.ka*r2d*asin((T.db-L.S)/T.df) + n.a; % angle measured = signal + angle/non-linear noise

  86. % 4. Filling + Sloshing (FS)
  87. % see equations (2) and (3) in document "models"
  88. L.FS = L.F + L.S0; % sum of filling and sloshing (slosh around 0 not min)
  89. m.l.FS = T.kl*L.FS + n.l; % level measured = signal + level/linear noise
  90. m.a.FS = T.ka*r2d*asin((T.db-L.FS)/T.df) + n.a; % angle measured = signal + angle/non-linear noise

  91. % put true Level and measurement information in struct
  92. T.L  = L;
  93. T.m  = m;

  94. return
  95. ?unction T = truth(seed);
  96. %
  97. % Generate truth signals
  98. %
  99. % Input:
  100. %         seed: random number seed (allows it to generate repeatable results)
  101. %
  102. % Output:
  103. %        T: truth struct with fields...
  104. %                 L: actual levels struct w/ fields
  105. %                                 L.C (constant)
  106. %                                 L.F (filling)
  107. %                                L.S (sloshing)
  108. %                                 L.FS (filling and sloshing)
  109. %                                 L.S0 (slosh around 0)
  110. %                 m: measured values struct
  111. %                                 level/linear fields m.l.C, m.l.F, m.l.S, m.l.FS
  112. %                                 angle/nonlinear fields m.a.C, m.a.F, m.a.S, m.a.FS
  113. %                ts: time steps [second]
  114. %

  115. % misc globals
  116. d2r = pi/180.0; % constant to convert [degree] to [radian]
  117. r2d = 180.0/pi; % constant to convert [radian] to [degree]

  118. % seed random number generator
  119. randn('state',seed);

  120. % temporal parameters
  121. T.stime = 5; % length of sim [second]
  122. T.mrate = 50; % measurement rate [1/second]
  123. T.nmeas = T.stime*T.mrate + 1;

  124. % water level limits
  125. T.L_min = 0.3; % where start filling, etc. [meter]
  126. T.L_max = 1.0; % full [meter]

  127. % Angular/non-linear float parameters
  128. T.db = T.L_max + 0.02; % base for angular sensor, just above the max water [meter]
  129. T.df = 1.25*T.db; % angular sensor arm w/ float, long enough to hit bottom on empty [meter]
  130. T.ka = 1.0;

  131. % Level/linear float parameters
  132. T.kl = 1.0;

  133. % measurement noise magnitudes
  134. T.srl_m = 0.01*T.L_max; % stdev of level/linear sensor noise [meter]
  135. T.sra_d = 0.01*90; % stdev of angule/non-linear sensor noise [degree]

  136. % Filling parameters
  137. T.delay = 1; % delay to start of filling [second]
  138. frate = (T.L_max - T.L_min) / (T.stime - T.delay + 1/T.mrate); % fill rate [meter/second]
  139. fmeas = frate/T.mrate; % amount filled per measurement [meter/meas]
  140. mf = T.delay*T.mrate; % meas of first fill motion

  141. % Sloshing (sinusoidal) parameters
  142. T.sf = 10/T.stime; % slosh/sin frequency [1/second]
  143. T.sp = 0; % slosh phase [degree]
  144. T.sm = 0.05; % slosh magnitude [meter]

  145. %
  146. % Generate signals
  147. %
  148. % Four possibilities
  149. % 1. Constant level (C)
  150. % 2. Filling (F)
  151. % 3. Sloshing (S)
  152. % 4. Filling + Sloshing (FS)
  153. %

  154. % sample times
  155. T.ts = 0:1/T.mrate:T.stime;

  156. % noise signals for each sensor type
  157. n.l = T.srl_m*randn(1,T.nmeas); % level/linear noise
  158. n.a = T.sra_d*randn(1,T.nmeas); % angle/non-linear noise

  159. %
  160. % actual/true levels (generate same number/resolution as measurements)
  161. %

  162. % 1. Constant level (C)
  163. % see equation (1) in document "models"
  164. L.C = repmat(T.L_min,1,T.nmeas); % constant signal
  165. m.l.C = T.kl*L.C + n.l; % level measured = signal + level/linear noise
  166. m.a.C = T.ka*r2d*asin((T.db-L.C)/T.df) + n.a; % angle measured = signal + angle/non-linear noise

  167. % 2. Filling (F)
  168. % see equation (2) in document "models"
  169. L.F = zeros(1,T.nmeas);
  170. L.F(1:mf-1) = T.L_min;
  171. L.F(mf:T.nmeas) = T.L_min:fmeas:T.L_max;
  172. m.l.F = T.kl*L.F + n.l; % level measured = signal + level/linear noise
  173. m.a.F = T.ka*r2d*asin((T.db-L.F)/T.df) + n.a; % angle measured = signal + angle/non-linear noise

  174. % 3. Sloshing (S)
  175. % see equation (3) in document "models"
  176. L.S0 = T.sm*sin(2*pi*T.ts*T.sf + T.sp*d2r); % around 0
  177. L.S = T.L_min + L.S0;
  178. m.l.S = T.kl*L.S + n.l; % level measured = signal + level/linear noise
  179. m.a.S = T.ka*r2d*asin((T.db-L.S)/T.df) + n.a; % angle measured = signal + angle/non-linear noise

  180. % 4. Filling + Sloshing (FS)
  181. % see equations (2) and (3) in document "models"
  182. L.FS = L.F + L.S0; % sum of filling and sloshing (slosh around 0 not min)
  183. m.l.FS = T.kl*L.FS + n.l; % level measured = signal + level/linear noise
  184. m.a.FS = T.ka*r2d*asin((T.db-L.FS)/T.df) + n.a; % angle measured = signal + angle/non-linear noise

  185. % put true Level and measurement information in struct
  186. T.L  = L;
  187. T.m  = m;

  188. return
  189. ?
复制代码


kftool_matlab.zip

8.48 KB, 下载次数: 20, 下载积分: 黑币 -5

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表