Discrete Fourier Transform (DFT) แปลงข้อมูลจาก Domain เวลา/พื้นที่ (Spatial/Time Domain) ไปเป็น Domain ความถี่ (Frequency Domain)
Fast Fourier Transform (FFT) เป็นอัลกอริทึมคำนวณ DFT ให้เร็วขึ้น (O(N log N) แทน O(N²)) SciPy มีโมดูล scipy.fftpack (เก่า) และ scipy.fft (ใหม่ แนะนำ)
ตัวอย่างโค้ด: สร้าง Sine Wave และหา FFT
import numpy as np
import matplotlib.pyplot as plt
from scipy import fftpack # หรือ from scipy import fft (ใหม่)
# พารามิเตอร์สัญญาณ
my_freq = 6 # ความถี่ 6 Hz
freq_samp = 70 # Sampling Rate 70 Hz
time_val = np.linspace(0, 3, 3 * freq_samp, endpoint=False)
# สร้าง Sine Wave
amp_val = np.sin(my_freq * 2 * np.pi * time_val)
# พลอต Time Domain
fig, ax = plt.subplots()
ax.plot(time_val, amp_val)
ax.set_xlabel('Time (seconds)')
ax.set_ylabel('Amplitude')
ax.set_title('Time Domain Signal')
plt.show()
# คำนวณ FFT
A = fftpack.fft(amp_val)
frequency = fftpack.fftfreq(len(amp_val)) * freq_samp
# พลอต Frequency Domain
fig, ax = plt.subplots()
ax.stem(frequency, np.abs(A))
ax.set_xlabel('Frequency (Hz)')
ax.set_ylabel('Magnitude')
ax.set_xlim(-freq_samp / 2, freq_samp / 2)
ax.set_title('Frequency Spectrum')
plt.show()
ผลลัพธ์

คำอธิบาย
สร้างสัญญาณ Sine Wave ความถี่ 6 Hz, Sample Rate 70 Hz, ระยะเวลา 3 วินาที
พลอตสัญญาณใน Time Domain
ใช้
fftpack.fft()คำนวณ FFT ได้ Complex Numbersใช้
fftpack.fftfreq()หาแกนความถี่ แล้วคูณ Sampling Rateพลอต Magnitude Spectrum (ค่าสัมบูรณ์ของ FFT) ด้วย stem plot
โมดูล FFT ใหม่ (SciPy ≥ 1.4) - แนะนำใช้ scipy.fft
from scipy.fft import fft, fftfreq, fftshift
# คำนวณ FFT
A = fft(amp_val)
freq = fftfreq(len(amp_val), d=1/freq_samp)
# ใช้ fftshift เพื่อจัดให้ความถี่ 0 อยู่กลาง
freq_shifted = fftshift(freq)
A_shifted = fftshift(A)
plt.stem(freq_shifted, np.abs(A_shifted))
ประยุกต์ใช้ FFT
- Signal Processing: Filtering, Spectral Analysis
- Image Processing: Convolution, Compression (JPEG)
- Audio: Pitch Detection, Noise Reduction
- Physics/Engineering: Vibration Analysis, Solving PDEs