2022년 10월 3일 월요일

고속 푸리에 변환(FFT: Fast Fourier Transform)

[경고] 아래 글을 읽지 않고 "고속 푸리에 변환"을 보면 바보로 느껴질 수 있습니다.


[고속 푸리에 변환의 쉬운 이해]

통신 이론과 신호 처리에 필수적인 고속 푸리에 변환(fast Fourier transform, FFT)이산 푸리에 변환(discrete Fourier transform, DFT)의 항들을 우함수(even function)기함수(odd function)로 모아서 급수를 빠르게 계산하기 위한 혁신적인 알고리즘이다[1], [2]. FFT는 1805년가우스 28세, 조선 순조 시절 무렵에 가우스Carl Friedrich Gauss(1777–1855)가 먼저 고안해 사용했다는 전설을 가지고 있다.[푸리에 교수가 푸리에 급수(Fourier series)를 공개한 시점이 1807년이다.] 현대적인 FFT는 뼈대 있는 수학자 룽에Carl Runge(1856–1927)의 1903년룽에 47세, 대한제국 시절 기여를 거쳐 미국 수학자 쿨리James Cooley(1926–2016)와 투키John Tukey(1915–2000)가 1965년쿨리 39세, 박정희 정부 시절에 재발견했다[3]. 쿨리와 투키가 FFT를 구현한 방법론은 쿨리–투키 알고리즘(Cooley–Tukey algorithm)으로 부른다. 이 알고리즘의 유도는 기존 DFT에 대한 관찰로부터 시작한다.

                  (1)

여기서 $M$은 표본 개수, $f_m$은 시계열(time sequence), $F_k$는 푸리에 계수(Fourier coefficient)이다. DFT의 모든 항을 항상 이등분할 수 있도록, FFT에서는 보통 $M$을 2의 거듭제곱인 $M$ = $2^N$으로 가정한다. 여기서 $N$은 1이상의 자연수이다. 먼저 식 (1)에서 복소 지수 함수를 $W_M$으로 치환해서 멱급수(power series) 형태로 다시 쓴다.

                  (2)

복소 지수 함수 $W_M$의 거듭제곱은 다음 성질을 가진다.

                  (3a)

                  (3b)

그 다음에 식 (2)를 이등분해서 DFT 항을 $W_M^k$에 대한 우함수와 기함수인 부분으로 나눈다.

                  (4)

                  (5)

여기서 $k$ = $0, 1, \cdots, M/2-1$, 원래 DFT 급수를 1번 분해한 $E_1(x)$와 $O_1(x)$는 각각 짝수 및 홀수 밑수를 가진 $f_k$만을 모은 다항식이다. 그러면 식 (3a)의 둘째식을 이용해서 $F_{k+M/2}$를 다시 쓸 수 있다.

                  (6)

여기서 $W_M^{k+M/2}$ = $-W_M^k$이다. 그러면 식 (6)을 다시 계산할 필요없이, 식 (4)에서 구한 $E_1(\cdot)$과 $O_1(\cdot)$의 결과값에서 부호만 ($+$)에서 ($-$)로 바꾸면 된다. 즉, DFT 급수를 우함수와 기함수로 분해함으로써 계산 속도를 2배만큼 증가시킬 수 있다. 이 방식을 염두에 두고 식 (4)를 새롭게 보면, $E_1(x)$와 $O_1(x)$는 항의 개수가 반[= $M/2$]만큼 줄어든 또 다른 DFT 급수이다. 그래서 재귀적인 방법으로 식 (5)를 다시 우함수와 기함수 관련 다항식으로 모아서 계속 연산을 가속화시킨다. 이와 같은 기법이 바로 쿨리–투키 알고리즘의 핵심이. 예를 들어, 재귀 관계에서 $E_1(\cdot)$과 $O_1(\cdot)$은 다음 다항식으로 재분해된다.

                  (7a)

                  (7b)

                  (8a)

                  (8b)

여기서 $k$ = $0, 1, \cdots, M/4-1$이다.
좀더 쉽게 쿨리–투키 알고리즘을 이해하기 위해, 예시적으로 $M$ = $2^1$인 경우부터 출발해 식 (4)를 다시 기술한다.

                  (9)

표본 크기 $M$이 2인 FFT 결과를 가시화하려 나비 모양처럼 생긴 도표를 [그림 1]처럼 도입한다.

[그림 1] 기본 $2 \times 2$ 나비 도표(사진 출처: wikipedia.org)

