滑动平均滤波器在工程中十分常见,这里用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;
- }
|