[产品应用] 简单的滑动平均滤波器

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

代码如下:
h文件:
  1. #ifndef _SLIDING_AVERAGE_FILTER_H
  2. #define _SLIDING_AVERAGE_FILTER_H

  3. #define SLIDING_AVERAGE_FILTER_USEING_STDLIB  1

  4. typedef struct _sliding_average_filter
  5. {
  6.     int w_size;
  7.     int head;
  8.     float sum;
  9.     float *cache;
  10. } SlidAveFilterObj;

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

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

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

  14. #endif
  1. #include "sliding_average_filter.h"

  2. #ifdef SLIDING_AVERAGE_FILTER_USEING_STDLIB
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #endif


  6. void sliding_average_filter_init(SlidAveFilterObj *filter, int w_size)
  7. {
  8.     #ifdef SLIDING_AVERAGE_FILTER_USEING_STDLIB
  9.      filter->cache = (float*)malloc(sizeof(float) * w_size);
  10.      memset(filter->cache, 0, sizeof(float) * w_size);
  11.     #endif
  12.    
  13.     filter->w_size = w_size;
  14.     filter->sum = 0;
  15.     filter->head = 0;
  16. }

  17. float sliding_average_filter(SlidAveFilterObj *filter, float k)
  18. {
  19.     filter->cache[filter->head] = k;
  20.     filter->head = (filter->head + 1) % filter->w_size;
  21.     filter->sum = filter->sum + k - filter->cache[filter->head];

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

  24. int sliding_average_filter_cache_add(SlidAveFilterObj *filter, float *cache, int w_size)
  25. {
  26.     filter->cache = cache;
  27.     filter->w_size = w_size;
  28.     return 0;
  29. }




您需要登录后才可以回帖 登录 | 注册

本版积分规则

98

主题

3152

帖子

2

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