離散傅立葉變換(DFT)和快速傅立葉變換(FFT)是訊號處理和數字訊號處理中的基本工具。它們用於將時間域的訊號轉換為頻率域的表示,幫助分析訊號的頻譜成分。
1. 離散傅立葉變換(DFT)
1.1 DFT的基本概念
DFT是將離散時間訊號轉換為頻域表示的工具。對於長度為 N 的離散訊號 x[n],其DFT定義為:
其中:
X[k] 是頻域訊號的第
𝑘k 個頻率分量
x[n] 是時間域訊號的第
n 個樣本
N 是訊號的總樣本數
j 是虛數單位
1.2 逆DFT(IDFT)
逆DFT用於將頻域訊號轉換回時間域訊號:
1.3 DFT的性質
2. 快速傅立葉變換(FFT)
2.1 FFT的基本概念
2.2 Cooley-Tukey演算法
透過遞迴地應用這種分解,可以大幅減少計算量。
2.3 FFT的實現
以下是Python中使用NumPy庫實現DFT和FFT的示例程式碼:
import numpy as np
import matplotlib.pyplot as plt
# 生成一個示例訊號
N = 1024
t = np.linspace(0, 1, N)
f1, f2 = 50, 120
x = np.sin(2 * np.pi * f1 * t) + 0.5 * np.sin(2 * np.pi * f2 * t)
# DFT的實現
def dft(x):
N = len(x)
X = np.zeros(N, dtype=complex)
for k in range(N):
for n in range(N):
X[k] += x[n] * np.exp(-2j * np.pi * k * n / N)
return X
# 計算DFT
X_dft = dft(x)
# 使用NumPy的FFT計算
X_fft = np.fft.fft(x)
# 繪製結果
frequencies = np.fft.fftfreq(N)
plt.figure(figsize=(12, 6))
# DFT
plt.subplot(2, 1, 1)
plt.plot(frequencies[:N//2], np.abs(X_dft)[:N//2])
plt.title('DFT')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
# FFT
plt.subplot(2, 1, 2)
plt.plot(frequencies[:N//2], np.abs(X_fft)[:N//2])
plt.title('FFT')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.tight_layout()
plt.show()
2.4 FFT的應用
頻譜分析: 用於分析訊號的頻率成分。
濾波器設計: 快速設計和實現數字濾波器。
卷積計算: 利用FFT快速計算大規模卷積。
音訊處理: 如音訊壓縮、增強和特效。