历史上的今天
返回首页

历史上的今天

今天是:2026年01月09日(星期五)

正在发生

2023年01月09日 | 单片机开发中,传感器的数据处理算法

2023-01-09 来源:zhihu

在传感器使用中,我们常常需要对传感器数据进行各种整理,让应用获得更好的效果,以下介绍几种常用的简单处理方法:

加权平滑:平滑和均衡传感器数据,减小偶然数据突变的影响。

抽取突变:去除静态和缓慢变化的数据背景,强调瞬间变化。

简单移动平均线:保留数据流最近的K个数据,取平均值。

下面,具体介绍一下这3种处理方法。

加权平滑

使用算法如下:

(新值) = (旧值)*(1 - a) + X * a其中a为设置的权值,X为最新数据,程序实现如下:


float ALPHA = 0.1f;

public void onSensorChanged(SensorEvent event){

x = event.values[0];

y = event.values[1];

z = event.values[2];

mLowPassX = lowPass(x,mLowPassX);

mLowPassY = lowPass(x,mLowPassY);

mLowPassZ = lowPass(x,mLowPassZ);

}

private float lowPass(float current,float last){

return last * (1.0f - ALPHA) + current * ALPHA;

}


抽取突变

此算法采用上面加权平滑的逆算法,实现代码如下:



public void onSensorChanged(SensorEvent event){

final float ALPHA = 0.8;gravity[0] = ALPHA * gravity[0] + (1-ALPHA) * event.values[0];

gravity[1] = ALPHA * gravity[1] + (1-ALPHA) * event.values[1];

gravity[2] = ALPHA * gravity[2] + (1-ALPHA) * event.values[2];filteredValues[0] = event.values[0] - gravity[0];

filteredValues[1] = event.values[1] - gravity[1];

filteredValues[2] = event.values[2] - gravity[2];

}


简单移动平均线

这个算法,保留传感器数据流中最近的K个数据,返回它们的平均值。k表示平均“窗口”的大小,实现代码如下:



public class MovingAverage{

private float circularBuffer[]; //保存传感器最近的K个数据

private float avg; //返回到传感器平均值

private float sum; //数值中传感器数据的和

private float circularIndex; //传感器数据数组节点位置

private int count;public MovingAverage(int k){

circularBuffer = new float[k];

count= 0;

circularIndex = 0;

avg = 0;

sum = 0;

}

public float getValue(){

return arg;

}

public long getCount(){

return count;

}

private void primeBuffer(float val){

for(int i=0;icircularBuffer[i] = val;

sum += val;

}

}

private int nextIndex(int curIndex){

if(curIndex + 1 >= circularBuffer.length){

return 0;

}

return curIndex + 1;

}

public void pushValue(float x){

if(0 == count++){

primeBuffer(x);

}

float lastValue = circularBuffer[circularIndex];

circularBuffer[circularIndex] = x; //更新窗口中传感器数据

sum -= lastValue; //更新窗口中传感器数据和

sum += x;

avg = sum / circularBuffer.length; //计算得传感器平均值

circularIndex = nextIndex(circularIndex);

}

}


推荐阅读

史海拾趣

Crameda Intersys公司的发展小趣事

作为一家有社会责任感的企业,Crameda Intersys公司不仅关注自身的经济效益,还积极履行社会责任。公司积极参与公益事业,支持教育、环保等领域的发展。同时,公司还注重环保和可持续发展,通过采用环保材料和节能技术,降低生产过程中的能耗和排放。这些举措不仅提升了公司的社会形象,也为社会的可持续发展做出了积极贡献。

这五个故事只是Crameda Intersys公司发展历程中的一部分,但它们足以展现出公司在电子行业中的成长轨迹和不懈追求。在未来的发展中,Crameda Intersys公司将继续以技术创新为引领,积极拓展市场渠道,培养更多优秀人才,加强质量管理和社会责任履行,为电子行业的发展贡献更多的力量。

FTDI公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。Crameda Intersys公司始终将质量管理放在首位,建立了严格的质量管理体系。公司从原材料采购、生产制造到产品检验等各个环节都严格把关,确保产品质量的稳定性和可靠性。这种对质量的执着追求赢得了客户的信任和好评,也为公司的长期发展奠定了坚实的基础。

Continental公司的发展小趣事

