numpy에서 FFT 사용하기

10904 단어 NumpPythonFFT

1차원 FFT


numpy.fft.fft를 사용합니다.
※ FFT 결과 저장 순서 주의
처음에는 오름차순으로 저장된 주파수를 플러스로 하고, 이어서 오름차순으로 저장된 주파수를 마이너스로 한다.따라서 직접 그려도 결과를 파악하기 어렵다.
스토리지 순서 처리 방법
1. numpy.fft.fftfreq로 상기 저장 순서에 대응하는 주파수 배열 만들기
2. numpy.fft.fftshift에서 FFT의 결과를 주파수 음의 ~ 주파수 양의 순서에 따라 다시 배열하다
다음은numpy입니다.fft.fft 사용 예
1차원 FFT 사용 예
import numpy as np
import numpy.fft as fft
import matplotlib.pyplot as plt


y = []
N = 10000
step = 0.001
# 周波数の配列を作成
freq = fft.fftfreq(N, d=step)
# 周波数、振幅その1
f1 = 2
amp1 =1
# 周波数、振幅その2
f2 = 5
amp2 = 3

for i in range(N):
    x = i*step
    # 周波数、振幅その1、その2の波の重ね合わせ
    y_i = amp1*np.sin(f1*2*np.pi*x) + amp2*np.sin(f2*2*np.pi*x)
    y.append(y_i)

fy = fft.fft(y)
# 絶対値を規格化してプロット
plt.scatter(freq, np.abs(fy)/np.linalg.norm(fy))
plt.xlim([0, 7])
plt.grid()
plt.show()
  • 결과
    각 주파수의 최고치가 나타났다.절대치의 비율도 각 진폭의 비율과 일치한다.

  • 2차원 FFT


    numpy.fft.fft2를 사용합니다.
    2차원 상황에서 x, y방향은 상기에서 말한 주파수의 정~주파수 음의 순서에 따라 저장된다.
    numpy.fft.fftshift를 사용하면 x, y 방향은 모두 주파수 음~정의 순서에 따라 정렬됩니다.
    2D FFT 사용 예
    mport numpy as np
    import numpy.fft as fft
    import matplotlib.pyplot as plt
    
    
    z_ij = []
    N = 1000
    mid = N/2
    step = 0.001
    freq = fft.fftfreq(N, d=step)
    freq = freq.tolist()
    freq.sort()
    freq_x = []
    freq_y = []
    for i in range(N):
        freq_x.append(freq)
    for i in range(N):
        freq_y.append([freq[i]]*N)
    
    # x方向、y方向周波数
    fx1 = 4
    fy1 = 6
    
    for i in range(N):
        z_j = []
        for j in range(N):
            x = j*step
            y = i*step
            z = 2*np.sin(fx1*2*np.pi*x + fy1*2*np.pi*y)
            z_j.append(z)
        z_ij.append(z_j)
    
    fz_ij = fft.fft2(z_ij)
    # fftshiftでFFTの結果を並び替え
    shift_fz_ij = fft.fftshift(fz_ij)
    
    plt.contourf(freq_x, freq_y, np.log(np.abs(shift_fz_ij)), cmap='coolwarm')
    delta = 10
    plt.xlim([0, delta])
    plt.ylim([0, delta])
    plt.grid()
    plt.show()
    
  • 결과
    x방향 주파수 4, y방향 주파수 6위치에서 최고치

  • 좋은 웹페이지 즐겨찾기