[学习] 深入理解傅里叶变换:从时域到频域的桥梁
深入理解傅里叶变换:从时域到频域的桥梁
文章目录
- 深入理解傅里叶变换:从时域到频域的桥梁
- 1. 核心思想:从时域到频域
- 2. 为什么需要傅里叶变换?
- 3. 数学定义
- 3.1 连续傅里叶变换(CFT)
- 3.2 傅里叶级数(FS)
- 3.3 离散时间傅里叶变换(DTFT)
- 3.4 离散傅里叶变换(DFT)
- 4. 关键概念与特性
- 4.1 频谱
- 4.2 正交性与基函数
- 4.3 狄利克雷条件
- 4.4 吉布斯现象
- 4.5 卷积定理
- 4.6 帕塞瓦尔定理(能量守恒)
- 4.7 对称性
- 4.8 时频分辨率不确定性原理
- 5. 使用示例
- 5.1 信号降噪处理
- 5.1 信号降噪处理
- 6. 总结
傅里叶变换不仅仅是一个数学工具,更是一种强大的思维方式,它为我们理解信号、系统乃至世界提供了全新的视角。通过将复杂信号分解为不同频率的正弦波或复指数函数的组合,傅里叶变换揭示了信号的本质结构,成为众多科学与工程领域的核心基础。
1. 核心思想:从时域到频域
想象你在听一段音乐:
- 时域视角:你看到的是声音振幅随时间变化的波形图(横轴是时间,纵轴是振幅)。它告诉你某个特定时刻声音有多“响”。
- 频域视角:你想知道这段音乐是由哪些不同频率(音高)的音符组成的,以及每个音符的强度(响度)有多大。这就是频域(横轴是频率,纵轴是强度/能量)。
傅里叶变换的精髓在于:它可以将任何复杂的信号(函数)分解成一系列不同频率、不同幅度、不同相位的正弦波(或复指数)的组合。就像把一束白光分解成七彩光谱一样。
时频域转换演示:
import numpy as np
import matplotlib.pyplot as plt# 创建复合信号
t = np.linspace(0, 1, 1000, endpoint=False)
signal = (np.sin(2 * np.pi * 5 * t) + (0.5 * np.sin(2 * np.pi * 20 * t))# 可视化时域信号
plt.figure(figsize=(12, 6))
plt.subplot(211)
plt.plot(t, signal)
plt.title('时域信号 (5Hz + 20Hz)')
plt.xlabel('时间 (s)')
plt.ylabel('振幅')# 傅里叶变换
fft_result = np.fft.fft(signal)
freqs = np.fft.fftfreq(len(t), t[1]-t[0])# 可视化频域
plt.subplot(212)
plt.plot(freqs[:len(freqs)//2], np.abs(fft_result[:len(freqs)//2]))
plt.title('频域表示')
plt.xlabel('频率 (Hz)')
plt.ylabel('振幅')
plt.tight_layout()
plt.show()
演示效果:通过FFT可以实现时域到频域的转换
2. 为什么需要傅里叶变换?
傅里叶变换之所以如此重要,是因为它在多个方面提供了独特的价值:
- 揭示隐藏结构:很多信号在时域中看起来杂乱无章,但在频域中,其组成频率及其强度一目了然。例如,识别音频中的特定乐器、检测心电图中的异常心跳频率。
- 简化分析:在频域中对信号进行滤波、压缩、特征提取等操作往往比在时域中更简单直观。例如,设计一个低通滤波器去除高频噪声,只需在频域中衰减高频分量。
- 理解系统特性:线性时不变系统对输入信号的响应,在频域中表现为简单的乘法(系统频率响应函数乘以输入频谱),这比在时域进行卷积运算要容易得多。
- 解决微分方程:傅里叶变换可以将某些微分方程转化为频域中的代数方程,大大简化求解过程。
- 广泛的应用:信号处理(音频、图像、视频)、通信系统、量子力学、光学、热传导、结构分析、金融数据分析等众多领域。
3. 数学定义
傅里叶变换有多种形式,适用于不同类型的信号:
3.1 连续傅里叶变换(CFT)
- 适用对象:连续时间、非周期信号。
- 正变换(时域 → 频域):
F(ω)=∫−∞+∞f(t)⋅e−iωtdtF(\omega) = \int_{-\infty}^{+\infty} f(t) \cdot e^{-i\omega t} dt F(ω)=∫−∞+∞f(t)⋅e−iωtdt - 逆变换(频域 → 时域):
f(t)=12π∫−∞+∞F(ω)⋅eiωtdωf(t) = \frac{1}{2\pi} \int_{-\infty}^{+\infty} F(\omega) \cdot e^{i\omega t} d\omega f(t)=2π1∫−∞+∞F(ω)⋅eiωtdω - 解释:
- f(t)f(t)f(t):时域信号。
- F(ω)F(\omega)F(ω):频域表示,通常是复数。
- ω=2πf\omega = 2\pi fω=2πf 是角频率。
- e−iωt=cos(ωt)−isin(ωt)e^{-i\omega t} = \cos(\omega t) - i\sin(\omega t)e−iωt=cos(ωt)−isin(ωt):复指数函数,是傅里叶变换的基函数。
- 积分过程:正变换本质上是将原始信号 f(t)f(t)f(t) 与频率为 ω\omegaω 的复指数基函数进行内积。结果 F(ω)F(\omega)F(ω) 的模 ∣F(ω)∣|F(\omega)|∣F(ω)∣ 表示频率 ω\omegaω 成分的强度,其辐角 arg(F(ω))\arg(F(\omega))arg(F(ω)) 表示相位偏移。
- 逆变换:将所有频率分量叠加起来,就能重构原始信号。
3.2 傅里叶级数(FS)
- 适用对象:连续时间、周期信号。
- 复指数形式:
f(t)=∑n=−∞+∞cn⋅einω0tf(t) = \sum_{n=-\infty}^{+\infty} c_n \cdot e^{i n \omega_0 t} f(t)=n=−∞∑+∞cn⋅einω0t
其中 ω0=2πT\omega_0 = \frac{2\pi}{T}ω0=T2π 是基波角频率。 - 系数计算:
cn=1T∫0Tf(t)⋅e−inω0tdtc_n = \frac{1}{T} \int_{0}^{T} f(t) \cdot e^{-i n \omega_0 t} dt cn=T1∫0Tf(t)⋅e−inω0tdt - 解释:cnc_ncn 是频率为 nω0n\omega_0nω0 的分量对应的复数系数,其模 ∣cn∣|c_n|∣cn∣ 表示振幅,辐角 arg(cn)\arg(c_n)arg(cn) 表示相位。频谱是离散的线谱。
3.3 离散时间傅里叶变换(DTFT)
- 适用对象:离散时间、非周期信号。
- 正变换:
X(eiω)=∑n=−∞+∞x[n]⋅e−iωnX(e^{i\omega}) = \sum_{n=-\infty}^{+\infty} x[n] \cdot e^{-i\omega n} X(eiω)=n=−∞∑+∞x[n]⋅e−iωn - 解释:x[n]x[n]x[n] 是离散时间序列,X(eiω)X(e^{i\omega})X(eiω) 是其频谱。它是角频率 ω\omegaω 的连续函数,但以 2π2\pi2π 为周期。频率范围通常取 [−π,π][-\pi, \pi][−π,π] 或 [0,2π][0, 2\pi][0,2π]。
3.4 离散傅里叶变换(DFT)
- 适用对象:有限长的离散时间信号。
- 正变换:
X[k]=∑n=0N−1x[n]⋅e−i2πNkn,k=0,1,…,N−1X[k] = \sum_{n=0}^{N-1} x[n] \cdot e^{-i \frac{2\pi}{N} k n}, \quad k = 0, 1, \ldots, N-1 X[k]=n=0∑N−1x[n]⋅e−iN2πkn,k=0,1,…,N−1 - 逆变换:
x[n]=1N∑k=0N−1X[k]⋅ei2πNkn,n=0,1,…,N−1x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] \cdot e^{i \frac{2\pi}{N} k n}, \quad n = 0, 1, \ldots, N-1 x[n]=N1k=0∑N−1X[k]⋅eiN2πkn,n=0,1,…,N−1 - 解释:
- x[n]x[n]x[n]:长度为 NNN 的时域离散序列。
- X[k]X[k]X[k]:长度为 NNN 的频域离散序列。
- e−i2πNkne^{-i \frac{2\pi}{N} k n}e−iN2πkn:DFT 的基函数。
- kkk:频域索引,对应频率 fk=k⋅fsNf_k = k \cdot \frac{f_s}{N}fk=k⋅Nfs (Hz),其中 fsf_sfs 是采样频率。
- 关键点:
- DFT 将有限长序列视为一个周期信号的一个周期。
- X[k]X[k]X[k] 是 DTFT 在频率点 ωk=2πkN\omega_k = \frac{2\pi k}{N}ωk=N2πk 上的采样。
- 快速傅里叶变换(FFT)是一种高效的 DFT 算法(O(NlogN)O(N \log N)O(NlogN)),使得傅里叶分析在实时应用中成为可能。
4. 关键概念与特性
4.1 频谱
- 幅度谱:∣F(ω)∣|F(\omega)|∣F(ω)∣ 或 ∣X[k]∣|X[k]|∣X[k]∣,表示各频率分量的强度。
- 相位谱:arg(F(ω))\arg(F(\omega))arg(F(ω)) 或 arg(X[k])\arg(X[k])arg(X[k]),表示各频率分量的相位偏移。相位信息对信号重构至关重要,但幅度谱通常更直观。
4.2 正交性与基函数
不同频率的复指数函数 eiωte^{i\omega t}eiωt 在无穷区间上是正交的(内积为0)。这种正交性保证了信号可以唯一地分解成这些基函数的线性组合。
4.3 狄利克雷条件
一个函数能够进行傅里叶变换(或展开为傅里叶级数)需满足以下条件:
- 在任意有限区间内只有有限个第一类间断点。
- 在任意有限区间内只有有限个极值点。
- 绝对可积:∫∣f(t)∣dt<∞\int |f(t)| dt < \infty∫∣f(t)∣dt<∞。
绝大多数物理信号都满足这些条件。
4.4 吉布斯现象
当用有限项傅里叶级数逼近具有间断点的信号(如方波)时,在间断点附近会出现振荡和过冲,且不随项数增加而消失,只是振荡区域变窄。这是傅里叶分析的一个固有特性。
4.5 卷积定理
这是傅里叶变换最重要的性质之一:
- 时域卷积 ↔ 频域乘积:f(t)∗g(t)↔F(ω)⋅G(ω)f(t) * g(t) \leftrightarrow F(\omega) \cdot G(\omega)f(t)∗g(t)↔F(ω)⋅G(ω)
- 时域乘积 ↔ 频域卷积:
- 连续:f(t)⋅g(t)↔12πF(ω)∗G(ω)f(t) \cdot g(t) \leftrightarrow \frac{1}{2\pi} F(\omega) * G(\omega)f(t)⋅g(t)↔2π1F(ω)∗G(ω)
- 离散时间:x[n]⋅y[n]↔X(eiω)∗Y(eiω)x[n] \cdot y[n] \leftrightarrow X(e^{i\omega}) * Y(e^{i\omega})x[n]⋅y[n]↔X(eiω)∗Y(eiω)
- DFT:x[n]⋅y[n]↔1NX[k]∗Y[k]x[n] \cdot y[n] \leftrightarrow \frac{1}{N} X[k] * Y[k]x[n]⋅y[n]↔N1X[k]∗Y[k](循环卷积)
4.6 帕塞瓦尔定理(能量守恒)
信号在时域的总能量等于其在频域的总能量:
- 连续:∫∣f(t)∣2dt=12π∫∣F(ω)∣2dω\int |f(t)|^2 dt = \frac{1}{2\pi} \int |F(\omega)|^2 d\omega∫∣f(t)∣2dt=2π1∫∣F(ω)∣2dω
- 离散(DFT):∑∣x[n]∣2=1N∑∣X[k]∣2\sum |x[n]|^2 = \frac{1}{N} \sum |X[k]|^2∑∣x[n]∣2=N1∑∣X[k]∣2
4.7 对称性
傅里叶变换具有多种对称性,如实数信号的共轭对称性:
F(−ω)=F∗(ω)F(-\omega) = F^*(\omega) F(−ω)=F∗(ω)
这些性质在分析和计算中非常有用。
4.8 时频分辨率不确定性原理
类似于量子力学中的测不准原理,在信号分析中,你无法同时获得任意高的时间分辨率和频率分辨率。加窗(如短时傅里叶变换)是分析时变信号频谱的一种折中方法,但会带来分辨率限制。小波变换等方法是试图更好地解决这一问题的技术。
5. 使用示例
5.1 信号降噪处理
代码如下:
import numpy as np
import matplotlib.pyplot as plt# 生成含噪声的信号
fs = 1000 # 采样率
t = np.linspace(0, 1, fs, endpoint=False)
signal = np.sin(2 * np.pi * 5 * t) + (0.8 * np.sin(2 * np.pi * 20 * t))
noise = 0.5 * np.random.normal(size=len(t))
noisy_signal = signal + noise# 傅里叶变换
fft_result = np.fft.fft(noisy_signal)
freqs = np.fft.fftfreq(len(t), 1/fs)# 滤波:保留5-20Hz频率
fft_filtered = fft_result.copy()
fft_filtered[np.abs(freqs) < 3] = 0 # 去除低频噪声
fft_filtered[np.abs(freqs) > 25] = 0 # 去除高频噪声# 逆傅里叶变换
filtered_signal = np.real(np.fft.ifft(fft_filtered))# 可视化结果
plt.figure(figsize=(12, 8))plt.subplot(311)
plt.plot(t, noisy_signal)
plt.title('原始含噪声信号')
plt.ylim(-3, 3)plt.subplot(312)
plt.plot(freqs[:len(freqs)//2], np.abs(fft_result)[:len(freqs)//2])
plt.title('频域分析')
plt.xlim(0, 50)plt.subplot(313)
plt.plot(t, filtered_signal, 'r', linewidth=1.5)
plt.plot(t, signal, 'k--', alpha=0.5)
plt.title('滤波后信号 vs 原始信号')
plt.legend(['滤波后', '原始纯净信号'])
plt.ylim(-3, 3)plt.tight_layout()
plt.savefig('signal_denoising.png', dpi=120)
plt.show()
实验结果:信号噪声被明显的消减了
5.1 信号降噪处理
完整代码如下:
import numpy as np
import matplotlib.pyplot as plt
from skimage import data, color
from skimage.util import random_noise# 准备测试图像
image = color.rgb2gray(data.astronaut())
noisy_image = random_noise(image, mode='gaussian', var=0.01) # 添加噪声# 二维傅里叶变换
fft_image = np.fft.fft2(noisy_image)
fft_shifted = np.fft.fftshift(fft_image) # 低频移到中心# 创建高通滤波器
rows, cols = image.shape
crow, ccol = rows//2, cols//2
mask = np.ones((rows, cols), np.float32)
r = 30 # 滤波器半径
mask[crow-r:crow+r, ccol-r:ccol+r] = 0 # 中心区域置零# 应用滤波器
fft_filtered = fft_shifted * mask# 逆傅里叶变换
fft_ishift = np.fft.ifftshift(fft_filtered)
filtered_image = np.abs(np.fft.ifft2(fft_ishift))# 可视化结果
plt.figure(figsize=(15, 10))plt.subplot(231)
plt.imshow(image, cmap='gray')
plt.title('原始图像')plt.subplot(232)
plt.imshow(noisy_image, cmap='gray')
plt.title('带噪声图像')# 频谱可视化(对数缩放)
magnitude_spectrum = 20*np.log(np.abs(fft_shifted)+1)
plt.subplot(233)
plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('频谱图')plt.subplot(234)
plt.imshow(mask, cmap='gray')
plt.title('高通滤波器')plt.subplot(235)
plt.imshow(filtered_image, cmap='gray')
plt.title('边缘增强结果')# 与原图比较
plt.subplot(236)
plt.imshow(np.clip(filtered_image*2, 0, 1), cmap='gray') # 增强对比度
plt.title('增强效果')plt.tight_layout()
plt.savefig('image_edge_enhancement.png', dpi=120)
plt.show()
具体效果自己看吧 :)
两个Python示例完整展示了傅里叶变换在信号降噪和图像边缘增强中的应用,代码可直接复制运行(需安装numpy, matplotlib, scikit-image)
6. 总结
傅里叶变换是一座连接时域和频域的桥梁。它通过将复杂信号分解成最基本、最易于理解的正弦波(复指数)分量,为我们提供了分析和处理信号的强大工具。理解傅里叶变换不仅需要掌握其数学公式,更要理解其物理意义和核心思想:
任何信号都可以看作是不同频率振动的叠加。
从古老的傅里叶级数到现代无处不在的 FFT,傅里叶变换深刻地改变了我们处理信息的方式,是信号处理、通信、图像处理、物理等众多领域的基石。如果你想深入信号世界,透彻理解傅里叶变换是必不可少的第一步。
研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)