递推平均滤波

数据波动比较大,但又希望延迟比较小,可以尝试使用递推平均滤波

#define filter_num 5
float recursive_average_filter(uint16_t filter_object)
{	
    uint32_t sum = 0;         
    float temp = 0;	
	static uint16_t filter_buf[filter_num + 1]; 
    filter_buf[filter_num] = filter_object;
    for(char i = 0; i < filter_num; i++){
		filter_buf[i] = filter_buf[i + 1]; // 所有数据左移,低位扔掉
        sum += filter_buf[i];
    }
    temp = ((float)sum / filter_num);
    return temp;
}

滤波效果如下图:


递推平均滤波是一种简单的数字滤波方法,用于平滑传感器数据或移除噪声。它的基本思想是用新的测量值不断替换数组中的旧数据,这样数组始终存储最近的N个数据。这些数据可以用来计算平均值,用以代表最新的信号估计值。 在单片机上用C语言实现递推平均滤波的步骤通常如下: 1. 初始化一个数组用于存储最新N个数据值。 2. 当新的数据到来时,将该数据值存入数组,并把数组中原来的最后一个数据删除。 3. 计算数组中当前所有数据的平均值,这个平均值即为滤波后的输出值。 4. 重复上述步骤,以不断更新滤波输出。 下面是一个简单的递推平均滤波算法实现的代码示例: ```c #include <stdio.h> #define FILTER_SIZE 10 // 定义滤波器的大小 float recursive_average_filter(float new_value, float* filter, int* count) { // 将新值插入到数组的末尾,并移除最旧的值 for (int i = *count - 1; i > 0; --i) { filter[i] = filter[i - 1]; } filter[0] = new_value; // 更新计数器 if (*count < FILTER_SIZE) { (*count)++; } // 计算平均值 float sum = 0; for (int i = 0; i < *count; ++i) { sum += filter[i]; } return sum / *count; } int main() { float filter[FILTER_SIZE] = {0}; // 初始化滤波数组 int count = 0; // 当前数组中的数据个数 float new_value; // 新测量值 // 假设这里不断获取新的测量值 while (1) { // 模拟获取新的测量值 new_value = ... // 获取新的测量值的代码 // 应用递推平均滤波 float filtered_value = recursive_average_filter(new_value, filter, &count); // 使用滤波后的值 printf("Filtered value: %f\n", filtered_value); } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值