#include <stdio.h>
//#include <stdlib.h>
#include <math.h>
#define BUFF_SIZE 10
#define INPUT_SIZE 21
#define SAMPLING 2
void push_value(float data , float *arr) // 입력 신호를 하나씩 배열에 저장한다.
{
int i;
for ( i = 20 ; i > 0 ; i--)
{
arr[i] = arr[i-1];
}
arr[0] = data;
}
float lpf (float *in , float *h) // low pass filter 를 통과시킨다.
{
int i;
float tmp;
tmp = in[10]*h[0]; // 가운데에 있는 값이 입력 값이다.
for ( i = 1 ; i <10 ; i++) // sinc 펑션과 convolution 시킨다.
{
tmp += ( in[10+i] + in[10-i] ) * h[i];
}
return tmp;
}
int main ()
{
FILE *fi,*fo;
float input,output;
const double PI = 3.14; // PI
int f = 8000; // maximum frequency
short data;
int i=0,total=0,n=0;
float h[BUFF_SIZE] = {0,};
float buffer[INPUT_SIZE] = {0,};
/** File OPEN **/
fi = fopen("input32.raw", "rb");
fo = fopen("output16_lpf.raw","wb");
//LPF Frequency Response init
for ( i = 0 ; i < BUFF_SIZE ; i++)
{
h[i] = (float)(sin(2*PI*f*i)/PI*i);
}
// read raw sound
while( fread(&data, 2, 1, fi) )
{
input = (float)data;
// push to array
push_value(input,buffer);
if (total > 10) // 초기 10개의 샘플은 무시
{
if (n%SAMPLING == 0) // 2배 sampling
{
output = lpf(buffer,h); // low pass filter
//printf ("%d output = %f \n",n,output);
data = (short)output;
fwrite(&data, 2, 1, fo); // write new data
}
n++;
}
total++;
}
n = 0;
while (n <10) // 10개 샘플이 더 나와야 하므로
{
if (n%SAMPLING == 0) // 2배 sampling
{
output = lpf(buffer,h); // low pass filter
//printf ("%d output = %f \n",n,output);
data = (short)output;
fwrite(&data, 2, 1, fo); // write new data
}
n++;
}
fcloseall();
return 0;
}