커뮤니티

변환부탁드려요

프로필 이미지
맑은날
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]; /* 처리한 값을 다시 배열에 저장 */ }