커뮤니티
변환부탁드려요
2010-03-18 14:26:53
1443
글번호 28751
푸리에 프랜스폼입니다.
파형을 주파수로 표현하려고 하는데요..
수고스러우시더라도 부탁드려요^^;;
1차원 FFT를 수행하는 함수
/****************************************************/
/* function for 1 dimension Fast Fourier Transform */
/****************************************************/
fft1(float a_rl[],float a_im[],int inv)
{
int I,j,k,w,j1,j2;
int numb,lenb,timb;
float s_tbl[64],c_tbl[64];
float xr,xi,yr,yi,nrml;
float xx,deg;
xx = ((-pi)*2.0)/(float)64;
if(inv < 0) xx = -xx; /* if Inverse Fast Fourier Transform , */
/* make sine and cosine table */
for(i = 0; i < 64; i++) {
deg = (float)i*xx; s_tbl[i] = sin(deg); c_tbl[i] = cos(deg);
}
if(DC == 1)
for(i = 1; i < 64; i+=2) { a_rl[i] = -a_rl[i]; a_im[i] = -a_im[i]; }
numb = 1; lenb = 64;
/* FFT excution routine */
for(i = 0; i < 8; i++) {
lenb /= 2; timb = 0;
for(j = 0; j < numb; j++) {
w = 0;
for(k = 0; k < lenb; k++) {
j1 = timb + k ; j2 = j1 + lenb;
/* 두 개의 부분으로 나눌 때 상하의 대응하는 위치 지정 */
xr = a_rl[j1] ; xi = a_im[j1];
/* 상단의 실수, 허수 부분 계산 값을 변수에 입력 */
yr = a_rl[j2] ; yi = a_im[j2];
/* 하단의 실수, 허수 부분 계산 값을 변수에 입력 */
a_rl[j1] = xr + yr; a_im[j1] = xi + yi;
/* 상단의 실수, 허수 부분 계산 값을 배열에 입력 */
xr = xr - yr ; xi = xi - yi;
/* 하단의 실수, 허수 부분 계산 값을 배열에 입력 */
a_rl[j2] = xr*c_tbl[w] - xi*s_tbl[w];
a_im[j2] = xr*s_tbl[w] + xi*c_tbl[w];
w += numb;
}
timb += (2*lenb);
}
numb *= 2;
}
birv(a_rl); birv(a_im); /* 비트 연산 */
if(DC == 1) /* DC성분을 중앙에 쏠리게 하고 싶은 경우 */
for(i = 1; i < 64; i += 2) { a_rl[i] = -a_rl[i]; a_im[i] = -a_im[i]; }
nrml = 1.0/sqrt((float)64);
for(i = 0; i < 64; i++) { a_rl[i] *= nrml; a_im[i] *= nrml; }
}
##################
비트연산 수행 루틴
birv(float a[64])
{
int I,ii,k,bit;
static float b[64];
for(i = 0; i < 64; i++) {
for(k = 0, ii = i, bit = 0; ; bit <<=1,ii>>=1) {
bit = (ii & 1) | bit;
if(++k == 6) break;
}
b[i] = a[bit];
}
for(i = 0; i < 64; i++) a[i] = b[I]; /* 처리한 값을 다시 배열에 저장 */
}
답변 1
예스스탁 예스스탁 답변
2010-03-18 15:18:44
안녕하세요
예스스탁입니다.
올리신 식은 사용해 본적이 없는 랭귀지라
변환이 가능하지 않습니다.
이지랭귀지나 CT랭귀지로 작성된 식 정도만 변환이 가능합니다.
도움을 드리지 못해 죄송합니다.
즐거운 하루되세요
> 맑은날 님이 쓴 글입니다.
> 제목 : 변환부탁드려요
> 푸리에 프랜스폼입니다.
파형을 주파수로 표현하려고 하는데요..
수고스러우시더라도 부탁드려요^^;;
1차원 FFT를 수행하는 함수
/****************************************************/
/* function for 1 dimension Fast Fourier Transform */
/****************************************************/
fft1(float a_rl[],float a_im[],int inv)
{
int I,j,k,w,j1,j2;
int numb,lenb,timb;
float s_tbl[64],c_tbl[64];
float xr,xi,yr,yi,nrml;
float xx,deg;
xx = ((-pi)*2.0)/(float)64;
if(inv < 0) xx = -xx; /* if Inverse Fast Fourier Transform , */
/* make sine and cosine table */
for(i = 0; i < 64; i++) {
deg = (float)i*xx; s_tbl[i] = sin(deg); c_tbl[i] = cos(deg);
}
if(DC == 1)
for(i = 1; i < 64; i+=2) { a_rl[i] = -a_rl[i]; a_im[i] = -a_im[i]; }
numb = 1; lenb = 64;
/* FFT excution routine */
for(i = 0; i < 8; i++) {
lenb /= 2; timb = 0;
for(j = 0; j < numb; j++) {
w = 0;
for(k = 0; k < lenb; k++) {
j1 = timb + k ; j2 = j1 + lenb;
/* 두 개의 부분으로 나눌 때 상하의 대응하는 위치 지정 */
xr = a_rl[j1] ; xi = a_im[j1];
/* 상단의 실수, 허수 부분 계산 값을 변수에 입력 */
yr = a_rl[j2] ; yi = a_im[j2];
/* 하단의 실수, 허수 부분 계산 값을 변수에 입력 */
a_rl[j1] = xr + yr; a_im[j1] = xi + yi;
/* 상단의 실수, 허수 부분 계산 값을 배열에 입력 */
xr = xr - yr ; xi = xi - yi;
/* 하단의 실수, 허수 부분 계산 값을 배열에 입력 */
a_rl[j2] = xr*c_tbl[w] - xi*s_tbl[w];
a_im[j2] = xr*s_tbl[w] + xi*c_tbl[w];
w += numb;
}
timb += (2*lenb);
}
numb *= 2;
}
birv(a_rl); birv(a_im); /* 비트 연산 */
if(DC == 1) /* DC성분을 중앙에 쏠리게 하고 싶은 경우 */
for(i = 1; i < 64; i += 2) { a_rl[i] = -a_rl[i]; a_im[i] = -a_im[i]; }
nrml = 1.0/sqrt((float)64);
for(i = 0; i < 64; i++) { a_rl[i] *= nrml; a_im[i] *= nrml; }
}
##################
비트연산 수행 루틴
birv(float a[64])
{
int I,ii,k,bit;
static float b[64];
for(i = 0; i < 64; i++) {
for(k = 0, ii = i, bit = 0; ; bit <<=1,ii>>=1) {
bit = (ii & 1) | bit;
if(++k == 6) break;
}
b[i] = a[bit];
}
for(i = 0; i < 64; i++) a[i] = b[I]; /* 처리한 값을 다시 배열에 저장 */
}
다음글
이전글