[그림 2] 변형 $2 \times 2$ 나비 도표

[그림 1]은 나비를 닮아서 나비 도표(butterfly diagram)라고 명한다. 기본 나비 도표의 $f_1$에 $W$를 곱한 변형은 [그림 2]처럼 화살표를 하나 추가해서 그린다. 표본 크기를 더 증가시킨 $M$ = $4$인 경우도 식 (4)를 바탕으로 우함수와 기함수를 분리한다.

                  (10)

[그림 3] $4 \times 4$ 나비 도표

식 (10)을 나비 도표로 나타낸 결과인 [그림 3]은 약간 복잡하지만 명확한 규칙이 보인다. 시계열 $f_k$를 시작할 때, $k$를 이진수로 나타내어 비트를 역전시킨다. 이 과정은 FFT의 비트 역전(bit reversal)이라 이름 붙인다. 그러면 [그림 3]의 입력은 0, 2, 1, 3의 순서로 들어간다. 그 다음에 [그림 1]처럼 $M$ = $2$에 대한 FFT를 각각 수행하고, 이 결과를 모아서 각 화살표에 대해 $M$ = $4$에 대한 FFT 연산을 다시 적용한다. 식 (4)와 (7)은 비트 역전이 필요한 이유를 잘 보여주고 있다. 우리가 홀짝을 나눈 다음에 표본 개수 $M$과 지수 $k$를 1/2하고, 우함수와 기함수 관련 다항식을 각각 홀짝으로 다시 분류한다. 지수 $k$를 줄이는 단계는 2의 거듭제곱으로 나누면서 계속 반복된다. 최종적으로 항이 2개만 남으면 멈춘 후, 나비 도표인 [그림 1]을 이용해 계산한다. 시계열 $f_k$의 $k$가 줄어서 마지막에 선택된 두 항[그림 1에서 0과 1로 표기]은 $k$를 이진수로 표시할 때 최상위 비트(most significant bit, MSB)가 0이나 1인 경우이다. [그림 1]을 포함한 [그림 3]에서 나비 도표의 둘째 단계는 MSB의 그 다음 비트가 0이나 1을 가진 $k$를 처리한다. 따라서 FFT에서는 [그림 3]처럼 비트 역전을 통해서 입력 시계열 $f_k$를 두 개씩 모아야 한다.

[그림 4] $8 \times 8$ 나비 도표

[그림 4]는 [그림 3]을 2개 나열해서 $8 \times 8$ 나비 도표를 구현한 결과를 보여준다. 시계열 $f_k$의 $k$는 비트 역전을 통해서 결정한다. 입력이 8개라서 우함수와 기함수 부분인 다항식 $E_1(\cdot)$과 $O_1(\cdot)$은 각각 4개의 표본을 가지고 있다. 식 (4)를 사용해서 유도한 $M$ = $8$인 FFT 관계식은 다음과 같다.

                  (11)

여기서 $k$ = $0, 1, 2, 3$, $E_1(\cdot)$과 $O_1(\cdot)$은 [그림 3]으로 계산한다.
표본 개수가 $M$ = $2^N$이 아니더라도 [1]을 참고해서 FFT를 수행할 수 있다. 하지만 $M$이 2의 거듭제곱이 아니면 홀짝 모으기가 번거로워진다. 만약 표본이 작아서 $M$ < $2^N$이면, $M$을 증가시켜 강제로 $M$ = $2^N$을 만들고 모르는 $f_k$는 $0$으로 채워서 FFT를 돌린다. 이런 부가적인 과정은 FFT의 영 채우기(zero padding)로 이름 붙인다.
FFT의 기본 알고리즘은 간단해서 우리가 쉽게 프로그램화할 수 있다. 그런데 많은 자료를 진짜 빠르게 처리하려면 전문적인 FFT 함수 집합 혹은 라이브러리(library)를 써야 한다. 우리가 쉽게 구할 수 있는 상용 FFT 라이브러리 중에 FFTW(FFT in the West)가 있다[4]. FFTW는 MATLAB에도 쓰일 정도로 잘 검증된 연산을 제공한다. 다만 FFTW는 비상업적인 용도로 쓸 때에만 무료로 이용할 수 있다.