近年来,大陆集团在特种商用车胎领域也取得了重要突破。2014年,大陆集团在亚洲国际物流技术与运输系统展览会上发布了一款全新的产品——SC8特种商用车胎。这款产品是专门针对亚洲物料搬运业而开发出来的,适用于仓库、饮料业、造纸业等多个行业。SC8轮胎具备超深的轮胎花纹和极佳的性能,为物料搬运业提供了更高效、更安全的解决方案。这一产品的推出进一步巩固了大陆集团在商用车胎领域的市场地位。

CUI Inc.公司的发展小趣事

在追求持续增长的道路上,CUI Inc.采取了一项重要举措——收购加拿大电源制造商Tectrol Inc.。这次收购为CUI带来了丰富的产品线和技术资源,尤其是Tectrol在标准和定制电源解决方案方面的领先设计能力和制造能力。通过整合Tectrol的技术和资源,CUI进一步巩固了其在电源设计领域的领先地位,并为其未来的发展奠定了坚实的基础。

北京人民电器厂公司的发展小趣事

为了加强技术研发和创新能力,北京人民电器建立了北京市级技术研究中心,并吸引了教授级高工、博士后、博士、硕士等多层次的专业技术人才。这些人才为公司的新产品研发、技术创新提供了强大的智力支持,使得北京人民电器在激烈的市场竞争中始终保持领先地位。

Futaba Electric Co Ltd公司的发展小趣事

为了提高生产效率和产品质量,北京人民电器投入大量资金建设了自动化装配检测流水线。这一举措使得公司的生产能力得到了大幅提升,同时也确保了产品的一致性和可靠性。自动化流水线的建设,是北京人民电器在现代化生产道路上迈出的重要一步。

问答坊 | AI 解惑

不用外时钟,用8051做一个满位分辨率和精度都为1的频率计

来源:http://www.51c51.com/bbs/dispbbs.asp?boardid=6&replyid=200397&id=34655&page=1&skin=0&Star=1 我们知道,如果采用12MHz时钟时候,51定时计数器最大延时为65536us,为了产生1秒的频率计时间基准,通常的做法是采用50ms定时,然后再计数20 ...…

查看全部问答>

单片机复位电路原理

电阻给电容充电,电容的电压缓慢上升直到vcc,没到vcc时芯片复位脚近似低电平,于是芯片复位,接近vcc时芯片复位脚近高电平,于是芯片停止复位,复位完成。 先看看单片机数据手册,得知复位时间最少是多少个周期,再计算当前时钟频率一个周期是多 ...…

查看全部问答>

activesync 复制大文件的问题

想把flash文件夹下的196MB文件通过activesync复制到电脑上,却显示老是传到四分之一左右时进度条又从头开始传输了,不知道怎么回事,望高手帮忙分析下,多谢了!!!…

查看全部问答>

wince调用服务的问题

我参照msdn上wince服务的介绍写了个服务,但好像一直没有被系统调用,大家帮忙看下原因. appKey.SetValue(\"Dll\", \"MyMobileService.dll\"); appKey.SetValue(\"Order\", \"10\", RegistryValueKind.DWord); appKey.SetValue(\"Prefix\", \"CU\" ...…

查看全部问答>

USB isp1161 求助

老板说要用isp1161 开发一个 主机端和设备端都有的USB,但我刚毕业,网上看看发现USB不太好开发,希望有过开发经验的指导指导,我该怎么入手?…

查看全部问答>

stm32f101ret硬件看门狗没有作用?

目前程序是开了串口1,点了灯,烧录的hex用stm32f103 和sm32f101c6t6均测试通过,就是能够复位,但是101ret6就是不复位。。。折磨我一个星期了快。感觉是硬件的问题,但实在找不出哪里有问题了,换了个芯片还是这样。 希望大家帮忙…

查看全部问答>

关于精华贴<DS18B20源程序>的问题

最近在测试MSP430上读写DS18B20。有幸得到lsdfae04的代码。发现问题多多~ 第一:正如后面的跟贴,硬件不详。见\"uutjf1\"的跟贴。 第二:一个错误, unsigned int read_data(void) { //unsigned char data=0,i; unsigned int data=0, ...…

查看全部问答>

本人是新手,要学习ZIGBEE,请问从STM32W还是从CC2530入手更好?

要学习ZIGBEE,请问从STM32W还是从CC2530入手更好? 谢谢!! …

查看全部问答>

FPGA实现IFFT

可实现512点或64点IFFT算法的Verilog硬件代码…

查看全部问答>

MSP430 LaunchPad绝对实用的学习资料!!!

像我一样的菜鸟们好好跟着做一下吧!!!一定会有很大帮助,很全很详细!!!…

查看全部问答>