打印
[应用相关]

简单的滑动平均滤波器

[复制链接]
2283|61
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gygp|  楼主 | 2023-3-31 14:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
滑动平均滤波器在工程中十分常见,这里用C语言设计一个灵活的滑动滤波器库函数,十分简单易用,并且滤波器不使用for循环,大大减少了代码运行时间。
并且滤波器可以使用malloc自动申请内存,也可以不使用malloc函数,然后自己添加数据cache.
  • 滤波效果验证
在长度为10000的幅值为1的正弦波上叠加幅值为1均值为0的噪声,滑动窗口为100,效果如下:

/*
* @Author: luoqi
* @Date: 2022-03-15 09:59:42
* [url=home.php?mod=space&uid=778419]@last[/url] Modified by: luoqi
* @Last Modified time: 2022-03-15 10:08:42
*/

#ifndef _SLIDING_AVERAGE_FILTER_H
#define _SLIDING_AVERAGE_FILTER_H

#define SLIDING_AVERAGE_FILTER_USEING_STDLIB  1

typedef struct _sliding_average_filter
{
    int w_size;
    int head;
    float sum;
    float *cache;
} SlidAveFilterObj;

void sliding_average_filter_init(SlidAveFilterObj *filter, int w_size);

float sliding_average_filter(SlidAveFilterObj *filter, float k);

int sliding_average_filter_cache_add(SlidAveFilterObj *filter, float *cache, int w_size);

#endif

/*
* @Author: luoqi
* @Date: 2022-03-15 10:01:18
* @Last Modified by: luoqi
* @Last Modified time: 2022-03-15 15:52:19
*/

#include "sliding_average_filter.h"

#ifdef SLIDING_AVERAGE_FILTER_USEING_STDLIB
#include <stdlib.h>
#include <string.h>
#endif


void sliding_average_filter_init(SlidAveFilterObj *filter, int w_size)
{
    #ifdef SLIDING_AVERAGE_FILTER_USEING_STDLIB
     filter->cache = (float*)malloc(sizeof(float) * w_size);
     memset(filter->cache, 0, sizeof(float) * w_size);
    #endif
   
    filter->w_size = w_size;
    filter->sum = 0;
    filter->head = 0;
}

float sliding_average_filter(SlidAveFilterObj *filter, float k)
{
    filter->cache[filter->head] = k;
    filter->head = (filter->head + 1) % filter->w_size;
    filter->sum = filter->sum + k - filter->cache[filter->head];

    return (filter->sum / (float)filter->w_size);
}

int sliding_average_filter_cache_add(SlidAveFilterObj *filter, float *cache, int w_size)
{
    filter->cache = cache;
    filter->w_size = w_size;
    return 0;
}



使用特权

评论回复
沙发
macpherson| | 2023-4-2 16:44 | 只看该作者
滑动平均滤波器是一种基本的数字滤波器,它可以用于降低时间序列中的高频噪声。

使用特权

评论回复
板凳
adolphcocker| | 2023-4-2 17:49 | 只看该作者
可以使用加权平均值或者指数加权平均值等其他的滤波方法。

使用特权

评论回复
地板
maqianqu| | 2023-4-2 19:20 | 只看该作者
基本思想是在输入信号上取一段时间窗口,然后计算这个时间窗口内数据的平均值作为输出值。在每个时刻,移动窗口向前移动一个时间步长,然后再次计算平均值。

使用特权

评论回复
5
elsaflower| | 2023-4-2 19:36 | 只看该作者
使用的是简单平均值作为滤波器的输出

使用特权

评论回复
6
primojones| | 2023-4-2 20:05 | 只看该作者
滑动平均滤波器是一种简单的数字滤波器,用于将噪声信号平滑化。

使用特权

评论回复
7
ulystronglll| | 2023-4-2 20:37 | 只看该作者
非常适用于实时应用,如传感器数据的滤波。

使用特权

评论回复
8
lzbf| | 2023-4-2 21:09 | 只看该作者
使用C语言实现滑动平均滤波器的示例代码

使用特权

评论回复
9
SantaBunny| | 2023-4-3 20:52 | 只看该作者
滑动平均滤波器用于将噪声信号平滑化。

使用特权

评论回复
10
中国龙芯CDX| | 2023-4-4 16:21 | 只看该作者
滑动平均滤波器是一种常用的数字滤波器,它可以有效地抑制噪声,平滑输入信号的变化,从而提高信号的信噪比

使用特权

评论回复
11
Stahan| | 2023-4-4 23:13 | 只看该作者
均值滤波,挺常见的

使用特权

评论回复
12
spark周| | 2023-7-6 20:07 | 只看该作者
滑动平均滤波器是一种基本的数字滤波器,它可以用于降低时间序列中的高频噪声。

使用特权

评论回复
13
liliang9554| | 2023-7-6 20:08 | 只看该作者
可以使用加权平均值或者指数加权平均值等其他的滤波方法。

使用特权

评论回复
14
午夜粪车| | 2023-7-6 20:10 | 只看该作者
基本思想是在输入信号上取一段时间窗口,然后计算这个时间窗口内数据的平均值作为输出值

使用特权

评论回复
15
zhaoxqi| | 2023-7-6 20:11 | 只看该作者
在每个时刻,移动窗口向前移动一个时间步长,然后再次计算平均值。

使用特权

评论回复
16
gongche| | 2023-7-6 20:14 | 只看该作者
使用的是简单平均值作为滤波器的输出

使用特权

评论回复
17
huwr| | 2023-7-6 20:15 | 只看该作者
滑动平均滤波器是一种简单的数字滤波器,用于将噪声信号平滑化。

使用特权

评论回复
18
huwr| | 2023-7-6 20:16 | 只看该作者
非常适用于实时应用,如传感器数据的滤波。

使用特权

评论回复
19
huanghuac| | 2023-7-6 20:18 | 只看该作者
使用C语言实现滑动平均滤波器的示例代码

使用特权

评论回复
20
happy_10| | 2023-7-6 20:19 | 只看该作者
滑动平均滤波器用于将噪声信号平滑化。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

8107

帖子

15

粉丝