[참고문헌]
[1] J. W. Cooley and J. W. Tukey, "An algorithm for the machine calculation of complex Fourier series," Math. Comput., vol. 19, no. 90, pp. 297–301, Apr. 1965.
[2] E. O. Brigham and R. E. Morrow, "The fast Fourier transform," IEEE Spectr., vol. 4, no. 12, pp. 63–70, Dec. 1967.
[3] M. T. Heideman, D. H. Johnson, and C. S. Burrus, "Gauss and the history of the fast Fourier transform," IEEE ASSP Mag., vol. 1, no. 4, pp. 14–21, Oct. 1984.
[4] M. Frigo and S. G. Johnson, "C Subroutine Library for Computing the DFT," FFTW 3.3.10, 2022. (방문일 2022-10-04)

2022년 10월 2일 일요일

프레넬 적분(Fresnel Integral)

[경고] 아래 글을 읽지 않고 "프레넬 적분"을 보면 바보로 느껴질 수 있습니다.


[그림 1] 프레넬 사인 및 코사인 적분(출처: wikipedia.org)

장애물에 의한 전자파 회절(回折, diffraction)이나 프레넬 영역(Fresnel region)에서 전자파 복사를 다룰 때에 필연적으로 등장하는 특수 함수가 프레넬 적분(Fresnel integral) $F(x)$이다.

                  (1)

프레넬 적분의 실수부와 허수부는 각각 프레넬 코사인 적분(Fresnel cosine integral) $C(x)$ 및 프레넬 사인 적분(Fresnel sine integral) $S(x)$로 부른다.

                  (2)

                  (3)

식 (1)–(3)에 나온 프레넬 적분의 정의는 입력 변수(argument)를 $t^2$ 대신 $\pi t^2 / 2$를 선택하므로, 입력 변수가 $t^2$인 통상적인 정의와 구별하기 위해 식 (1)–(3)을 정규화 프레넬 적분(normalized Fresnel integral)으로 명하기도 한다. 변수 치환을 통해 프레넬 적분은 유명한 오차 함수(error function) $\operatorname{erf}(x)$로 표현 가능하다. 

                  (4a)

                  (4b)

오차 함수 $\operatorname{erf}(\cdot)$의 입력 변수가 무한대로 가면 오차 함수는 1에 수렴하므로, $x$가 무한대로 갈 때에 $F(x)$는 다음 값에 수렴한다.

                  (5)

[그림 1]도 $x$가 커질 때, $C(x)$와 $S(x)$가 0.5에 수렴하는 모습을 점근적으로 보여준다. 식 (1)의 마지막식을 써서 $C(x)$와 $S(x)$도 $\operatorname{erf}(\cdot)$로 공식화한다.

                  (6)

                  (7)

회절 이론에서는 프레넬 적분과 상보적인 적분 구간을 선택하기도 한다. 그래서 $x$에서 무한대로 가는 적분 구간을 가진 상보 프레넬 적분(complementary Fresnel integral)을 $F_c(x)$로 표기한다.

                  (8)

식 (8)에 바탕을 두고 적분 변수를 조금 바꾼 다음 적분을 상보 프레넬 적분 $F_c(x)$로 쉽게 변환할 수 있다.

                  (9)

입력 변수 $x$가 작을 때는 프레넬 적분을 테일러 급수로 전개해서 적분한 후 계산한다.

             (10)

수학적으로 식 (10)의 무한 급수는 $x$에 관계없이 항상 수렴한다. 하지만 실제 계산에서는 $x$가 증가하면 거듭제곱이 함께 커지기 때문에, 고정된 계산 정밀도로 인한 절단 오차(truncation error)가 우세하여 결과값이 심하게 불안정해진다. 이를 피하려면 급수 전개를 $x$가 아닌 $1/x$에 대해서 하든지, 혹은 임의 정밀도 산술(arbitrary precision arithmetic)을 이용해 식 (10)을 더해야 한다. 임의 정밀도 산술을 적용한 수치 해석 도구로는 Arb[3]가 있다.


   1. 기본(basics)   

[기본 관계식]

                         (1.1)

[증명]
입력 변수 $x$는 적분 구간에 들어가므로 식 (1.1)이 그대로 성립한다.
______________________________

식 (1.1)에 의해 모든 프레넬 적분은 기함수(odd function)이다.


   2. 급수 표현식(series representation)   

                         (2.1)

[증명]
식 (10)을 정리해서 식 (2.1)을 각각 얻는다.
______________________________

