본문 바로가기
Python/numpy

파이썬 numpy.fft.fftshift 함수 활용하기

by PySun 2024. 10. 8.
반응형

파이썬 FFT의 매력: numpy.fft.fftshift 함수로 주파수 스펙트럼 중심 맞추기

신호 처리와 주파수 분석에서 빠른 푸리에 변환(Fourier Transform)의 중요성은 두말할 필요가 없습니다. NumPy numpy.fft.fftshift 함수는 주파수 스펙트럼의 주파수를 이동시켜 일반적으로 사각형 형태의 데이터에서 주파수 성분을 중앙에 위치시킵니다. 이 포스팅에서는 numpy.fft.fftshift의 사용법과 간단한 예제를 통해 주파수 스펙트럼의 이해를 돕겠습니다.

numpy.fft.fftshift 함수 소개

numpy.fft.fftshift 함수는 푸리에 변환의 결과인 주파수 배열에서 0Hz(DC 성분)가 중앙에 위치하도록 배열을 변화시킵니다. 이 과정은 주파수 분석 시 데이터의 시각적 이해를 돕는 데 매우 유용합니다.

함수 시그니처

numpy.fft.fftshift(x)

매개변수:

  • x: 축에 따라 이동할 배열이며, 일반적으로 복소수 배열입니다.

반환 값:

  • 주어진 배열 x에서 DC 성분이 중앙에 위치하도록 변경된 배열을 반환합니다.

사용 예제

기본 예제

다음은 numpy.fft.fftshift 함수를 사용하여 Fast Fourier Transform(FFT) 결과를 중앙으로 이동시키는 간단한 예제입니다.

import numpy as np
import matplotlib.pyplot as plt

# 샘플 신호 생성
Fs = 1000  # 샘플링 주파수
t = np.linspace(0, 1, Fs, endpoint=False)  # 시간 벡터
y = np.sin(2 * np.pi * 100 * t) + np.sin(2 * np.pi * 200 * t)  # 신호 생성

# FFT 수행
Y = np.fft.fft(y)
Y_shifted = np.fft.fftshift(Y)  # 주파수 스펙트럼 중앙 정렬

# 주파수 축 생성
freqs = np.fft.fftfreq(len(Y), 1/Fs)
freqs_shifted = np.fft.fftshift(freqs)

# 결과 시각화
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(freqs, np.abs(Y))
plt.title('FFT 결과 (DC 성분이 좌측에 위치)')
plt.xlabel('주파수 (Hz)')
plt.ylabel('진폭')

plt.subplot(2, 1, 2)
plt.plot(freqs_shifted, np.abs(Y_shifted))
plt.title('FFT 결과 (DC 성분이 중앙 위치)')
plt.xlabel('주파수 (Hz)')
plt.ylabel('진폭')

plt.tight_layout()
plt.show()

주파수 성분 예제

여러 주파수 성분을 가진 신호를 생성하고, FFT 결과를 fftshift를 사용하여 중앙에 맞추는 더 복잡한 예입니다.

import numpy as np
import matplotlib.pyplot as plt

# 다양한 주파수 성분을 가진 신호 생성
Fs = 2000  # 샘플링 주파수
t = np.linspace(0, 1, Fs, endpoint=False)  # 시간 벡터
y = (np.sin(2 * np.pi * 50 * t) + 
     np.cos(2 * np.pi * 150 * t) + 
     np.sin(2 * np.pi * 300 * t))

# FFT 수행
Y = np.fft.fft(y)
Y_shifted = np.fft.fftshift(Y)  # FFT 결과를 중앙으로 정렬

# 주파수 축 생성
freqs = np.fft.fftfreq(len(Y), 1/Fs)
freqs_shifted = np.fft.fftshift(freqs)

# 결과 시각화
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(freqs, np.abs(Y))
plt.title('원본 FFT 결과 (DC 성분 좌측)')
plt.xlabel('주파수 (Hz)')
plt.ylabel('진폭')

plt.subplot(2, 1, 2)
plt.plot(freqs_shifted, np.abs(Y_shifted))
plt.title('중앙 정렬된 FFT 결과')
plt.xlabel('주파수 (Hz)')
plt.ylabel('진폭')

plt.tight_layout()
plt.show()

결론

numpy.fft.fftshift 함수는 FFT 또는 주파수 도메인에서 작업할 때 데이터의 직관적인 이해를 돕는 중요한 도구입니다. 주파수 스펙트럼을 중앙으로 정렬하여 DC 성분을 쉽게 분석하고 해석할 수 있습니다. 이제 여러분도 신호 처리의 여정을 시작해 보세요!

  • fftshift를 사용하여 신호의 주파수 성분을 한눈에 파악해 보세요!
  • 지금 바로 numpy.fft.fftshift를 활용하여 FFT 결과의 분석을 시작해 보세요!
반응형