目录
为什么要写这篇
仍记得当初写了一篇去除极值的均值滤波算法相关的博客,该算法用在了ADC采样上面。当初偶然看见还有一种递推均值滤波算法,用在了实时波形输出上面。没有代码实现,本着早晚会用到以及要使用抽象数据类型队列的想法,开始了这篇博客的筹划。
递推均值滤波算法实现方式不见得只有一种方式。环形队列 或 链式队列,先实现自认为比较难一点儿的,之后再有时间则实现相对容易点的。
后期补充:今天我看到了最简单可行的递推均值滤波算法,简单到一目了然,比链式队列更常用。
为什么要用队列实现
主要因为递推这两个字吧,前面的要出去,后面的要进来,然后就自然而然想到了队列的出队和入队。
程序是怎么实现的
- 假设已经有了队列的数据类型以及常用的操作,可以直接调用。
- 先初始化队列,不知道队列初始化是为什么,总知道指针初始化是为什么吧,队列的实现需要指针。
- 然后判断队列是否为满,队列有设置项数最大值,均值滤波的实现需要几个数做均值就设置项数最大值为多少,若没有最大值限制,既极大占用空间,也不适合队列遍历。
- 产生随机数存放到队列中。
- 如果队列为满了,这才是需要的,先从队列中删除一项,然后再将随机数存放到队列中。
- 调试需要:查看产生的随机数。
- 在一个合适的时间,遍历队列,获取平均值。
- 调试需要:遍历队列,逐项输出。
- 程序结束前清空队列。
程序实现结果
程序代码
test_q.c 文件
#include <stdio.h> /* 调用printf 函数 */
#include <time.h> /* 调用time 函数 */
#include <stdlib.h> /* 调用srand rand 函数 */
#include "queue.h" /* 调用队列的数据类型以及操作函数 */
#define DEBUG_OUTPUT 1
int main(void)
{
Queue line;
Item temp;
srand((unsigned)time(NULL));
InitializeQueue(&line);
for(uint8_t i=0; i<15; i++)
{
if(!QueueIsFull(&line))