栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言利用循环队列实现滑动平均值滤波器,提高计算速度

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言利用循环队列实现滑动平均值滤波器,提高计算速度

目录
  • 源码
    • Filter.c
    • Filter.h
  • 使用
  • 效果

普中51-单核-A2
STC89C52
Keil uVision V5.29.0.0
PK51 Prof.Developers Kit Version:9.60.0.0
串口示波器:Vofa+ 1.3.10


网上查到的滑动平均值滤波器在计算平均值的时候还要再for累加一遍,这太浪费时间了,在一些性能较拉跨的单片机上是难以接受的。我进行了如下改进:

源码 Filter.c
#include "stdint.h"
#include "Filter.h"

Sliding_Mean_Filter Example_Filter = {{0}, 0, 0, 0};

void Sliding_Mean_Filter_Calc(Sliding_Mean_Filter *filter, double Data)
{
	filter->sum -= filter->Filter_Buffer[filter->id];	//减去最旧的数
	filter->sum += Data;								//加进最新的数
	filter->Filter_Buffer[filter->id] = Data;			//将最新的数覆盖最旧的数
	filter->average = filter->sum / Sliding_Mean_Filter_Buffer_Size;	//求均值
	if(++filter->id == Sliding_Mean_Filter_Buffer_Size)
		filter->id = 0;
}
Filter.h
#ifndef Filter_H_
#define Filter_H_ 

#define Sliding_Mean_Filter_Buffer_Size 50

typedef struct
{
	double Filter_Buffer[Sliding_Mean_Filter_Buffer_Size];
	uint16_t id;
	double sum;
	double average;
}Sliding_Mean_Filter;

void Sliding_Mean_Filter_Calc(Sliding_Mean_Filter *filter, double Data);

extern Sliding_Mean_Filter Example_Filter;

#endif
使用

Data为喂入的数据,结果在Example_Filter.average里

Sliding_Mean_Filter_Calc(&Example_Filter, Data);

效果

用51单片机测试,晶振频率为11.0592MHz,6T模式,对随机数进行滤波
滤波器的数组大小为50:
可以看到,随机数的均值为0.5,合理!


滤波器的数组大小为10:


滤波器的数组大小为25:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/457223.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号