STUDY/전공2008/07/22 04:27

malloc 을 이용하여 동적 메모리 할당이 가능.

동적으로 할당한 메모리를 다시 동적으로 추가 하고 싶을경우에는 어떻게해야하는가

realloc 이라는 함수를 이용하면 할당된 메모리의 포인터주소로부터 새로 계산된 size 만큼

영역을 재할당 하면서 이전의 값들을 유지해준다.

동적으로 사이즈가 커지는 버퍼나 캐쉬를 만들때 사용하면 유용하다.

 if ( cache == NULL)
      cache = (TupleCache)malloc(dupleCacheSize * sizeof(Tuple));
   else      
     cache = realloc( cache , newDupleCacheSize * sizeof(Tuple) );
주의할점은 realloc 을 통해서 할당된 영역에 대한 포인터 주소를 반드시 갱신해야한다.

cache = realloc (...) 대신 realloc (... ) 을 사용하게 되면 할당된 메모리 영역의 주소가 변경되는 순간

프로그램에서 Segmentation Fault 를 볼수 있다.
Posted by 영고니짱
STUDY/전공2006/08/17 22:41
32-bit 이상의 데이터를 다루게 될때 당신은 시스템에서 제공하는 long long keyword만 쓸 것인가?

만약 128-bit 연산을 해야한다면? 2048-bit 혹은 그 이상의 bit 를 가진 연산을 해야한다면?

CPU 는 어떻게 long word arithmetic 을 어떤식으로 하는지 알기위해 Assembly Language 를 배운다.

Assem 명령어로 짜야하는 과정을 일단 c-model 로 data를 검증하기 위해 구현했다.

근데 어찌된게 C로 짜는게 더 어려운거 같아 ㅠㅠ

가장 중요한 KEY-point 는

data type 이 가진 고유크기를 벗어나는 overflow 처리이다. 이것때문에 binary 연산을 -_- 몇번을 계속 해봤는지....아..머리 나쁘면 고생~

unsigned 로 작업을 했기 때문에, signed 에 적용이 되는지는 확인해보지 않았지만, 대수를 이용해서 검증해보면 알수 있겠지.

핵심은 이거다.
overflow 가 발생한다면
  a + b = ~ ( ~a  + ~b + 1); 이렇게 하고 carry = 1 이 된다.
overflow 가 발생하지 않을때 위의 연산은 오히려 carry 가 발생해버려서 overflow 를 만든다.

값을 넣어서 해보면 확인할 수 있다.

소스가 궁금한 사람은 개인적으로 연락을 바랍니다.

사정상 소스를 공개할 수 없습니다.
Posted by 영고니짱
STUDY/전공2006/03/27 14:17

음성파일 Down Sampling 구현

아...도저히 LPF 를 못만들겠다..맞게 한거 같은데 소리가 왜 다 깨지는지 ㅠㅠ

H[] 가 이상하게 나와...Sinc Function 도대체 어케 만들어 ㅠㅠ;

안습..ㅠㅠ

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

}



'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
Posted by 영고니짱