이동 평균 필터란?
->지정된 n개의 데이터만 가지고 평균을 구하는 방식
->새로운 데이터가 들어오면 가장 오래된 데이터는 버리고 n개로 평균을 구하는 방식
이번에도 굳이 구조체를 만들 필요는 없지만 구조체로 만들어보았다.
만약 평균을 구할 데이터의 갯수 n이 정해져 있지 않고 사용자가 마음대로 초기화 할 수 있다고 가정하여,
n이 정해지면 해당 갯수만큼 데이터를 담을 배열은 malloc을 사용하였다.
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int cnt;
int num;
int *data;
float preAvg;
float nowAvg;
int idx;
}mvAvg;
int init_mvAvgFilter(mvAvg *mvAvg, int num){
mvAvg->cnt=0;
mvAvg->num=num;
mvAvg->data =(int*)malloc(sizeof(int)*num);
mvAvg->preAvg=0;
mvAvg->idx=0;
}
float mvAvgFilter(mvAvg *mvAvg,int data){
if (mvAvg->cnt < mvAvg->num){
mvAvg->data[mvAvg->cnt]=data;
mvAvg->cnt++;
int i=0;
int sum=0;
for (i=0;i<mvAvg->cnt;i++){
sum+=mvAvg->data[i];
}
mvAvg->nowAvg=(float)sum/mvAvg->cnt;
mvAvg->preAvg=mvAvg->nowAvg;
return mvAvg->nowAvg;
}
mvAvg->nowAvg=(data-mvAvg->data[mvAvg->idx])/mvAvg->num+mvAvg->preAvg;
mvAvg->data[mvAvg->idx]=data;
mvAvg->idx++;
if(mvAvg->idx == mvAvg->num){
mvAvg->idx=0;
}
mvAvg->preAvg=mvAvg->nowAvg;
return mvAvg->nowAvg;
}
int main(){
mvAvg mvAvg;
init_mvAvgFilter(&mvAvg,4);
int i=0;
for (i=1;i<=10;i++){
printf("%d : %f\r\n",i,mvAvgFilter(&mvAvg,i));
}
}
잘 되는 것 같은데.. 테스트가 부족하다..
끝
'지식저장소 > C' 카테고리의 다른 글
[C] AverageFilter (평균 필터) (0) | 2022.04.28 |
---|---|
[C] Ring Buffer / 링버퍼 구현 (0) | 2022.03.29 |
[C/BOJ] 9012 괄호 - Stack이용 (0) | 2022.02.16 |
[C]구조체를 이용한 Stack 구현 (0) | 2022.02.16 |
[C/STM32] Uart로 printf 대신하기 (0) | 2022.01.14 |