Written by coh at home
c언어 data filter 만들기 본문
우선 반쪽짜리 성공임을 먼저 밝힌다.
예외처리를 잘못 했기 때문.
input data의 양끝은 포함 안 하는 data가 있음에도 불구하고 같은 filtersize로 나눠서 반환해 버렸음.
해결책으론 변수 하나 선언 후 loop에 따라 증감 시키고 증감된 값 만큼 나눠주면 됨.
//lib
#include "Header.h"
#include<stdio.h>
#include<math.h>
#include<time.h>
#define PI (3.14)
#define LOOP_I(len) for(int i=0;i<len;i++)
#define MAX(a,b) (a>b?a:b)
#define MIN(a,b) (a>b? b:a)
int smoothingfilter(int data[], int datalen, int index, int filtersize)
{
if (filtersize % 2 != 0) filtersize += 1;
// i = 0인 basecase
int sum = *(data + index);
for (int i = 1; i < filtersize / 2; i++)
{
if (index + i < datalen)
sum += *(data + index + i);
if (index - i > 0)
sum += *(data + index - i);
}
//return average.
return sum / filtersize;
}
int inversionfilter(int _input)
{
return -_input;
}
void gensinedata(int* _data, int _len, int _max)
{
LOOP_I(_len)
_data[i] = sin((i * PI * 10) / 100.0) * _max;
}
void gendata(int* _data, int _len, int _max)
{
gensinedata(_data, _len, _max);
//add noise
srand(time(NULL));
LOOP_I(_len)
{
int noise = rand() % _max;
noise = (rand() % 2 == 0 ? noise : -noise);
if (noise > 0)
_data[i] += noise;
_data[i] = MAX(_data[i], -(_max));
_data[i] = MIN(_data[i], (_max));
}
}
void printfgraph(int* _data, int _len, int _max)
{
for (int height = 0; height < (_max + 1)*2; height++)
{
for (int i = 0; i < _len; i++)
_data[i] == (height - _max) ? printf("*") : printf(" ");
printf("\n");
}
}
//header
#pragma once
#define DATA_MAX 5
#define DATA_MIN (-DATA_MAX)
int smoothingfilter(int data[], int datalen, int index, int filterSize);
int inversionfilter(int _input);
void gensinedata(int* _data, int _len, int _max);
void gendata(int* _data, int _len, int _max);
void printfgraph(int* _data, int _len, int _max);
#include<stdio.h>
#include"Header.h"
#define DATA_LENGTH 100
#define FS 5
int main()
{
int inputdata[DATA_LENGTH] = { 0 };
gendata(inputdata, DATA_LENGTH, DATA_MAX);
int outputdata[DATA_LENGTH] = { 0 };
printf("***Input DATA****\n");
printfgraph(inputdata, DATA_LENGTH, DATA_MAX);
for (int i = 0; i < DATA_LENGTH; i++)
{
int a = smoothingfilter(inputdata, DATA_LENGTH, i, FS);
int b = inversionfilter(a);
*(outputdata + i) = b;
}//Apply filter here
//Caution : you should not make another array for this program
printf("\n\n**** output data ****\n");
printfgraph(outputdata, DATA_LENGTH, DATA_MAX);
return 0;
}