#直接上代码
#include <stdio.h>
#include <malloc.h>
typedef unsigned int uint32_t;
//uint32_t _filterArr[5];
uint32_t SlidingFilter (uint32_t num,uint32_t data){ //num=number of sliding boxes , data =new data will input in boxes
static uint32_t num_record=0;
static uint32_t* filterArr;
float result=0;
uint32_t zeroNum=0;
if(num==0) return data; //without filting if input error parament
if(num_record==0)//code for first run
{
filterArr = (uint32_t*)calloc(num , sizeof(uint32_t));
num_record=num;
}
if(num_record!=num)//if num changed
{
filterArr = (uint32_t*)realloc(filterArr , num*sizeof(uint32_t)); //attention for the random value
if (num>num_record){
for (uint32_t i=num_record;i<num;i++)
{
*(filterArr+i)=0; //reset the new byte that realloc takes
}
}
num_record=num;//renew the num_record
}
for (int i=num-1;i>0;i--) //sliding start
{
*(filterArr+i)=*(filterArr+i-1);
}
*filterArr=data;//new data
for (int i=0;i<num;i++)
{
printf("filterArr[%d] = %d \n",i, *(filterArr+i));
}
for (int i=0;i<num;i++)
{
result += *(filterArr+i);//calculate sum
//printf("filterArr[%d] = %d \n",i, *(filterArr+i));
if(*(filterArr+i)==0)
{
zeroNum++; //get the number of zero elements in the arr
}
}
//calculate the average
result/=(num-zeroNum);//floor division without rounting
return result;
}
int main(void) {
int arr[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
uint32_t Numb=5;
for(int i=0;i<15;i++){
printf("result = %d \n", SlidingFilter(Numb,*(arr+i)));
}
Numb=8;
for(int i=0;i<15;i++){
printf("result = %d \n", SlidingFilter(Numb,*(arr+i)));
}
return 0;
}
输入:参与滑动平均滤波的元素个数,最新的一个需要参与滑动平均滤波的数据
输出:最新计算出的滑动滤波值
利用分配堆内存空间的办法存储历史数据,再利用历史数据求最新的滑动滤波值。
在更改 参与滑动平均滤波的元素个数 时候利用动态内存分配的办法。
平均值直接地板除了没四舍五入。