你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

数据处理中3种常用算法(附C语言代码)

[复制链接]
eefishing 发布时间:2020-2-9 23:18
在传感器使用中,我们常常需要对传感器数据进行各种整理,让应用获得更好的效果,以下介绍几种常用的简单处理方法:
/ y% p5 W2 x& ]6 g; ?6 l( f- D; t0 j+ l2 J
1.加权平滑:平滑和均衡传感器数据,减小偶然数据突变的影响;& c5 T/ I; i! I6 j
2.抽取突变:去除静态和缓慢变化的数据背景,强调瞬间变化;* k  A/ _0 V1 X1 M3 Q7 F
3.简单移动平均线:保留数据流最近的K个数据,取平均值;/ B% a3 E$ g; u# l
) v4 ]& s6 h0 {7 x6 N6 l$ }
01
6 q0 |) T) ^0 j) ~  }: ?& H' r加权平滑( ?* e7 ?2 N0 ^1 T5 H3 ]7 X, ~

0 F9 D* f: C. t0 g: [使用算法如下:
/ m. F" I2 a3 i- c# g(新值) = (旧值)*(1 - a) + X * a其中a为设置的权值,X为最新数据,程序实现如下:/ o; F& K- G1 _0 g
float ALPHA = 0.1f;
. z" ^3 v/ f$ m3 t. W" p$ p, k$ bpublic void onSensorChanged(SensorEvent event){9 [9 k  `& H5 d
x = event.values[0];
0 ~& D& p6 b4 ]( Ky = event.values[1];
( }% h# v7 E$ z, Xz = event.values[2];
. {3 g  a: O+ G# ?  p- L# emLowPassX = lowPass(x,mLowPassX);
& n6 I. r" I5 i1 NmLowPassY = lowPass(x,mLowPassY);6 X& E1 x& ]" M' a' l8 A4 }
mLowPassZ = lowPass(x,mLowPassZ);
0 k  M- f+ d0 ~# h; q% R# {}
# ^; a' |/ F4 C3 Jprivate float lowPass(float current,float last){
5 `, z. y0 ^; V& Jreturn last * (1.0f - ALPHA) + current * ALPHA;7 m& X/ l9 l  |3 r+ G9 M  m
}
4 I$ ^* W% j# w) I! p' r. u9 o2 ?7 k
. s% d, A( L, D0 Y) s02; V) k% b8 J4 ^8 ]* B
抽取突变采用上面加权平滑的逆算法* m3 B0 [$ ?: j
; [, {4 K, l& }1 C, s$ e
实现代码如下:" l0 i" w% S$ ^# G9 @3 n
public void onSensorChanged(SensorEvent event){
1 `+ }- q8 q! k6 Ifinal float ALPHA = 0.8;gravity[0] = ALPHA * gravity[0] + (1-ALPHA) * event.values[0];
1 c/ b! Z: Z5 D& A, m7 ^/ x7 o* \$ kgravity[1] = ALPHA * gravity[1] + (1-ALPHA) * event.values[1];9 G9 ]' [0 Y! k7 u9 D
gravity[2] = ALPHA * gravity[2] + (1-ALPHA) * event.values[2];filteredValues[0] = event.values[0] - gravity[0];
& k) r0 Y4 L0 G" b4 R3 _filteredValues[1] = event.values[1] - gravity[1];4 J' J2 O+ c, _
filteredValues[2] = event.values[2] - gravity[2];8 Y8 P8 d7 T! T+ p9 Z% c$ B, F
}1 a* ^# d9 R- ~' {

( K4 Z& T' @+ ?4 x. A* W03
5 t) D0 }8 |7 l9 c7 Q* k简单移动平均线
6 D0 I6 e& @4 t3 _# O* C
' G1 l7 G' c5 P3 e保留传感器数据流中最近的K个数据,返回它们的平均值。k表示平均“窗口”的大小;. H" v. @( l# S6 @; I0 P9 P

6 N7 {6 ?" L4 c, G$ b( k实现代码如下:( c; @: }6 \0 d& ~3 w5 s" [
public class MovingAverage{; @+ x/ F7 Q7 n5 B9 x! v5 [
private float circularBuffer[]; //保存传感器最近的K个数据4 o9 D/ V3 F! S' g1 t# y
private float avg; //返回到传感器平均值9 d/ b$ p4 {$ b3 B1 v1 ^( y- B0 |$ B
private float sum; //数值中传感器数据的和  d; F: E( B$ i
private float circularIndex; //传感器数据数组节点位置2 E# C/ u$ F9 ?
private int count;public MovingAverage(int k){; F, ~# \. I- c. }' y1 Z5 z
circularBuffer = new float[k];$ l% o: r( C3 f( i
count= 0;
" e. S3 x( n3 t' h+ ~+ y' y* lcircularIndex = 0;
5 c/ I: U" M3 P  q0 Q9 h; `avg = 0;2 n* v; O. p" B
sum = 0;4 y9 S& i2 \; f$ B4 A
}8 z% W& q' a7 M/ `! r  U
public float getValue(){! k( ~. c: C2 s  W
return arg;' E4 X  M, q) ^% Q: S4 T7 [# X9 u& k
}
' B1 ~. u( R; k; h: spublic long getCount(){# ~* y2 d4 d4 p
return count;$ }' e( p3 X6 H. t
}( A7 u. \' x4 m5 Y( |( E/ H8 E
private void primeBuffer(float val){
; v: R. E1 h+ Nfor(int i=0;i<circularbuffer.length;++i){' ~) V1 o7 p0 v9 M
circularBuffer = val;
' v8 Q  i: L/ `) Y+ Fsum += val;
; `2 V% N$ a0 U* a% t}& P: S5 H' ^0 H9 _
}
7 [' ^% x; L( I! S% Wprivate int nextIndex(int curIndex){, {& P3 p9 E; M. B! M) V! q4 S
if(curIndex + 1 >= circularBuffer.length){( m  ~3 U1 }' l8 O0 |! d* Y4 y
return 0;
, n+ \% U/ ~2 b, x4 }, O# P: a* j$ n7 f}- Q, Q; H5 S" X  r7 ^- x: s
return curIndex + 1;
  D1 R& q. Y6 ~% ]# u}9 g0 y* `! O  k0 ~/ ^; }
public void pushValue(float x){
4 U& j6 J  X8 I* J0 A  z& pif(0 == count++){9 G& N+ Z/ R' ]& v2 N, B1 P+ a
primeBuffer(x);
7 V; Y5 S7 h5 V/ y* t' R}
+ C( `1 I/ H3 p' Mfloat lastValue = circularBuffer[circularIndex];( U# P* g- P) ^; t( S3 _
circularBuffer[circularIndex] = x; //更新窗口中传感器数据
3 \5 y3 A# i$ n1 Q2 Y5 Qsum -= lastValue; //更新窗口中传感器数据和: a; E3 o" x& t7 z! ?8 \" l
sum += x;0 ]5 ?8 F) P# x+ Q3 |. ?: m! y
avg = sum / circularBuffer.length; //计算得传感器平均值
( t% P$ n; X' K" ^2 A' A7 ]5 ~circularIndex = nextIndex(circularIndex);
" _! O6 p: y+ o0 e9 f# w/ H}
5 |* h1 Y# p( q' G9 Z' T}
; M& F  z3 F# |( m  ]2 N" v4 o5 R: y' E$ }- G" ?, ?
赞 收藏 1 评论0 发布时间:2020-2-9 23:18

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版