파이썬 numpy.fft.fftshift 함수 활용하기
파이썬 Numpy의 `numpy.fft.fftshift` 함수 소개
`numpy.fft.fftshift` 함수는 이산 푸리에 변환의 결과를 해석할 때 유용한 함수로, 주파수 영역에서 낮은 주파수 성분을 중심으로 이동시키는 작업을 수행합니다. 푸리에 변환의 결과는 보통 저주파 성분이 양쪽 끝에 위치하게 되는데, 이를 시각적으로 더 쉽게 해석할 수 있도록 중심에 오도록 재배치할 때 사용됩니다.
`numpy.fft.fftshift` 함수란?
`numpy.fft.fftshift` 함수는 배열의 0 주파수 성분을 중심으로 이동시키는 함수입니다. 이 함수는 주로 푸리에 변환 후 주파수 도메인 데이터를 시각화하거나 처리할 때 사용됩니다. 푸리에 변환 결과의 주파수 축을 재정렬하여 저주파 성분을 중앙에 위치시키는 역할을 합니다.
함수 문법
numpy.fft.fftshift(x, axes=None)
- x: 주파수 성분을 이동시킬 입력 배열
- axes: 이동시킬 축 (기본값은 모든 축에 대해 이동)
예제 1: 1D 푸리에 변환과 `fftshift`
다음 예제에서는 1D 신호에 대해 푸리에 변환을 수행하고, `fftshift` 함수를 사용하여 주파수 성분을 중앙에 맞추는 방법을 보여줍니다.
import numpy as np
import matplotlib.pyplot as plt
# 1D 신호 생성 (예: 사인파)
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(5 * x)
# 푸리에 변환 수행
fft_result = np.fft.fft(y)
# 푸리에 변환의 주파수 축 재정렬
shifted_fft = np.fft.fftshift(fft_result)
# 시각화
plt.subplot(1, 2, 1)
plt.plot(np.abs(fft_result))
plt.title('푸리에 변환 결과')
plt.subplot(1, 2, 2)
plt.plot(np.abs(shifted_fft))
plt.title('fftshift 결과')
plt.show()
이 예제에서는 1D 사인파에 대해 푸리에 변환을 수행한 후, `fftshift` 함수를 사용하여 주파수 성분이 중앙에 위치하도록 재배치합니다. 이를 통해 저주파 성분이 중앙에 배치된 주파수 도메인 데이터를 얻을 수 있습니다.
예제 2: 2D 이미지의 푸리에 변환과 `fftshift`
이 예제에서는 2D 이미지에 대해 푸리에 변환을 수행하고, `fftshift`를 사용하여 저주파 성분이 중앙에 오도록 재배치한 후 시각화합니다.
import numpy as np
import matplotlib.pyplot as plt
from scipy import misc
# 예제 이미지 로드
image = misc.face(gray=True)
# 2D 푸리에 변환 수행
fft_image = np.fft.fft2(image)
# 주파수 성분을 중앙에 맞추기 위해 fftshift 적용
shifted_fft_image = np.fft.fftshift(fft_image)
# 원본 이미지와 푸리에 변환된 이미지 시각화
plt.subplot(1, 2, 1)
plt.imshow(np.log(np.abs(fft_image)), cmap='gray')
plt.title('푸리에 변환된 이미지')
plt.subplot(1, 2, 2)
plt.imshow(np.log(np.abs(shifted_fft_image)), cmap='gray')
plt.title('fftshift 후 이미지')
plt.show()
이 예제에서는 2D 이미지에 대해 푸리에 변환을 수행하고, `fftshift` 함수를 사용하여 저주파 성분이 중앙에 오도록 이동시킨 결과를 시각화합니다. 이 과정은 이미지 처리에서 주파수 성분을 해석할 때 매우 유용합니다.
정규화된 `fftshift`의 사용
때로는 `fftshift`와 함께 정규화를 사용하여 푸리에 변환 결과의 크기를 조절할 수 있습니다. 이 과정은 푸리에 변환을 통한 신호나 이미지 처리에서 효과적으로 사용됩니다.
import numpy as np
# 2D 배열 생성 (예: 2D 사인파)
x = np.linspace(0, 4 * np.pi, 100)
y = np.linspace(0, 4 * np.pi, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.sin(Y)
# 정규화된 2D FFT 수행
fft_result = np.fft.fft2(Z, norm='ortho')
# 정규화된 2D FFT에 fftshift 적용
shifted_fft_result = np.fft.fftshift(fft_result)
# 결과 출력
print("fftshift 후의 결과 샘플:\n", np.abs(shifted_fft_result[:2, :2]))
이 예제에서는 정규화된 푸리에 변환과 `fftshift`를 함께 사용하여 데이터의 주파수 성분을 중앙으로 재배치합니다. 이를 통해 데이터의 해석을 보다 쉽게 할 수 있습니다.
결론
`numpy.fft.fftshift` 함수는 주파수 도메인 데이터를 시각적으로 더 쉽게 해석할 수 있도록 배열을 재배치하는 데 유용합니다. 이를 통해 저주파 성분이 중앙에 위치하게 되고, 주파수 분석 및 처리에서 매우 중요한 역할을 합니다. 이미지 처리, 신호 처리와 같은 여러 분야에서 푸리에 변환 후 데이터를 더 쉽게 해석하기 위해 자주 사용됩니다.
더 많은 정보는 Numpy 공식 문서를 참고하세요.