시작에 앞서 설명을 잠깐 드리면 Steve Brunton교수님은 2021년 상반기 기준 Washington University 기계공학 조교수이며 현재 Youtube에서 Steve Brunton 채널을 운용하고 계시고 저는 해당 내용이 깔끔하다고 판단하여 내용을 정리하게 되었습니다.
Fourier Analysis에 대한 강의 링크와 책은 아래 남겨두도록 하겠습니다.
Youtube 강의 링크
www.youtube.com/playlist?list=PLMrJAkhIeNNT_Xh3Oy0Y4LTj0Oxo8GqsC
책 이름 : Data-Driven Science and Engineering
부제 : Machine Learning, Dynamical Systems, and Control
저자 : Steven L. Brunton, J. Nathan Kutz
databookuw.com
오늘 다루게 되는 부분은 책의 2장 초반에 해당하는 부분이고 강의 링크 순서상 1,2,3에 해당하는 부분을 간략하게 정리할 예정입니다.
Coordinate transform은 우리의 물질계(Physical world)를 조금 더 간편하고 분석할 수 있게 하기 위한 처리 방법으로 간단하게 표현할 수 있도록 도와줍니다.
가령 책의 1장에서 설명한 SVD(Singular Value Decomposition) = Data-Driven FFT라고 합니다.
Hilber Space에 근간을 둔 Fourier Transform은 어떤 주파수가 다양한 frequency를 가진 cos, sin을 basis로 이뤄진 합으로 이해할 수 있다고 표현합니다.
해당 개념을 가지고 발전된 Fast Fourier Transform(FFT)를 통해 우리는 컴퓨터로 효율적인 계산이 가능한 방식을 사용할 수 있습니다. 현재 우리가 만나는 거의 대부분의 이미지, 음성, 비디오 등은 FFT를 근간에 두고 있습니다.
FFT에 근간을 둔 python, matlab 코드에 대한 이해로 시작하여 이미지 압축(image compression) 방식에 대해서 알아볼 것입니다.
내적 $$\left\langle f(x),g(x) \right\rangle = \int_{a}^{b} f(x) \bar{g}(x)\, dx$$
$\bar{g}$는 complex conjugate
특정 주파수 f(x)에 대하여 우리는 여러 주파수를 가지는 cos, sin 함수로 표현이 가능하다.
$$f(x)=\frac{A_0}{2}+\sum_{k=1}^\infty (A_k cos(kx)+B_k sin(kx))$$
$$ A_k = \frac{1}{\pi} \int_{-\pi}^{\pi} f(x) cos(kx)\, dx=\frac{1}{\lVert cos(kx) \rVert^2} \left\langle f(x),cos(kx) \right\rangle$$
$$ B_k = \frac{1}{\pi} \int_{-\pi}^{\pi} f(x) sin(kx)\, dx=\frac{1}{\lVert sin(kx) \rVert^2} \left\langle f(x),sin(kx) \right\rangle$$
해당 $A_k, B_k$ coefficient는 f(x)와의 내적으로 생각 가능
내적의 표현 방식을 통해 우리는 coordinate의 projection에 대한 것으로 좌표상에 나타낼 수 있다.
가령 x,y 좌표계에서 f라는 벡터는 다음과 같이 나타낼 수 있다.
$$\vec{f}=\left\langle \vec{f},\vec{x} \right\rangle \frac{\vec{x}}{\lVert \vec{x} \rVert^2} + \left\langle \vec{f},\vec{y} \right\rangle \frac{\vec{y}}{\lVert \vec{y} \rVert^2}$$
orthogonal basis u,v 좌표계에서 역시 마찬가지의 표현이 가능하다.
$$\vec{f}=\left\langle \vec{f},\vec{u} \right\rangle \frac{\vec{u}}{\lVert \vec{u} \rVert^2} + \left\langle \vec{f},\vec{v} \right\rangle \frac{\vec{v}}{\lVert \vec{v} \rVert^2}$$
Fourier Series에서도 마찬가지의 표현을 하는 것!!!
sin과 cos을 orthogonal basis로 생각
해당 coeffiecient를 내적에 대한 projection 값으로 생각
앞에서는 $[-\pi ,\pi]$의 범주를 이야기 했지만 여기서는 $[0,L]$의 범주로 간주하면 Fourier Series는 다음과 같다.
$$f(x)=\frac{A_0}{2}+\sum_{k=1}^\infty (A_k cos(\frac{2\pi kx}{L})+B_k sin(\frac{2\pi kx}{L}))$$
$$ A_k = \frac{2}{L} \int_{0}^{L} f(x) cos(\frac{2\pi kx}{L})\, dx=\frac{1}{\lVert cos(kx) \rVert^2} \left\langle f(x),cos(kx) \right\rangle$$
$$ B_k = \frac{2}{L} \int_{0}^{L} f(x) sin(\frac{2\pi kx}{L})\, dx=\frac{1}{\lVert sin(kx) \rVert^2} \left\langle f(x),sin(kx) \right\rangle$$
L의 길이의 주기성을 가짐
orthogonal하다면 basis 간 내적은 = 0
두 함수간의 내적은 얼마나 가까운지를 설명하는 것
$$\left\langle f(x),g(x) \right\rangle = \int_{a}^{b} f(x) \bar{g}(x)\, dx$$
$$\left\langle \bar{f} , \bar{g} \right\rangle \triangle x = \sum_{k=1}^n f(x_k)\bar{g}(x_k) \triangle x$$
Euler's Formula(Taylor Series/Expansion에서 파생)
$$e^{ikx} = cos(kx) + i sin(kx) = \psi_k$$
$$e^{-ikx} = cos(kx) - i sin(kx)$$
$[-\pi ,\pi]$의 범주
$$\left\langle f(x),g(x) \right\rangle = \int_{-\pi}^{\pi} f(x) \bar{g}(x)\, dx$$
$$f(x) = \sum_{k=-\infty}^{\infty} c_k e^{ikx} = \sum_{k=-\infty}^{\infty} (\alpha_k + i \beta_k)(cos(kx) + i sin(kx))$$
if f(x) is real $c_k = \bar(c_{-k})$
$$f(x) = \sum_{k=-\infty}^{\infty} \left\langle f(x), \psi_k \right\rangle \psi_k $$
$$ \left\langle \psi_j, \psi_k \right\rangle = \int_{-\pi}^{\pi} e^{ijx}e^{-ikx} \, dx = \int_{-\pi}^{\pi} e^{i(j-k)x} \, dx = \frac{1}{i(j-k)} [e^{i(j-k)x}]_{-\pi}^{\pi}$$
$$\left\langle \psi_j, \psi_k \right\rangle = \begin{cases} 0, & \mbox{if }j \neq k \\ 2\pi, & \mbox{if }j = k \end{cases}$$
$$ (j=k) \int_{-\pi}^{\pi} e^{i0x} \, dx = \int_{-\pi}^{\pi} 1 \, dx = 2\pi$$
$$ (j \neq k) 0 $$
위 링크에 가시면 해당 코드를 다운받으실 수 있습니다.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.cm import get_cmap
plt.rcParams['figure.figsize'] = [8, 8]
plt.rcParams.update({'font.size': 18})
# Define domain
dx = 0.001
L = np.pi
x = L * np.arange(-1+dx,1+dx,dx)
n = len(x)
nquart = int(np.floor(n/4))
# Define hat function
f = np.zeros_like(x)
f[nquart:2*nquart] = (4/n)*np.arange(1,nquart+1)
f[2*nquart:3*nquart] = np.ones(nquart) - (4/n)*np.arange(0,nquart)
fig, ax = plt.subplots()
ax.plot(x,f,'-',color='k',LineWidth=2)
# Compute Fourier series
name = "Accent"
cmap = get_cmap('tab10')
colors = cmap.colors
ax.set_prop_cycle(color=colors)
A0 = np.sum(f * np.ones_like(x)) * dx
fFS = A0/2
A = np.zeros(20)
B = np.zeros(20)
for k in range(20):
A[k] = np.sum(f * np.cos(np.pi*(k+1)*x/L)) * dx # Inner product
B[k] = np.sum(f * np.sin(np.pi*(k+1)*x/L)) * dx
fFS = fFS + A[k]*np.cos((k+1)*np.pi*x/L) + B[k]*np.sin((k+1)*np.pi*x/L)
ax.plot(x,fFS,'-')
f라는 주기 함수가 다음과 같을 때
k가 증가함에 따라 생긴 cos, sin의 합인 FS의 결과는 아래와 같습니다.
Gibbs Phenomena는 아래와 같이 불연속적인 함수를 일컫는 말입니다. 하위 개념으로 step function이 있습니다.
이를 활용한 FS의 결과는 다음과 같습니다.
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = [8, 8]
plt.rcParams.update({'font.size': 18})
dx = 0.01
L = 2*np.pi
x = np.arange(0,L+dx,dx)
n = len(x)
nquart = int(np.floor(n/4))
f = np.zeros_like(x)
f[nquart:3*nquart] = 1
A0 = np.sum(f * np.ones_like(x)) * dx * 2 / L
fFS = A0/2 * np.ones_like(f)
for k in range(1,101):
Ak = np.sum(f * np.cos(2*np.pi*k*x/L)) * dx * 2 / L
Bk = np.sum(f * np.sin(2*np.pi*k*x/L)) * dx * 2 / L
fFS = fFS + Ak*np.cos(2*k*np.pi*x/L) + Bk*np.sin(2*k*np.pi*x/L)
plt.plot(x,f,color='k',LineWidth=2)
plt.plot(x,fFS,'-',color='r',LineWidth=1.5)
plt.show()
여기까지 Fourier Series에 대해서 알아보았습니다.
더 궁금하신 점은 책이나 자료를 참조하시길 바랍니다.