Written by coh at home

c언어 data filter 만들기 본문

languages/c

c언어 data filter 만들기

och 2022. 3. 29. 08:18

우선 반쪽짜리 성공임을 먼저 밝힌다. 

예외처리를 잘못 했기 때문. 

 

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;
}

'languages > c' 카테고리의 다른 글

보물지도 찾기.  (0) 2022.03.31
동적메모리 예제  (0) 2022.03.25
동적메모리  (0) 2022.03.24
정적 메모리 예제  (0) 2022.03.24
.c file I/O studentDB.bin  (0) 2022.03.23