FFT의 구현 17th of October, November
Today’s topic Numerical Recipes in C 의 사용법 Related issues Exercise FFT IFFT Related issues 외부 C코드의 링크방법 외부 C코드의 함수 호출 방법 Exercise Replace the DFT with the FFT in the previous exercise
DIY의 한계 제품 개발 기간 개발->평가->디버깅->평가-> ->… 기획->개발->평가->디버깅->개발->완성? 이 중 가장 많은 시간이 소요되는 부분은? 개발->평가->디버깅->평가-> ->… Programmer의 역할 과거에는 매우 대접받은 직업 현재에는 3D-업종? 인터넷의 발달에 따른 사용자 포럼의 활성화 다른 사람이 작성한 프로그램을 다운받는 것 가능 DIY가 능사는 아니다..
모의실험과 구현 알고리즘의 C-언어 구현 현재 사용되고 있는 DSP는 표준 C-코드를 거의 수용함. Matlab을 이용한 simulation과는 달리 향후 application의 개발을 염두하는 경우 최근의 embedded processor는 거의 모두 C-code를 지원함. 즉, simulation과 동시에 개발이 이루어짐 단, HW-oriented programming (e.g. VHDL) 에서는 별도의 개발과정이 이루어짐 현재 사용되고 있는 DSP는 표준 C-코드를 거의 수용함.
검증된 코드의 필요성 수많은 사용자 포럼 Google에 접속, “MPEG source code” 검색어 입력 2,360,000개의 관련 site 수 많은 source code가 범람 Commercial/non-commercial 이 중 안정적이고 오류가 없는 코드는? 오류가 많고 안정적이지 않은 코드는 오히려 개발 기간을 늘림.
Numerical Recipes in C 수치연산과 관련된 함수의 C-언어 코드 행렬연산 벡터연산 신호처리관련 연산 FFT DFT FIR filter IIR filter 기타.
행렬/벡터 연산 관련 함수들 #include <stdio.h> #include <math.h> #include <stdlib.h> #define MTX_ERROR -1 #define MTX_OK 0 void Mat_Read(double **out_mat, int col, int row, FILE *fp); void Mat_Write(double **in_mat, int col, int row, FILE *fp); void Transpose_Matrix(double **mtrx_s, double **mtrx_d, int col, int row); void Cal_Matrix_nby1(double **coef, double *in, double *out, int n); int Cal_Matrix_nbyn(double **in1, double **in2, double **out,int c1, int r1, int c2, int r2); void Input_Matrix(double **mtrx, int col, int row); void View_Matrix(double **mtrx, int col, int row); void Copy_Matrix(double **mtrx_s, double **mtrx_d, int col, int row); void View_dMatrix(double **mtrx, int col, int row); void Copy_dMatrix(double **mtrx_s, double **mtrx_d, int col, int row); double *vector(int n); double **matrix(int m, int n); double *d_vector(int n); double **d_matrix(int m, int n); void free_vector(double *v); void free_matrix(double **v, int m); void Mat_Mpy(double **x, double **y, double **z, int n); void Mat_Add(double **x, double **y, double **z, int n); void Mat_Sub(double **x, double **y, double **z, int n); void GInv_Mat(double **u, int n); void Inv_Mat(double **u, int n); void ludcmp(double **a, int n, int *indx, double *d); void lubksb(double **a, int n, int *indx, double b[]); void svdcmp(double **a, int m, int n, double *w, double **v);
DFT/FFT 관련함수들 /* dft.h - function prototypes and structures for dft and fft functions */ /* COMPLEX STRUCTURE */ typedef struct { float real, imag; } COMPLEX; /* function prototypes for dft and inverse dft functions */ extern void fft(COMPLEX *,int); extern void ifft(COMPLEX *,int); extern void dft(COMPLEX *,COMPLEX *,int); extern void idft(COMPLEX *,COMPLEX *,int); extern void rfft(float *,COMPLEX *,int); extern void ham(COMPLEX *,int); extern void han(COMPLEX *,int); extern void triang(COMPLEX *,int); extern void black(COMPLEX *,int); extern void harris(COMPLEX *,int); extern int log2(unsigned int);
Library의 생성 C-코드에서 컴파일/building을 수행하면 실행파일 (.exe)가 생성 실행 파일을 다른 project에 추가하여 사용할 수 없음 다른 project에 추가 가능한 파일들 소스파일 (*.c) 정적라이브러리 (*.lib) 동적라이브러리 (*.dll) 오브젝트코드 (*.obj)
C-코드를 직접 프로젝트에 추가 Add to project 메뉴에서 추가할 c-코드를 직접 선택
외부에서 라이브러리를 생성 C-코드를 직접 프로젝트에 넣기 위해서는 소스 코드가 필요 일반적으로 보안의 이유로 소스코드가 공개되는 경우는 드묾. 프로그램 개발자 입장에서도 소스코드의 공개를 꺼릴 수 있음 따라서, 미리 컴파일된 object code 형식의 라이브러리를 제공하고 이를 사용하는 것이 일반적.
라이브러리의 생성1 라이브러리 이름
라이브러리 생성2 미리 준비된 C-코드가 있을 때는 비워둠
라이브러리 생성3 Pre-complied header가 없으므로 아무 파일도 들어가 있지 않음.
Add to project 메뉴에서 라이브러리를 생성할 c-코드를 선택
라이브러리의 생성 오류가 없다면 .\debug 또는 ,\release 디렉토리에 해당 라이브러리 파일이 생성됨
생성된 라이브러리를 호출하는 법 Add to project 메뉴에서 링크시킬 라이브러리 파일을 선택
예제 코드 분석 복소수형식의 변수 type FFT_SIZE 만큼 복소변수 할당 실수(real) 부분에 읽어들인 값을 넣고 허수(imag) 부분엔 0을 넣음 FFT수행 (2번째 인수 주의)
Homework 이 들 함수들을 이용하여 다음 프로그램 작성 DFT.c에 포함된 각종 함수 중 DFT-IDFT loopback fft(COMPLEX *,int); ifft(COMPLEX *,int); dft(COMPLEX *,COMPLEX *,int); idft(COMPLEX *,COMPLEX *,int); 이 들 함수의 사용 법을 숙지 예제 프로그램 참고 이 들 함수들을 이용하여 다음 프로그램 작성 DFT-IDFT loopback 어떤 임의의 data sequence를 DFT하고 아무 처리도 하지 않은 채 IDFT 수행, data sequence가 동일하게 얻어지는 가를 check FFT-IFFT loopback DFT를 FFT로 바꾸어서 수행 DFT/FFT간의 소요 시간 비교