がれすたさんのDIY日記

電子回路、Python、組み込みシステム開発、自作エフェクターを語るblog

Python:ScipyでFFTを行う

scipyのfftメソッドは二つありますがscipy.fftを使うことが推奨されてるようです。

コード

import matplotlib.pyplot as plt
import numpy as np
from scipy.fft import fft, fftfreq

f0 = 1000
fs = 96000
N = 5000
addnum = 5.0

def create_sin_wave(amplitude,f0,fs,sample):
    wave_table = []
    for n in np.arange(sample):
        sine = amplitude * np.sin(2.0 * np.pi * f0 * n / fs)
        wave_table.append(sine)
    return wave_table

# 信号波形の生成
wav = create_sin_wave(1.0,f0,fs,N)

# FFTの実行
X = fft(wav[0:N])
freqList = fftfreq(N, d=1.0/ fs)
amplitude = np.abs(X)/(N/2)

# 波形を描画
plt.subplot(211) 
plt.subplots_adjust(hspace=0.5)
plt.plot(range(0,N), wav[0:N],label = "wave1")
plt.axis([0, 500, -1.0, 1.0])
plt.xlabel("sample")
plt.ylabel("amplitude")

# 振幅スペクトルを描画
plt.subplot(212)
plt.plot(freqList, amplitude, marker='.', linestyle='-',label = "fft plot")
plt.axis([0, 20000, 0, 2])
plt.xlabel("frequency [Hz]")
plt.ylabel("amplitude")

plt.show()

FFT結果

f:id:gsmcustomeffects:20220305222226p:plain