numpy에서 FFT 사용하기
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()
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()
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위치에서 최고치
Reference
이 문제에 관하여(numpy에서 FFT 사용하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ym15/items/8b7cce99faf20e2161fd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)