[Python][Physics]#12 Fourier 변환과 광학 분야에서의 응용(시각화)
1. 목적: 이 글의 목적은 광학에서 자주 사용되는 Fourier 이론에 대한 개요를 제공하는 것입니다.
글에서는 Fourier expansion, Fourier integral theorem, Fourier transform 등의 개념이 소개되고, 이를 통해 광학 분야에서 어떻게 활용될 수 있는지가 설명됩니다.
2. 사용된 수학식에 대한 설명
1) Fourier expansion (푸리에 전개):
푸리에 전개는 주기적인 함수를 코사인 및 사인 항들의 합으로 표현하는 방법입니다.
여기서 a_n과 b_n은 각각 코사인 및 사인 항의 계수이며, Δω는 기본 주파수의 배수입니다. 주기적인 함수를 주어진 주파수의 코사인 및 사인 함수들의 합으로 분해할 수 있으며, 이를 통해 함수를 다루기 쉬운 형태로 나타낼 수 있습니다.
2) Fourier integral theorem (푸리에 적분 정리): 푸리에 적분 정리는 비주기적인 함수를 표현하기 위한 방법입니다. 푸리에 전개의 극한을 취하여 얻을 수 있습니다.
이 수식은 주기가 무한대로 길어지는 경우의 푸리에 변환을 나타냅니다. 비주기적 함수를 처리할 수 있으며, 시간 영역에서 주파수 영역으로 함수를 변환하고, 원래의 시간 영역으로 되돌릴 수 있습니다.
3) Fourier transform (푸리에 변환): 푸리에 변환은 시간 영역의 함수를 주파수 영역으로 변환하는 방법입니다.
다음은 푸리에 변환 식입니다.
푸리에 변환을 통해 주파수 영역에서의 함수 특성을 분석할 수 있습니다. 푸리에 역변환을 사용하여 주파수 영역에서 시간 영역으로 되돌릴 수도 있습니다
다음은 푸리에 역변환 식입니다.
푸리에 변환은 시간 영역과 주파수 영역 간의 관계를 분석하고 이해하는 데 매우 중요한 도구입니다.
3. 수식 기호별 의미:
f(t): 시간 t에 대한 함수
a_n, b_n: Fourier expansion에서 n번째 harmonics의 진폭
Δω: 기본 주파수와 harmonics 간의 간격
c_n: Fourier transform에서 n번째 주파수의 진폭
ω: 각주파수 (rad/s)
4. 활용방안: Fourier 이론은 광학 분야에서 매우 중요한 개념으로, 복잡한 빛의 파장을 적분 및 분해하여 분석하는 데 사용됩니다.이론은 광학 시스템을 통과하는 단일 사인파의 동작 및 여러 파장의 상호작용을 모델링하는 데도 유용합니다. Fourier 변환은 또한 많은 파장이 (모두 같은 주파수를 갖는) 공간적으로 간섭하는 회절 문제에서도 유용합니다. 이러한 개념은 레이저 및 광섬유 같은 많은 광학 기술에서 중요한 역할을 합니다.
1) Fourier expansion (푸리에 전개)
푸리에 전개는 광학에서 주기적인 파동을 분석하는 데 사용됩니다. 복잡한 광학 파동을 여러 개의 간단한 사인파와 코사인파의 합으로 표현할 수 있습니다. 이를 통해, 광 시스템을 통과하는 파동의 전파 특성을 보다 쉽게 이해할 수 있습니다. 예를 들어, 격자 구조를 통과하는 빛의 간섭 현상을 분석하는 데 사용할 수 있습니다.
2) Fourier integral theorem (푸리에 적분 정리)
푸리에 적분 정리는 비주기적인 광학 파동을 다룰 수 있습니다. 주기가 무한대로 커지는 한계를 고려하면, 푸리에 적분 정리를 사용하여 임의의 광학 파동을 분석할 수 있습니다. 이를 통해, 단일 레이저 펄스와 같은 비주기적인 광학 파동의 전파 특성을 이해할 수 있습니다.
3) Fourier transform (푸리에 변환)
푸리에 변환은 광학에서 시간 도메인과 주파수 도메인 사이의 관계를 분석하는 데 사용됩니다. 푸리에 변환을 통해, 빛의 파동을 시간 도메인에서 주파수 도메인으로 변환하거나 그 반대로 변환할 수 있습니다. 광학에서 푸리에 변환이 사용되는 몇 가지 예로는 광학 통신, 펄스 압축, 광학 분해능 향상, 광학 토모그래피 등이 있습니다.
5. Code 및 결과
1) Fourier expansion (푸리에 전개):
주기적인 함수를 표현하는 푸리에 전개를 시각화합니다. a_n 및 b_n 계수는 임의의 함수로 정의되었습니다. 주어진 계수에 대한 코사인 및 사인 항의 합을 계산한 다음 3D 플롯에 표시합니다. 빨간색 곡선은 전체 함수 f(t)를 나타냅니다
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 임의의 계수 설정
def a(n):
return 1 / (n + 1)
def b(n):
return 1 / (2 * (n + 1))
# 주기 및 샘플링 설정
period = 2 * np.pi
num_samples = 1000
num_terms = 10
# 시간 배열 생성
t = np.linspace(0, period, num_samples)
# 푸리에 전개 계산
f_t = np.zeros_like(t)
for n in range(num_terms):
f_t += a(n) * np.cos(n * t) + b(n) * np.sin(n * t)
# 3D 시각화
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
T, N = np.meshgrid(t, np.arange(num_terms))
Z = a(N) * np.cos(N * T) + b(N) * np.sin(N * T)
ax.plot_surface(T, N, Z, cmap='viridis', alpha=0.7)
ax.set_xlabel('Time')
ax.set_ylabel('Term Index')
ax.set_zlabel('Amplitude')
# 합쳐진 함수 추가
ax.plot(t, np.zeros_like(t) - 1, f_t, color='r', label='Summed Function: f(t)')
# 범례 추가
ax.legend()
plt.show()
2) Fourier integral theorem (푸리에 적분 정리)
가우시안 펄스를 정의하고 해당 펄스에 대한 연속 푸리에 변환을 계산한 다음 시간 도메인과 주파수 도메인에서 시각화합니다. 푸리에 적분 정리 직접 사용되지 않지만, 연속 푸리에 변환의 개념을 주는 코드입니다.
import matplotlib.pyplot as plt
from scipy.fft import fft, fftfreq
# 가우시안 펄스 정의
def gaussian_pulse(t, t0, sigma):
return np.exp(-(t - t0)**2 / (2 * sigma**2))
# 시간 도메인 설정
t_min, t_max, num_samples = -10, 10, 1000
t = np.linspace(t_min, t_max, num_samples)
dt = t[1] - t[0]
# 가우시안 펄스 생성
t0, sigma = 0, 1
f_t = gaussian_pulse(t, t0, sigma)
# 푸리에 변환 계산
frequencies = fftfreq(num_samples, dt)
frequencies = np.fft.fftshift(frequencies)
F_w = fft(f_t)
F_w = np.fft.fftshift(F_w)
# 시각화
fig, ax = plt.subplots(1, 2, figsize=(12, 4))
ax[0].plot(t, f_t, label="f(t)")
ax[0].set_xlabel("Time (t)")
ax[0].set_ylabel("Amplitude")
ax[0].set_title("Time Domain")
ax[0].legend()
ax[1].plot(frequencies, np.abs(F_w), label="F(ω)")
ax[1].set_xlabel("Frequency (ω)")
ax[1].set_ylabel("Amplitude")
ax[1].set_title("Frequency Domain")
ax[1].legend()
plt.show()
3) Fourier transform (푸리에 변환)
2D 가우시안 펄스의 2D 푸리에 변환을 계산하고 3D 플롯으로 표시하는 코드입니다.
2D 가우시안 펄스를 정의하고 해당 펄스에 대한 2D 푸리에 변환을 계산합니다. 그런 다음 이를 3D 플롯으로 시각화합니다. 이 경우, x 및 y 축은 공간 도메인의 좌표이고 z 축은 주파수 도메인에서의 가우시안 펄스의 크기를 나타냅니다.
import matplotlib.pyplot as plt
from scipy.fft import fft2, fftshift
# 2D Gaussian pulse definition
def gaussian_pulse(x, y, sigma_x, sigma_y):
return np.exp(-(x**2 / (2 * sigma_x**2) + y**2 / (2 * sigma_y**2)))
# Parameters
sigma_x = 1.0
sigma_y = 1.0
x = np.linspace(-10, 10, 100)
y = np.linspace(-10, 10, 100)
# Create 2D grid
X, Y = np.meshgrid(x, y)
# Compute 2D Gaussian pulse
pulse = gaussian_pulse(X, Y, sigma_x, sigma_y)
# Compute 2D Fourier transform
pulse_ft = fftshift(fft2(pulse))
# Plot 3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X_plt, Y_plt = np.meshgrid(x, np.fft.fftshift(y))
ax.plot_surface(X_plt, Y_plt, np.abs(pulse_ft), cmap='viridis', edgecolor='none')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('F(ω)')
ax.set_title("2D Fourier Transform of a 2D Gaussian Pulse")
plt.show()
4) Inverse Fourier transform (푸리에 역변환)
2D 가우시안 펄스의 2D 푸리에 변환을 계산한 다음 역변환을 수행하여 원래의 2D 가우시안 펄스를 복원합니다. 그런 다음 이를 3D 플롯으로 시각화합니다. 이 경우, x 및 y 축은 공간 도메인의 좌표이고 z 축은 시간 도메인에서의 가우시안 펄스의 크기를 나타냅니다.
import matplotlib.pyplot as plt
from scipy.fft import ifft2
from scipy.fft import fftshift, fft2
# 2D Gaussian pulse definition
def gaussian_pulse(x, y, sigma_x, sigma_y):
return np.exp(-(x**2 / (2 * sigma_x**2) + y**2 / (2 * sigma_y**2)))
# Parameters
sigma_x = 1.0
sigma_y = 1.0
x = np.linspace(-10, 10, 100)
y = np.linspace(-10, 10, 100)
# Create 2D grid
X, Y = np.meshgrid(x, y)
# Compute 2D Gaussian pulse
pulse = gaussian_pulse(X, Y, sigma_x, sigma_y)
# Compute 2D Fourier transform and inverse transform
pulse_ft = fftshift(fft2(pulse))
pulse_inverse = ifft2(ifftshift(pulse_ft))
# Plot 3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X_plt, Y_plt = np.meshgrid(x, y)
ax.plot_surface(X_plt, Y_plt, np.abs(pulse_inverse), cmap='viridis', edgecolor='none')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('f(t)')
ax.set_title("Inverse 2D Fourier Transform of a 2D Gaussian Pulse")
plt.show()