급수 표현식을 보면 $x$ = $0$ 근처에서 $C(x) \approx x$, $S(x) \approx (\pi/6) x^3$처럼 변한다. 이러한 성질은 식 (3.1a)에 고스란히 나타난다.


   3. 특정값(specific value)과 극한(limit)   

                  (3.1a)

                  (3.1b)

[증명]
식 (3.1a)는 프레넬 적분의 정의에 값을 넣거나 미분해서 증명한다. 오차 함수를 이용한 식 (5)는 식 (3.1b)를 의미한다. 
______________________________

프레넬 코사인 적분 $C(x)$는 0에서 시작하지만 $x$ = $0$ 근처에서 기울기가 1이라서 매우 빠르게 값이 증가한다. 식 (3.1b)처럼 정규화 프레넬 적분은 $x$가 무한대로 갈 때 점근값이 매우 간단한 $1/2$이다.


   4. 부정적분(indefinite integral)   

[삼각 함수]

                         (4.1a)

                         (4.1b)

여기서 $C$는 적분 상수이다.

[증명]
변수 치환 $ax^2$ = $(\pi/2)(cx)^2$을 만족하도록 $c$ = $\sqrt{(2a) \mathbin{/} \pi}$로 놓고 적분을 정리한다.
______________________________

식 (4.1)에서 $a$ = $1$, $b$ = $0$으로 둔 경우가 입력 변수가 $x^2$인 통상적인 프레넬 적분이다.


[참고문헌]
[1] C. W. Martz, Tables of the Complex Fresnel Integral, National Aeronautics and Space Administration (NASA), USA, 1964.
[2] M. T. Abuelma'atti, "An improved approximation to the Fresnel integral," IEEE Trans. Antennas Propag., vol. 37, no. 7, pp. 946–947, Jul. 1989.
[3] F. Johansson, "Arb - a C library for arbitrary-precision ball arithmetic," Arb 2.23.0 Documentation, 2022. (방문일 2022-10-02)

2022년 9월 26일 월요일

다양한 전자장 표현식(Various Electromagnetic Field Representations)

[경고] 아래 글을 읽지 않고 "다양한 전자장 표현식"을 보면 바보로 느껴질 수 있습니다.

[확인] 본 페이지는 exp(-iωt) 시간 약속을 사용하고 있습니다.


실제로 전자장 문제를 풀 때는 각 좌표계에 대한 다양한 전자장 표현식이 필요하다. 현존하는 여러 경우에 대한 전자장 공식을 아래에 상세하게 소개한다.
  • TE파(횡전기 혹은 가로 전기 파동, transverse electric wave): 기준축에 수직한 평면상에만 전기장이 있고 평행한 방향에는 전기장이 없음
  • TM파(횡자기 혹은 가로 자기 파동, transverse magnetic wave): TE파와는 정반대로 기준축에 평행한 자기장은 없고 자기장은 오직 기준축의 단면에만 존재
  • TEM파(횡전자기 혹은 가로 전자기 파동, transverse electromagnetic wave): TE파와 TM파가 합쳐진 개념으로서 기준축에 평행한 방향에는 전자장이 모두 없고, 수직한 방향에만 전자장이 있음; 전송선에 존재하는 기본 파동

   1. 벡터 포텐셜(vector potential)   

[데카르트 좌표계: $z$방향]


여기서 $k$ = $\omega \sqrt{\mu \epsilon}$이다.

[데카르트 좌표계: $x$방향]


[데카르트 좌표계: $y$방향]


[원통 좌표계: $z$방향]


만약 $\partial / \partial \phi$ = $\partial / \partial z$ = $0$이라면, TE파와 TM파가 완전히 분리되어서 편하게 따로 계산하면 된다.



[원통 좌표계: $\phi$방향]


[구 좌표계: $r$방향]


여기서 $(\nabla^2 + k^2)(A_r / r)$ = $0$, $(\nabla^2 + k^2)(F_r / r)$ = $0$이다. 방위각 $\phi$방향의 변화가 없는 조건에서는 TE파와 TM파가 철저하게 떨어진다.


   2. 전자기장(electromagnetic field)   

[데카르트 좌표계: $z$방향]




여기서 $\nabla_{uv}^2$ = $\frac{\partial^2}{\partial u^2} + \frac{\partial^2}{\partial v^2}$이다.


   3. TEM파(transverse electromagnetic wave)   

[데카르트 좌표계: $z$방향]


여기서 $\eta$ = $\sqrt{\mu / \epsilon}$이다.

[원통 좌표계: $z$방향]



[다음 읽을거리]