[应用相关] 简单的滑动平均滤波器

[复制链接]
 楼主| gygp 发表于 2023-3-31 14:00 | 显示全部楼层 |阅读模式
滑动平均滤波器在工程中十分常见,这里用C语言设计一个灵活的滑动滤波器库函数,十分简单易用,并且滤波器不使用for循环,大大减少了代码运行时间。
并且滤波器可以使用malloc自动申请内存,也可以不使用malloc函数,然后自己添加数据cache.
  • 滤波效果验证
在长度为10000的幅值为1的正弦波上叠加幅值为1均值为0的噪声,滑动窗口为100,效果如下:

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

  7. #ifndef _SLIDING_AVERAGE_FILTER_H
  8. #define _SLIDING_AVERAGE_FILTER_H

  9. #define SLIDING_AVERAGE_FILTER_USEING_STDLIB  1

  10. typedef struct _sliding_average_filter
  11. {
  12.     int w_size;
  13.     int head;
  14.     float sum;
  15.     float *cache;
  16. } SlidAveFilterObj;

  17. void sliding_average_filter_init(SlidAveFilterObj *filter, int w_size);

  18. float sliding_average_filter(SlidAveFilterObj *filter, float k);

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

  20. #endif

  1. /*
  2. * @Author: luoqi
  3. * @Date: 2022-03-15 10:01:18
  4. * @Last Modified by: luoqi
  5. * @Last Modified time: 2022-03-15 15:52:19
  6. */

  7. #include "sliding_average_filter.h"

  8. #ifdef SLIDING_AVERAGE_FILTER_USEING_STDLIB
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #endif


  12. void sliding_average_filter_init(SlidAveFilterObj *filter, int w_size)
  13. {
  14.     #ifdef SLIDING_AVERAGE_FILTER_USEING_STDLIB
  15.      filter->cache = (float*)malloc(sizeof(float) * w_size);
  16.      memset(filter->cache, 0, sizeof(float) * w_size);
  17.     #endif
  18.    
  19.     filter->w_size = w_size;
  20.     filter->sum = 0;
  21.     filter->head = 0;
  22. }

  23. float sliding_average_filter(SlidAveFilterObj *filter, float k)
  24. {
  25.     filter->cache[filter->head] = k;
  26.     filter->head = (filter->head + 1) % filter->w_size;
  27.     filter->sum = filter->sum + k - filter->cache[filter->head];

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

  30. int sliding_average_filter_cache_add(SlidAveFilterObj *filter, float *cache, int w_size)
  31. {
  32.     filter->cache = cache;
  33.     filter->w_size = w_size;
  34.     return 0;
  35. }



macpherson 发表于 2023-4-2 16:44 | 显示全部楼层
滑动平均滤波器是一种基本的数字滤波器,它可以用于降低时间序列中的高频噪声。
adolphcocker 发表于 2023-4-2 17:49 | 显示全部楼层
可以使用加权平均值或者指数加权平均值等其他的滤波方法。
maqianqu 发表于 2023-4-2 19:20 | 显示全部楼层
基本思想是在输入信号上取一段时间窗口,然后计算这个时间窗口内数据的平均值作为输出值。在每个时刻,移动窗口向前移动一个时间步长,然后再次计算平均值。
elsaflower 发表于 2023-4-2 19:36 | 显示全部楼层
使用的是简单平均值作为滤波器的输出
primojones 发表于 2023-4-2 20:05 | 显示全部楼层
滑动平均滤波器是一种简单的数字滤波器,用于将噪声信号平滑化。
ulystronglll 发表于 2023-4-2 20:37 | 显示全部楼层
非常适用于实时应用,如传感器数据的滤波。
lzbf 发表于 2023-4-2 21:09 | 显示全部楼层
使用C语言实现滑动平均滤波器的示例代码
SantaBunny 发表于 2023-4-3 20:52 | 显示全部楼层
滑动平均滤波器用于将噪声信号平滑化。
中国龙芯CDX 发表于 2023-4-4 16:21 | 显示全部楼层
滑动平均滤波器是一种常用的数字滤波器,它可以有效地抑制噪声,平滑输入信号的变化,从而提高信号的信噪比
Stahan 发表于 2023-4-4 23:13 | 显示全部楼层
均值滤波,挺常见的
spark周 发表于 2023-7-6 20:07 | 显示全部楼层
滑动平均滤波器是一种基本的数字滤波器,它可以用于降低时间序列中的高频噪声。
liliang9554 发表于 2023-7-6 20:08 | 显示全部楼层
可以使用加权平均值或者指数加权平均值等其他的滤波方法。
午夜粪车 发表于 2023-7-6 20:10 | 显示全部楼层
基本思想是在输入信号上取一段时间窗口,然后计算这个时间窗口内数据的平均值作为输出值
zhaoxqi 发表于 2023-7-6 20:11 | 显示全部楼层
在每个时刻,移动窗口向前移动一个时间步长,然后再次计算平均值。
gongche 发表于 2023-7-6 20:14 | 显示全部楼层
使用的是简单平均值作为滤波器的输出
huwr 发表于 2023-7-6 20:15 | 显示全部楼层
滑动平均滤波器是一种简单的数字滤波器,用于将噪声信号平滑化。
huwr 发表于 2023-7-6 20:16 | 显示全部楼层
非常适用于实时应用,如传感器数据的滤波。
huanghuac 发表于 2023-7-6 20:18 | 显示全部楼层
使用C语言实现滑动平均滤波器的示例代码
happy_10 发表于 2023-7-6 20:19 | 显示全部楼层
滑动平均滤波器用于将噪声信号平滑化。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

201

主题

8475

帖子

16

粉丝
快速回复 在线客服 返回列表 返回顶部