푸리에 변환(Fourier Transform)이란, 해당 함수를 각각의 파장(혹은 주파수) 성분으로 분해하는 작업이고, 역변환은 모든 파장 또는 주파수 성분을 조합하여 실제 함수로 재생성하는 과정이라고 이해하시면 됩니다. 그러나, 이러한 변환을 위해서는 sin 및 cos 함수를 곱하여 함수 구간 전체에 대해 적분을 실시해야 합니다. 문제는 1개 파장 또는 주파수 성분에 대해 1번의 적분이 이루어져야하고, 모든 파장 또는 주파수에 대해 계산을 하기 위해서는 데이터수의 제곱에 비례하는 연산을 필요로 합니다.
연산 횟수를 줄이기 위해 다양한 알고리즘에 제안되었고, Cooley-Tukey 알고리즘이 대표적인 FFT 알고리즘입니다. Cooley-Tukey 알고리즘은 데이터수 N이라고 할 때, 연산 시간이 N log(N)으로 감소하기 때문에 FFT 필터에 많이 응용되고 있으며, 공개된 소스코드도 많이 있습니다. 만약, 1만개의 데이터가 포함되어있다면, 푸리에 변환을 위해 1억회의 연산이 필요하다면, FFT 변환은 약 4만회의 연산이면 끝나기 때문에 속도 측면에서 대략 2500배 차이가 나며, 데이터 갯수가 증가할수록 알고리즘에 따른 계산 속도 차이가 더욱 가중됩니다. (이전에 소개드린 정렬 알고리즘과 유사한...)
FFT(Fast Fourier Transform)은 과학/공학분야에서 매우 다양하게 활용되는 변환 중 하나입니다. 예를 들어, 전자 신호에서 불필요한 노이즈를 제거하거나, 사진 데이터를 흐리게 하거나 혹은 사진 내 경계선을 찾아내는 필터도 FFT 필터를 사용합니다. 재료학에서는 조도(거칠기, Roughness)를 계산하기 위해 형상 factor와 노이즈를 제거하는 용도로도 FFT 필터를 사용합니다. 뿐만 아니라, 앞서 설명드렸던 Savitzky-Golay filter와 같이 노이즈를 포함하는 데이터를 smoothing 하기 위한 filter로도 사용할 수 있습니다.
FFT filter가 이렇게 다양한 응용분야를 가졌음에도 불구하고, 데이터 수가 증가할수록 계산량이 급격하게 증가하기 때문에 프로그래밍에 능숙하지 않은 분들이 이러한 필터를 쉽게 구현하기가 쉽지 않습니다.
그런데, 공개된 소스 코드들의 대부분은 데이터 갯수가 제한적인 문제가 있습니다. 즉 데이터 갯수가 2^n 개인 경우에 대해서만 계산이 가능하고, 임의의 데이터 갯수를 갖는 경우에 대해서는 코드를 구하기가 쉽지 않더군요. 아래 링크에 데이터 갯수에 상관없이 엑셀에서 FFT 계산이 가능한 소스 코드 하나를 찾아 올려두었습니다.
사실 몇년 전에 구글 검색 중 찾았던 것인데.. 어디서 받았었는지 원본 링크를 잊어버렸네요. 어쨋거나, 위의 링크를 클릭하면 bas 파일을 받을 수 있습니다. 엑셀의 vb 에디터에서 파일 불러오기를 이용하여 다운로드받은 모듈을 삽입한 후, 매크로를 생성하면 됩니다.
위의 모듈에는 FFT를 위한 함수(function)만 포함되어 있습니다. 실행을 위한 Sub 프로시저는 포함되어있지 않으며, 매크로 실행 창을 열더라도 어떠한 실행 매크로도 생성되지 않습니다. 따라서, 필터링을 위한 매크로는 직접 생성해야합니다.
다음 글에서부터는 위의 모듈을 이용하여, FFT 변환/역변환 및 Gaussian 필터를 적용하는 매크로를 작성하도록 하겠습니다.
댓글 없음:
댓글 쓰기
의견이나 질문이 있으신 분은 언제든지 댓글을 달아주세요~