ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

傅里叶变换:从时域到频域,理解信号分解的万能钥匙

傅里叶变换:从时域到频域,理解信号分解的万能钥匙 1. 从“听声辨谱”到“万物皆波”一个直觉化的开场如果你学过乐器或者哪怕只是用手机上的K歌软件录过音你可能都见过下面这种图形横轴是时间纵轴是声音的响度。它忠实地记录了你声音的起伏这就是我们最熟悉的时域信号。它能告诉你“什么时候声音大什么时候声音小”但它回答不了一个更本质的问题你的声音里到底包含了哪些“音高”这个“音高”在物理上对应的是振动的频率。一个纯净的音叉声在时域图上是一条平滑的正弦波而你的歌声则是无数个不同频率、不同强度的正弦波叠加在一起的复杂结果。傅里叶变换干的就是这样一件“听声辨谱”的活儿它把一个在时间上变化的复杂信号你的歌声分解成一系列不同频率的简单正弦波各个音高并告诉你每个频率的音高“贡献”了多少能量强度。但它的威力远不止于此。这就像你拿到一杯混合果汁傅里叶变换能告诉你里面有多少橙汁、多少苹果汁、多少胡萝卜汁。在更广阔的领域里图像可以看作是不同空间频率明暗变化的快慢的叠加心电图是不同生理节律频率的叠加甚至股票市场的波动也可以尝试用频率来解读其周期性。理解傅里叶变换就是获得了一把将复杂世界“拆解”成基本频率成分的万能钥匙。今天我们就抛开那些令人生畏的积分符号和复变函数用最直观的方式看看这把钥匙到底是怎么工作的。2. 核心思想任何复杂曲线都是“转圈圈”的合成结果要理解傅里叶变换我们必须先接受一个反直觉的“世界观”任何一个随时间变化的、哪怕再古怪的周期信号都可以看作是一堆以不同速度旋转的“圆圈”在侧面投影的叠加。让我们一步步构建这个图像。2.1 第一个零件匀速旋转的箭头想象一根长度为A的箭头以固定的角速度 ω单位弧度/秒围绕原点逆时针旋转。这个旋转的箭头在数学上可以用一个复数来表示其尖端在二维平面上画出一个完美的圆。现在我们只关心这个旋转箭头在竖直方向y轴的投影长度。随着箭头旋转这个投影的长度会如何变化它会从0变到A再变回0再到-A最后回到0如此循环。如果你把投影长度随时间的变化画出来你会得到一条完美的正弦波这里的A就是正弦波的振幅响度而角速度ω决定了正弦波的频率音高。ω越大箭头转得越快正弦波就振荡得越密集。所以第一个结论一个匀速旋转的箭头其竖直投影就是一个单一频率的正弦波。2.2 增加零件多个箭头一起转如果只有一个箭头我们只能得到单一频率的正弦波这太单调了无法合成复杂的声音。傅里叶的想法是那我用很多个箭头行不行每个箭头有自己的长度振幅 A_n和自己的旋转速度频率 ω_n。让它们同时从同一个起点开始旋转。现在把这一堆旋转箭头的尖端全部用向量加起来你会得到一个新的、总和的箭头。这个总和箭头也在旋转但它的轨迹不再是圆而可能是一个复杂的闭合曲线。关键来了这个总和箭头在竖直方向的投影就是所有这些不同频率正弦波叠加在一起的结果——一个复杂的周期波形。第二个结论多个不同频率、不同振幅的旋转箭头叠加后其总和的竖直投影可以合成出任意复杂的周期波形。这其实就是傅里叶级数的几何图像。它告诉我们合成复杂波形的“原料”就是这些旋转的箭头在数学上称为“复指数函数”。2.3 逆向工程从波形反推“配方”合成是正向过程而傅里叶变换是逆向过程。我们面对的是一个已经录制好的、复杂的周期波形比如一段重复的音乐小节。傅里叶变换要回答的问题是为了合成这个波形我需要准备哪些旋转箭头频率每个箭头需要多长振幅以及每个箭头最开始指向哪个方向相位这个过程可以想象成一个非常聪明的“猜配方”游戏我怀疑你的波形里包含一个每秒转5圈的箭头成分。那我就生成一个每秒反向转5圈的箭头即频率为 -5圈/秒让它和你原来的波形“同步旋转”比较。如果原波形里真的有一个很强的5圈/秒的成分那么当我的反向箭头和它同步时它们的乘积在长时间平均下会得到一个很大的值因为同频共振。如果原波形里没有5圈/秒的成分或者很弱那么乘积的平均值就会很小甚至为零。我遍历所有可能的旋转速度频率对每一个速度都做上述的“同步旋转并求平均”操作。最终我就能得到一张清单上面写着在频率f1处需要的箭头长度是A1初始角度是φ1在频率f2处箭头长度是A2初始角度是φ2……这张清单就是频谱。它完整描述了构成原始波形的所有“原料”。而求平均的操作在数学上就是积分。那个“反向旋转的箭头”就是复指数函数中的 e^{-iωt} 部分。注意这里用“平均”来理解积分是关键。积分可以看作是在一个很长的时间范围内对两个函数乘积的累积效果进行“平均”。如果两个函数节奏频率完全一致它们的乘积不会正负抵消平均值就大如果节奏不一致乘积就会正负抵消平均值就趋于零。这就是傅里叶变换能挑出特定频率成分的直观原理。3. 从傅里叶级数到傅里叶变换处理非周期信号上面我们一直在说“周期信号”。如果信号不是周期重复的比如一个短暂的脉冲或者一整首从不重复的歌怎么办这就是傅里叶级数进化到傅里叶变换的地方。思路非常巧妙把一个非周期信号想象成一个周期无穷大的周期信号。当周期趋向无穷大时相邻的频率间隔就变得无穷小离散的频率谱就变成了连续的频率谱。在傅里叶级数中我们得到的是离散的“配方清单”只在基频的整数倍上有值。到了傅里叶变换我们得到的是一个连续的“配方密度函数”。对于每个连续的频率值 ω我们都能计算出一个复数 F(ω)这个复数的模长 |F(ω)| 代表该频率成分的“强度密度”其辐角代表该频率成分的“初始相位”。连续傅里叶变换公式“分析方程”就源于我们刚才的“猜配方”游戏F(ω) ∫_{-∞}^{∞} f(t) * e^{-iωt} dt你可以这样解读它f(t)你原始的时域信号。e^{-iωt}一个以角速度 ω 反向旋转的单位箭头。f(t) * e^{-iωt}在每一个瞬间t将信号值乘上反向旋转箭头的当前位置。∫_{-∞}^{∞} ... dt对这个乘积在整个时间轴上求和积分相当于求“长期平均相关性”。F(ω)最终结果。它是一个关于频率ω的复数函数。对于某个特定的ω如果F(ω)的模很大说明原信号f(t)中含有大量该频率的成分。反过来有了完整的“配方”F(ω)我们也可以通过叠加所有频率的正向旋转箭头来完美地重建原始信号。这就是逆傅里叶变换“综合方程”f(t) (1/2π) ∫_{-∞}^{∞} F(ω) * e^{iωt} dω这个公式就是在执行我们之前说的合成过程把每个频率ω对应的箭头强度为F(ω)旋转速度为ω全部加起来。4. 离散傅里叶变换让计算机听懂傅里叶理论很美妙但现实世界中的信号都是被计算机采样得到的离散数据点我们无法计算从负无穷到正无穷的积分。于是离散傅里叶变换登场了它是连接理论数学和实际工程应用的桥梁。DFT做了两件关键的事时域离散化我们不再有连续的函数f(t)而是有一串按固定时间间隔Δt采样得到的N个数据点f[0], f[1], ..., f[N-1]。频域离散化输出的频率谱也不再是连续的F(ω)而是N个离散的频率点。这是由采样定理决定的你最高能分析到的频率奈奎斯特频率是你采样频率的一半。DFT会输出从0频率直流分量到最高频率之间均匀分布的N个频率点上的频谱值。DFT的公式看起来和连续傅里叶变换很像但积分变成了求和F[k] Σ_{n0}^{N-1} f[n] * e^{-i*(2π/N)*k*n} 其中 k 0, 1, ..., N-1f[n]第n个采样点的值。k代表第k个频率分量。k0是直流分量k1是基频分量以此类推。e^{-i*(2π/N)*k*n}这就是我们的“反向旋转箭头”只不过现在旋转的步进是离散的。(2π/N)*k是角频率n是时间步数。这个公式的本质没变对于你想分析的每一个离散频率k让整个信号序列去乘上一个在该频率下反向旋转的“探测箭头”序列然后把所有时间点上的乘积加起来。加总的结果F[k]就是这个频率成分的“强度”。实操心得理解DFT输出结果的双边性。DFT输出的N个点F[k]前半部分k从0到N/2对应的是正频率后半部分k从N/2到N-1对应的是负频率在物理上正负频率共同构成一个完整的余弦波。在大多数频谱分析中我们只关心前半部分的模长|F[k]|并将其幅度乘以适当的系数如2/N来反映真实物理振幅。这是初学者用代码画频谱图时最容易出错的地方之一常常会得到对称但幅度不对的图形。5. 快速傅里叶变换一个改变世界的算法直接按照DFT公式计算需要对每个kN个进行N次复数乘加运算总计算量是O(N²)。当N很大时比如音频处理中N4096很常见计算就慢得无法忍受。FFT不是一种新的变换而是计算DFT的一种超级高效的算法。它的核心思想是分而治之利用复指数因子e^{-i*(2π/N)*k*n}的周期性和对称性将一个大的DFT分解成多个小DFT的组合。最经典的库利-图基FFT算法要求N是2的整数次幂如256 1024 4096。它不断地将N点的DFT分解为两个N/2点的DFT再进一步分解直到分解到2点DFT这个最小单元。通过这种巧妙的分解它将计算量从O(N²)降到了O(N log₂ N)。当N1024时DFT需要约100万次运算而FFT仅需约1万次速度提升了两个数量级正是FFT算法的出现才使得实时音频处理、图像压缩JPEG、医学成像MRI、4G/5G通信等现代技术成为可能。可以说没有FFT数字信号处理领域的发展会滞后数十年。在代码中使用FFT的注意事项数据补零如果数据长度不是2的幂通常的做法是补零到最近的2的幂。这不会增加信息量但可以让FFT算法运行得更快并且能对频谱进行“插值”使频率曲线看起来更平滑。加窗DFT/FFT默认假设你给它的N个数据点是一个完整周期信号的一段。如果这段数据的开头和结尾幅度不相等就会引入虚假的高频成分频谱泄漏。为了减少这个影响在计算FFT前通常会给数据乘上一个“窗函数”如汉宁窗让数据的边缘平滑地衰减到零。理解输出FFT库如NumPy的np.fft.fft的输出是一个复数数组。你需要取模np.abs()来得到振幅谱取相位np.angle()来得到相位谱。同时要记住频率轴的映射关系freqs np.fft.fftfreq(N, d采样间隔)。6. 超越公式傅里叶变换的物理意义与应用场景理解了“旋转箭头”的几何图像和“猜配方”的游戏后傅里叶变换就不再是一堆冰冷的公式。我们可以从几个维度深化理解能量守恒帕塞瓦尔定理时域信号的总能量等于频域中各频率成分能量之和。这好比混合果汁的总容量等于橙汁、苹果汁等各自容量的总和。这一定理是信号分析和压缩的基石。不确定性原理时频分辨率权衡你无法同时无限精确地知道一个信号在何时发生以及其频率是多少。为了更精确地定位频率频率分辨率高你需要观察更长的时间段为了更精确地定位时间时间分辨率高你只能看很短的时间段但这会导致频率分析变得模糊。这个矛盾催生了短时傅里叶变换和小波变换它们是在时域和频域之间取得不同平衡的工具。典型应用场景音频分析最直观的应用。将录音转换成频谱图可以用于音乐信息检索如Shazam听歌识曲、语音识别、降噪识别并过滤特定频率的噪声、均衡器调整。图像处理将图像进行二维傅里叶变换会得到其空间频率谱。低频对应图像的平滑部分和大致轮廓高频对应图像的边缘和细节。图像压缩JPEG的核心就是利用人眼对高频细节不敏感的特性在频域舍弃部分高频信息。模糊滤镜本质上是在频域衰减高频分量。通信系统所有的现代调制技术如OFDM 4G/5G的核心都极度依赖傅里叶变换。它将高速数据流拆分到多个并行的、相互正交的子载波上传输极大地提高了抗干扰能力和频谱效率。医学成像核磁共振成像MRI直接测量的是人体组织在磁场中激发出的射频信号的频率信息通过逆傅里叶变换就能重建出人体的断层图像。数值计算利用傅里叶变换的卷积定理可以将时域中复杂的卷积运算转化为频域中简单的乘法运算从而极大地加速了计算广泛应用于物理模拟和深度学习领域。7. 从理解到实践如何直观验证与常见误区学习傅里叶变换动手验证比埋头推导更重要。你可以用Python的NumPy和Matplotlib库轻松做实验。一个简单的验证实验生成一个由50Hz和120Hz两个正弦波叠加的信号并加入一些随机噪声。对这个信号进行FFT并绘制振幅频谱图。你应该能在频谱图上清晰地看到在50Hz和120Hz处有两个尖峰这就是你合成信号的两个“原料”。噪声则会表现为遍布所有频率的低矮背景。常见误区与澄清误区一傅里叶变换适用于任何信号。严格来说它要求信号满足绝对可积或平方可积条件。工程上我们处理的有限长、能量有限的信号都满足。误区二傅里叶变换后的结果就是真实的物理频谱。对于实数信号FFT输出的频谱是关于奈奎斯特频率对称的。只有前半部分0到采样频率/2才对应真实的物理频率。振幅也需要根据计算方式是否除以N等进行校准。误区三高频分量多的信号就是“高频信号”。这取决于能量主要分布在哪个频段。一个包含大量高频噪声的音频其主要内容如人声可能仍集中在低频段。误区四相位信息不重要。大错特错振幅谱告诉你各个频率的“强度”相位谱则告诉你它们之间的“时间关系”。丢失相位信息你根本无法重建原始信号。图像处理中如果只用振幅谱而将相位谱置零逆变换回来的图像将完全无法辨认反之如果用正确的相位谱搭配一个常数振幅谱却能大致恢复图像的轮廓。这说明相位携带了信号的结构信息。我个人在学习和使用中的最大体会是永远不要只把傅里叶变换当作一个数学公式来记忆。时刻在脑中保持那幅“旋转箭头叠加”的几何图像以及“同步旋转求相关”的物理过程。当你面对一个滤波问题、一个压缩问题或一个模式识别问题时尝试从频域的角度去思考“这个操作在频域对应着什么是衰减了某些频率还是增强了另一些” 这种思维的转变才是掌握傅里叶变换精髓的关键。
返回列表