理解傅里叶变换
从数学原理到代码实现,深入浅出地理解傅里叶变换及其应用。
傅里叶变换是数学和工程领域最重要的工具之一。它能够将复杂的信号分解为简单的正弦波组合,有着广泛的应用。
数学基础
傅里叶级数
任何周期函数 都可以表示为正弦和余弦函数的无穷级数:
其中系数的计算公式为:
连续傅里叶变换
对于非周期信号,我们使用傅里叶变换:
逆变换为:
欧拉公式
理解傅里叶变换的关键是欧拉公式:
这个优美的公式将指数函数与三角函数联系起来,是复分析的基石。
离散傅里叶变换 (DFT)
在计算机中,我们使用离散傅里叶变换:
Python 实现
import numpy as np
def dft(x: np.ndarray) -> np.ndarray: """ 计算离散傅里叶变换 """ N = len(x) n = np.arange(N) k = n.reshape((N, 1))
# 计算 DFT 矩阵 W = np.exp(-2j * np.pi * k * n / N)
return np.dot(W, x)
def fft(x: np.ndarray) -> np.ndarray: """ 快速傅里叶变换 (Cooley-Tukey 算法) """ N = len(x)
if N <= 1: return x
# 分治:偶数项和奇数项 even = fft(x[0::2]) odd = fft(x[1::2])
# 旋转因子 T = np.exp(-2j * np.pi * np.arange(N) / N)
return np.concatenate([ even + T[:N//2] * odd, even + T[N//2:] * odd ])复杂度分析
- DFT 的时间复杂度:
- FFT 的时间复杂度:
这个改进使得傅里叶变换在实际应用中变得可行。
应用示例
信号频谱分析
import numpy as npimport matplotlib.pyplot as plt
# 生成混合信号fs = 1000 # 采样频率t = np.arange(0, 1, 1/fs)
# 50Hz 和 120Hz 的混合信号signal = np.sin(2 * np.pi * 50 * t) + 0.5 * np.sin(2 * np.pi * 120 * t)
# 计算 FFTspectrum = np.fft.fft(signal)frequencies = np.fft.fftfreq(len(signal), 1/fs)
# 取正频率部分positive_freq_idx = frequencies >= 0傅里叶变换的性质
傅里叶变换具有许多优美的性质:
| 性质 | 时域 | 频域 |
|---|---|---|
| 线性 | ||
| 时移 | ||
| 频移 | ||
| 卷积 |
傅里叶变换将卷积转化为乘法,这是其最重要的性质之一,也是许多高效算法的基础。
傅里叶变换不仅是数学的杰作,更是连接物理世界与数字世界的桥梁。理解它,你将获得分析和处理信号的强大工具。