ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

从余弦函数傅里叶变换到手算推导:信号处理核心基石详解

2026/8/17 13:53:44 拓冰建站 浏览量
从余弦函数傅里叶变换到手算推导:信号处理核心基石详解 1. 项目概述从“波形”到“配方”的数学翻译如果你曾经摆弄过音频软件里的均衡器或者好奇过JPEG图片压缩是怎么工作的那你其实已经间接接触过傅里叶变换的核心思想了。简单来说它就像是一个“数学翻译官”能把一个随时间变化的信号比如一段声音的波形翻译成一份由不同频率、不同强度的“基础音”正弦波和余弦波组成的“配方”。我们今天要啃的这块硬骨头——余弦函数的傅里叶变换就是这个庞大思想体系中最经典、也最核心的一块基石。为什么单拎出“余弦函数”来讲因为它太典型了。在信号处理、图像分析、通信系统乃至量子物理里余弦波cosine wave是描述周期性现象最基本的单元。理解了一个纯余弦信号的频谱即它的傅里叶变换结果长什么样就等于拿到了解读更复杂信号的钥匙。很多初学者卡在公式推导和抽象概念上觉得傅里叶变换高深莫测。其实不然它的计算过程有清晰的物理图像和严谨的数学逻辑支撑。这篇文章我就结合自己多年在信号处理一线踩过的坑和积累的心得带你一步步手算余弦函数的傅里叶变换并深挖每一步背后的“为什么”让你不仅会算更能透彻理解其物理意义和应用场景。2. 核心思路拆解从无限时间到单一频率的聚焦在动手计算之前我们必须先统一“战场”和“武器”。傅里叶变换有很多形式针对不同的信号类型周期/非周期连续/离散。对于一个持续的、无限长的纯余弦波我们通常使用连续时间傅里叶变换。它的定义式是F(ω) ∫_{-∞}^{∞} f(t) e^{-jωt} dt这里f(t)是我们的时域信号F(ω)是变换后得到的频域函数ω是角频率单位弧度/秒j是虚数单位。这个公式就是我们的核心工具。为什么公式里会出现复数指数e^{-jωt}这是理解的关键突破口。根据欧拉公式e^{-jωt} cos(ωt) - j sin(ωt)。这意味着这个复数指数函数本身就是一个“探测器”或“匹配滤波器”。变换的过程实质上是将原始信号f(t)与无数个不同频率ω的复正弦波进行“比对”或“相关运算”。如果f(t)的某个成分与当前测试频率ω完美匹配那么这个积分结果就会很大在频域F(ω)中那个频率点就会产生一个尖峰。对于我们的纯余弦信号f(t) cos(ω₀t)我们直觉上就预期它应该只和频率ω₀完美匹配。但这里有一个至关重要的前提这个定义是针对能量有限的非周期信号即满足绝对可积条件的。而我们熟悉的cos(ω₀t)从t -∞持续到t ∞它的能量是无限的并不严格满足经典傅里叶变换的绝对可积条件。这就是第一个容易让人困惑的点。为了解决这个问题数学上引入了狄拉克δ函数这个概念。δ函数不是通常意义上的函数而是一种“分布”或“广义函数”它可以形象地理解为一个在原点处无限高、无限窄但面积为1的脉冲。它的核心性质是筛选性∫ δ(x - a) f(x) dx f(a)。我们将利用这个性质来刻画纯余弦波这种理想信号在频域中的“谱线”。所以我们本次计算的总体思路是将f(t) cos(ω₀t)代入CTFT定义式利用欧拉公式将其转化为两个复数指数项之和然后分别对两项进行积分。我们会发现这两个积分的结果恰好可以用δ函数来表达最终在频域得到两个位于±ω₀的冲激。这完美印证了我们的物理直觉一个纯余弦波其能量完全集中在它的固有频率ω₀上。3. 计算过程全解析当余弦遇见欧拉现在让我们进入具体的计算环节。设我们的信号为f(t) A cos(ω₀t φ)其中A是振幅ω₀是角频率φ是初相位。为了聚焦核心我们先考虑最标准的情况A1,φ0即f(t) cos(ω₀t)。第一步代入定义式我们将f(t)代入连续时间傅里叶变换公式F(ω) ∫_{-∞}^{∞} cos(ω₀t) e^{-jωt} dt第二步应用欧拉公式进行分解这是化简的关键。利用欧拉公式的“余弦形式”cos(θ) (e^{jθ} e^{-jθ}) / 2。 令θ ω₀t则有cos(ω₀t) (e^{jω₀t} e^{-jω₀t}) / 2将其代入积分式F(ω) ∫_{-∞}^{∞} [ (e^{jω₀t} e^{-jω₀t}) / 2 ] e^{-jωt} dt 1/2 ∫_{-∞}^{∞} e^{jω₀t} e^{-jωt} dt 1/2 ∫_{-∞}^{∞} e^{-jω₀t} e^{-jωt} dt第三步合并指数项并拆分为两个积分利用指数运算法则e^{a} * e^{b} e^{ab}F(ω) 1/2 ∫_{-∞}^{∞} e^{-j(ω - ω₀)t} dt 1/2 ∫_{-∞}^{∞} e^{-j(ω ω₀)t} dt现在我们得到了两个形式非常相似的积分I₁ ∫_{-∞}^{∞} e^{-j(ω - ω₀)t} dt和I₂ ∫_{-∞}^{∞} e^{-j(ω ω₀)t} dt。第四步理解并求解这类广义积分这是整个推导的难点。积分∫_{-∞}^{∞} e^{-jΩt} dt其中Ω是一个常数在普通函数意义下是不收敛的。我们可以从几何和极限的角度来理解它。考虑一个有限宽度的矩形窗函数。先对e^{-jΩt}在有限区间[-T/2, T/2]内积分∫_{-T/2}^{T/2} e^{-jΩt} dt [ e^{-jΩt} / (-jΩ) ]_{-T/2}^{T/2} (e^{-jΩT/2} - e^{jΩT/2}) / (-jΩ)利用欧拉公式(e^{-jθ} - e^{jθ}) / (-j) 2 sin(θ) / j -2j sin(θ) / j² 2 sin(θ)(因为j² -1这里需要仔细处理符号更严谨的推导会得到2 sin(θ)的形式)。实际上更常见的推导结果是∫_{-T/2}^{T/2} e^{-jΩt} dt T * Sa(ΩT/2)其中Sa(x) sin(x)/x是抽样函数。当T → ∞时Sa(ΩT/2)的性质是如果Ω 0Sa(0)1积分值趋于无穷大如果Ω ≠ 0Sa(ΩT/2)是一个振幅衰减的振荡函数其主瓣宽度随T增大而变窄但振荡频率加快。当T趋于无穷时除了Ω0这一点函数与任何其他有限函数的乘积的积分效应都趋于零。而在Ω0处它积分为无穷大。这正是狄拉克δ函数的典型行为。因此在广义函数的意义下我们得到这样一个极其重要的恒等式∫_{-∞}^{∞} e^{-jΩt} dt 2π δ(Ω)为什么是2π这个因子来源于傅里叶变换对的不同定义形式有的定义在指数项上带有2π有的没有。在我们采用的这个最常见定义下逆变换公式是f(t) 1/(2π) ∫_{-∞}^{∞} F(ω) e^{jωt} dω。为了保证正逆变换的对称性和能量守恒帕塞瓦尔定理正变换积分前的系数必须是1而逆变换积分前必须有1/(2π)。这导致了δ函数在频域缩放2π倍。你可以这样记忆δ(ω)的逆变换是1/(2π)那么根据对偶性常数1的傅里叶变换就是2π δ(ω)。而e^{-jΩt}可以看作常数1乘以一个复指数其积分结果正是2π δ(Ω)。第五步应用δ函数恒等式得到最终结果现在让我们回到之前的两个积分I₁和I₂。 令Ω₁ ω - ω₀则I₁ ∫_{-∞}^{∞} e^{-jΩ₁ t} dt 2π δ(Ω₁) 2π δ(ω - ω₀)令Ω₂ ω ω₀则I₂ ∫_{-∞}^{∞} e^{-jΩ₂ t} dt 2π δ(Ω₂) 2π δ(ω ω₀)将它们代回F(ω)的表达式F(ω) 1/2 * [2π δ(ω - ω₀)] 1/2 * [2π δ(ω ω₀)] π δ(ω - ω₀) π δ(ω ω₀)大功告成这就是标准余弦函数cos(ω₀t)的傅里叶变换结果在频域ω轴上在ω ω₀和ω -ω₀处各有一个强度为π的冲激函数。注意这个结果依赖于我们使用的CTFT定义式。有些教材或软件如某些MATLAB默认设置使用以赫兹Hz频率f为变量的定义F(f) ∫ f(t) e^{-j2πft} dt。在那个定义下cos(2πf₀t)的傅里叶变换是(1/2)[δ(f - f₀) δ(f f₀)]没有π因子。务必注意你所在上下文使用的定义这是工程计算中常见的错误来源。4. 结果深度解读与物理意义得到公式F(ω) π [δ(ω - ω₀) δ(ω ω₀)]后我们停下来仔细品味一下它的含义。4.1 为什么会有两个频率分量±ω₀这是初学者最容易感到困惑的地方。从时域看cos(ω₀t)明明只有一个频率ω₀。这里的关键在于我们使用的变换核e^{-jωt}是复指数它包含了正弦和余弦两个正交分量。一个实数的余弦信号可以分解为两个共轭对称的复指数信号之和cos(ω₀t) (e^{jω₀t} e^{-jω₀t})/2。这两个复指数分量分别对应正频率ω₀和负频率-ω₀。负频率的物理意义是什么在物理世界中我们测量到的频率都是正的。这里的负频率纯粹是数学构造的产物用于表示复指数信号的旋转方向。e^{jω₀t}在复平面上是一个逆时针旋转的向量e^{-jω₀t}是顺时针旋转的向量。两者相加虚部抵消实部就构成了我们看到的实数余弦波。因此负频率是确保我们能够用复指数这套简洁的数学工具来处理实数信号所必须引入的概念。在频谱图上我们通常会说余弦信号的频谱是双边谱在正负频率处各有一根谱线且两者关于纵轴对称幅度相等。4.2 幅度谱与相位谱傅里叶变换的结果F(ω)通常是复数包含幅度和相位信息。幅度谱|F(ω)|。对于我们的结果δ函数在非零点处的“强度”由系数决定。因此幅度谱是在ω ±ω₀处的两个冲激冲激的“面积”强度为π。这个π就是幅度信息。相位谱∠F(ω)。由于F(ω)是两个正的实数π乘以δ函数所以它在ω ±ω₀处的相位都是0。这对应着我们信号cos(ω₀t)的初相位φ0。如果信号是A cos(ω₀t φ)通过类似的推导利用cos(αβ)公式或复数相位可以得到F(ω) Aπ [e^{jφ} δ(ω - ω₀) e^{-jφ} δ(ω ω₀)]这时幅度谱的冲激强度变为Aπ相位谱在ωω₀处为φ在ω-ω₀处为-φ。这体现了共轭对称性实值信号的傅里叶变换其幅度谱是偶函数相位谱是奇函数。4.3 能量分布帕塞瓦尔定理帕塞瓦尔定理指出信号在时域的总能量等于其在频域的总能量。对于f(t) cos(ω₀t)时域能量平均功率是1/2在一个周期内cos²(ω₀t)的平均值。 在频域能量如何计算对于含有δ函数的频谱能量等于幅度谱平方的积分。|F(ω)|²在±ω₀处是强度为(π)²的冲激不对这里需要小心。δ函数δ(ω)的平方没有通常的定义。更严谨的方式是利用逆变换和滤波思想。实际上频域能量集中在两个无穷小的频点±ω₀上这与时域无限延伸的周期信号所具有的无限能量但有限平均功率的特性是一致的。对于功率信号我们通常使用功率谱密度PSD来描述而cos(ω₀t)的PSD正是由这两个δ函数冲激组成。5. 从理论到实践仿真验证与常见陷阱理解了数学推导我们最好用工具验证一下并在实践中巩固认知。这里以Python使用NumPy和Matplotlib为例但思想通用。5.1 数值计算的困境与技巧你可能会想直接对一个无限长的余弦信号做FFT快速傅里叶变换不就行了这里就有一个大坑。FFT本质上是离散傅里叶变换DFT的高效算法它默认处理的是有限长、离散的序列并且隐含了信号是周期延拓的假设。如果我们直接对cos(2πf₀t)的一段进行FFT比如取f₀10 Hz采样率fs100 Hz采样点数N128。理想情况下我们希望在频谱的第k f₀ * N / fs 10 * 128 / 100 12.8个频点看到峰值。但k必须是整数12.8不是整数这意味着我们截取的这段信号在其周期延拓后并不是一个完整的周期边界处不连续。这会导致频谱泄漏——能量从f₀处“泄漏”到其他频点频谱图上不是一个干净的尖峰而是一个主瓣加上许多旁瓣。import numpy as np import matplotlib.pyplot as plt fs 100.0 # 采样率 T 1.28 # 信号时长对应 N/fs N int(fs * T) # 采样点数 N128 t np.linspace(0, T, N, endpointFalse) # 时间向量 f0 10.0 # 信号频率 x np.cos(2 * np.pi * f0 * t) # 生成信号 X np.fft.fft(x) # FFT freqs np.fft.fftfreq(N, 1/fs) # 频率向量 # 绘制幅度谱 plt.figure(figsize(10,4)) plt.subplot(1,2,1) plt.stem(freqs[:N//2], np.abs(X[:N//2])/N, use_line_collectionTrue) # 取单边谱并归一化 plt.xlabel(Frequency (Hz)) plt.ylabel(Magnitude) plt.title(fFFT of cos(2π*{f0}t), N{N}, non-integer k) plt.grid(True) # 为了对比我们调整时长使k为整数 T2 1.0 # 时长1秒包含10个完整周期 N2 int(fs * T2) # N2100 t2 np.linspace(0, T2, N2, endpointFalse) x2 np.cos(2 * np.pi * f0 * t2) X2 np.fft.fft(x2) freqs2 np.fft.fftfreq(N2, 1/fs) plt.subplot(1,2,2) plt.stem(freqs2[:N2//2], np.abs(X2[:N2//2])/N2, use_line_collectionTrue) plt.xlabel(Frequency (Hz)) plt.ylabel(Magnitude) plt.title(fFFT of cos(2π*{f0}t), N{N2}, integer k10) plt.grid(True) plt.tight_layout() plt.show()运行这段代码你会看到左边图k12.8频谱展宽、泄漏严重右边图k10频谱是一个干净的单根谱线在10Hz处-10Hz处的谱线由于FFT输出顺序问题可能出现在90Hz处这是DFT的周期性导致的90Hz对应-10Hz。右边的情况就是我们通过整周期采样无限逼近了理论上的δ函数冲击。在实际中我们常用加窗如汉宁窗来抑制泄漏但窗函数本身又会加宽主瓣这是一个权衡。实操心得用FFT观察理想单频信号时务必确保采样率满足奈奎斯特定理fs 2f₀并且截取的长度正好包含整数个信号周期。这是得到清晰、准确频谱图的关键。如果无法做到整周期截断那么解释频谱结果时就要特别小心明白看到的展宽是泄漏效应而非信号本身的特性。5.2 幅度归一化的迷思另一个常见陷阱是FFT结果的幅度值。从上面的代码可以看到我们对FFT结果X除以了采样点数N。这是为什么 DFT的定义是X[k] Σ_{n0}^{N-1} x[n] e^{-j2πkn/N}。对于一个纯余弦信号x[n] cos(2πk₀n/N)当k₀是整数时理论上X[k₀] N/2正频率X[N-k₀] N/2负频率。所以为了恢复信号的真实振幅这里是1我们需要将X[k]除以N。对于双边谱每个谱线的幅度是A/2A是时域振幅对于单边谱只显示正频率并将负频率能量合并过来幅度就是A。我们的代码中np.abs(X)/N得到的就是双边谱的幅度A/2。如果你使用scipy.signal.periodogram等函数它会自动处理这些归一化问题但了解底层原理能让你在结果异常时快速定位问题。6. 应用场景延伸不止于理论公式理解了余弦函数的傅里叶变换就像掌握了一把万能钥匙可以打开许多应用场景的大门。6.1 调制与通信在无线通信中我们需要把低频的基带信号如语音搬到高频的载波上进行传输。最基础的调制方式就是幅度调制AMs(t) [1 m(t)] * cos(ω_c t)其中m(t)是基带信号ω_c是载波频率。根据傅里叶变换的频移性质时域乘以cos(ω_c t)对应频域卷积π[δ(ω-ω_c)δ(ωω_c)]m(t)的频谱会被搬移到±ω_c两侧形成上、下边带。这就是AM收音机的基本原理。解调过程则是反过来利用本地载波相乘再通过低通滤波器取出基带信号。6.2 同步与锁相环在数字通信接收端需要从接收到的信号中恢复出载波的频率和相位信息这个过程称为载波同步。接收信号中通常包含一个导频或隐含的载波分量。系统需要生成一个本地振荡信号cos(ωt φ)并通过鉴相器与输入信号比对调整ω和φ直到本地载波与接收信号中的载波分量同频同相。这个过程中对单频信号余弦的频谱检测和相位比较是核心。锁相环就是实现这一功能的经典电路。6.3 振动分析与故障诊断在机械系统中轴承或齿轮的故障往往会导致特定频率的振动增强。通过加速度传感器采集振动信号a(t)然后进行傅里叶变换得到频谱A(ω)。如果频谱在某个特征频率ω_fault处出现明显的峰值就像我们看到的余弦函数的冲激谱线一样这就强烈暗示了该频率对应的部件可能存在故障。工程师通过监测这些“谱线”的幅度变化就可以实现预测性维护。6.4 图像处理中的余弦变换JPEG图像压缩的核心是离散余弦变换DCT。你可以把DCT理解为一种“实数版的DFT”它只使用余弦函数作为基函数。将图像分成8x8的小块对每一块做二维DCT就是将图像块的能量集中到少数几个低频的DCT系数上左上角。量化过程保留这些大的低频系数舍弃很多高频的小系数再配合熵编码就实现了压缩。为什么用DCT而不是DFT因为DCT对于实数信号具有更好的能量集中特性并且避免了DFT可能引入的复数运算和边界处的跳变假设信号是偶对称的从而获得更高的压缩效率。7. 常见问题与深度思考Q1为什么有时候看到的余弦变换结果是πδ(ω-ω₀) πδ(ωω₀)有时候是(1/2)[δ(f-f₀)δ(ff₀)]A这是定义不同导致的。关键在于变量是角频率ω弧度/秒还是普通频率f赫兹。它们的关系是ω 2πf。同时傅里叶变换对的定义有多种约定。常见的有形式A工程常用F(ω) ∫ f(t) e^{-jωt} dt,f(t) 1/(2π) ∫ F(ω) e^{jωt} dω。此时cos(ω₀t)的变换是π[δ(ω-ω₀)δ(ωω₀)]。形式B对称形式F(ω) 1/√(2π) ∫ f(t) e^{-jωt} dt,f(t) 1/√(2π) ∫ F(ω) e^{jωt} dω。此时cos(ω₀t)的变换是√(π/2)[δ(ω-ω₀)δ(ωω₀)]。形式C以f为变量F(f) ∫ f(t) e^{-j2πft} dt,f(t) ∫ F(f) e^{j2πft} df。此时cos(2πf₀t)的变换是(1/2)[δ(f-f₀)δ(ff₀)]。核心建议在阅读文献或使用软件时第一件事就是确认它使用的正逆变换定义式否则系数会对不上。MATLAB的fft函数输出默认没有除以N其fft/ifft对满足ifft(fft(x)) x这又是一种归一化约定。Q2δ函数在现实中不存在那这个理论有什么用Aδ函数是理想化的模型就像“质点”、“无摩擦平面”一样。它的威力在于简化分析和提供清晰的理论洞察。在实际系统中窄带滤波如果一个滤波器的带宽B非常窄中心频率在ω₀那么它通过一个强度为π的cos(ω₀t)信号后输出信号的能量或平均功率正比于π乘以滤波器在ω₀处的频率响应。这可以用δ函数的筛选性质来简洁分析。近似一个持续时间很长T很大的余弦脉冲其频谱近似为一个位于±ω₀、宽度约为2π/T的窄峰。当T→∞时窄峰就趋于δ函数。理论是实际的极限情况。系统分析线性时不变系统的频率响应H(ω)其物理意义就是系统对输入复指数e^{jωt}的稳态响应。输入cos(ω₀t)其频谱包含δ(ω-ω₀)和δ(ωω₀)那么输出频谱就是H(ω)*[πδ(ω-ω₀)πδ(ωω₀)] πH(ω₀)δ(ω-ω₀) πH(-ω₀)δ(ωω₀)。对于实系数系统H(-ω₀) H*(ω₀)输出时域信号就是|H(ω₀)| cos(ω₀t ∠H(ω₀))。这个结论非常重要它让我们可以直接用频率响应来求系统对正弦稳态的响应。Q3如何理解“负频率”的物理意义它真的存在吗A这是一个经典的观念问题。在物理可测量的世界里我们只观测到正频率。负频率是数学描述工具带来的副产品但它非常有用且必要。旋转向量解释一个复数信号e^{jωt}可以看作复平面上一个长度为1、以角速度ω逆时针旋转的向量。ω0表示逆时针旋转正频率ω0表示顺时针旋转负频率。一个实数的余弦信号cos(ω₀t)是这个旋转向量在实轴上的投影它必须由一个逆时针和一个顺时针旋转的向量合成才能保证虚部抵消结果落在实轴上。频谱对称性对于任何实值信号其傅里叶变换F(ω)一定满足共轭对称性F(-ω) F*(ω)。这意味着幅度谱是偶函数相位谱是奇函数。负频率部分并不携带新的、独立的信息它完全是正频率部分的“镜像”。因此在很多实际频谱分析中我们只绘制“单边谱”将负频率的能量合并到正频率并将幅度加倍。但在数学运算和系统分析中保留双边谱的形式能让推导和表达式变得异常简洁和对称比如卷积定理、滤波运算等。Q4除了余弦其他简单信号的变换呢比如正弦、常数、单位冲激A掌握了余弦的推导方法这些都可以轻松解决正弦函数sin(ω₀t) (e^{jω₀t} - e^{-jω₀t})/(2j)。代入定义式同理可得其傅里叶变换为(π/j)[δ(ω-ω₀) - δ(ωω₀)] -jπδ(ω-ω₀) jπδ(ωω₀)。注意它的频谱是纯虚数且共轭反对称相位谱在ω₀处为-π/2。常数信号f(t)1。可以看作ω₀0的余弦函数。代入余弦变换结果令ω₀0得到F(ω) πδ(ω) πδ(ω) 2πδ(ω)。这符合直觉直流信号频率为0的所有能量都集中在ω0处。单位冲激函数f(t) δ(t)。直接代入定义F(ω) ∫ δ(t) e^{-jωt} dt e^{-jω*0} 1。这是一个非常重要的结论时域的冲激包含所有频率成分且幅度相等白色频谱。理解这些基本信号的变换并通过傅里叶变换的线性、时移、频移、尺度变换等性质就能像搭积木一样分析出更复杂信号的频谱结构。这就像学会了加减乘除才能去解更复杂的方程。余弦函数的傅里叶变换正是这块最重要的基石。