음성파일 Down Sampling 구현
아...도저히 LPF 를 못만들겠다..맞게 한거 같은데 소리가 왜 다 깨지는지 ㅠㅠ
H[] 가 이상하게 나와...Sinc Function 도대체 어케 만들어 ㅠㅠ;
안습..ㅠㅠ
//#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
}
}
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;
}
'STUDY > 전공' 카테고리의 다른 글
| 주파수를 이용해서 음을 발생 시키는법. (2) | 2006/04/07 |
|---|---|
| LPF 에 대한 정보 (0) | 2006/03/29 |
| 음성 신호 처리 (1) | 2006/03/27 |
| 음성의 발생 Model (1) | 2006/03/16 |
| Technical Reports Form (1) | 2006/03/04 |
| 2006학년 수강신청 계획! (1) | 2006/02/14 |
myhomework.zip