2026/10/16 5:33:33

信号与频谱入门:从时域波形到傅里叶变换的底层逻辑

信号与频谱入门:从时域波形到傅里叶变换的底层逻辑 无论你是学通信、电子、还是计算机出身信号与频谱都是绕不开的一座山。很多人第一次看到正弦曲线在示波器上跳动能看懂时间波形但一讲到频谱图就发懵——横轴是频率纵轴是幅度各种谱线忽高忽低到底代表什么为什么一个看似简单的信号非要拆成好几个频率成分来看别急这第一篇就把最核心的思路给你捋顺了。这篇内容适合刚接触信号处理的学生、刚转行做嵌入式或音频算法的工程师也适合想补一补底层概念的硬件老鸟。看完之后你会发现频谱没那么玄它就是把信号换了个角度重新打量。1. 信号与频谱的底层逻辑从看波形到看频率1.1 为什么非要把信号拆成频谱我们先从最直观的示波器画面说起。把一支麦克风接到示波器上你对着它喊一声啊——屏幕上出现的就是一个随声音起伏的电压波形。这个波形横轴是时间纵轴是幅度记录了声音在每一瞬间的大小。这就是信号的时域表示。时域表示很直观但有个大问题当多个声音混在一起时比如同时有人说话、有风扇噪音、还有脚步声波形彻底乱成一团你很难从这条曲线里分辨出每一种声源各自长什么样。可我们的耳朵偏偏就能在混杂环境里听出朋友的声音说明声音中一定藏着某种可分离的特征。这个特征就是频率。频率是什么就是信号在单位时间内重复变化的次数单位是赫兹Hz。如果一个信号随时间呈正弦规律变化我们就能清楚说出它的频率。但现实世界里的信号往往不是单纯的正弦波可能叠加了许多不同的频率成分。频谱做的事情就是把一个混叠信号拆开告诉你它里面包含了哪些频率、各自占多大比重。这个过程就像把一杯混合果汁重新分离成纯橙汁、纯苹果汁、纯西瓜汁并且标出每种果汁的比例。有了频谱之后你能直接看到信号的成分清单。比如一个音频信号里如果1000Hz附近能量特别高那说明这段声音在中频区域比较突出一个无线信号如果只在某个频点附近有窄尖峰那它就是典型的载波信号。这样很多时域里看不清的问题一旦转到频域答案直接写在图上。1.2 时域与频域的关系两副眼镜看同一个东西时域和频域并不是两种信号而是同一信号的两种观测方式。打个比方一份乐谱里面有旋律、和弦、节奏你可以看它的演奏波形也可以看它的音符分布。频谱图就是信号的音符分布。从数学上看时域信号可以表示成一系列正弦波的叠加。这就是傅里叶变换的核心思想——任何周期信号都可以分解为不同频率、不同幅度、不同相位的正弦波之和。对于非周期信号则把它看作周期无限大的周期信号从而引出傅里叶变换的概念。用公式表达傅里叶变换常见的写法是X(f) ∫ x(t) · e^(-j2πft) dt这个公式看着吓人其实说的是对某个频率f把原信号x(t)乘以一个复指数函数然后在整个时间轴上积分。这个积分值的大小就反映了x(t)中频率f成分的强弱。对所有可能的f都做一次就得到了完整的频谱函数X(f)。你可能想问为什么非要乘一个复指数函数这里有个直观理解e^(-j2πft)本质上是一个旋转的向量旋转速度就是f。当x(t)里恰好包含频率为f的成分时这个成分与旋转向量的节奏同步积分时不断叠加最终得到一个较大的值如果x(t)里没有这个频率那么x(t)与旋转向量的乘积会在积分中正负抵消积分结果趋近于零。这就是为什么傅里叶变换能挑出某一频率成分。在实际工程中我们很少手动去算这个积分而是用FFT快速傅里叶变换算法。FFT不是另一种变换它是傅里叶变换的高效实现方式能把成千上万点的变换在毫秒级完成。可以说现代数字信号处理能落地很大程度上要归功于FFT。2. 认识两类信号从连续到离散从周期到非周期2.1 连续信号与离散信号我们在课本里最常见的连续信号是时间和幅度都连续的模拟信号。比如麦克风输出的电压、收音机天线收到的电磁波在任意一个时间点都有一个确定的幅度值。处理这种信号时经典理论建立在积分、微分等连续数学工具之上。但计算机只能处理离散的数据点。所以模拟信号进入数字世界前必须经过采样——每隔一个固定时间间隔取一个幅度值得到离散时间信号。这个间隔就是采样周期Ts对应的采样频率fs 1/Ts。离散信号看似丢失了连续信号中间的信息但只要满足采样定理的条件离散信号就能无损地还原出原始连续信号。这里就得提一下奈奎斯特采样定理采样频率必须大于信号中最高频率成分的两倍才能无失真重建。为什么因为如果采样太慢高频成分会在频域发生混叠原本在fs/2以上的频率会被折叠回低频区间形成虚假成分。我见过不少新手调试数字滤波器时明明设计看起来没问题但输出总有莫名其妙的低频干扰最后查下来就是采样率设置不足信号在ADC入口就混叠了。2.2 周期信号与非周期信号周期信号就是每隔相同时间T重复出现同一波形的信号如正弦波、方波、锯齿波。对于周期信号傅里叶级数告诉我们它只能分解为基波频率1/T和一系列整数倍频率的谐波。每个谐波幅度大小取决于具体波形形状。比如方波听起来比正弦波亮就是因为方波的高次谐波更丰富。非周期信号则不然它不会精确重复比如人说话的声音、爆炸声、雷达回波。这类信号的频谱通常是连续的不再是一条条离散谱线而是呈现一段连续的幅度分布。比如白噪声在频域上各频率功率大致相等呈一条水平线而一个短促的脉冲在频域上频谱展开非常宽这正是时域越窄、频域越宽的体现。理解这个区别对选工具很有用对于周期信号你可以直接观察频谱里的谱线结构来提取基波和谐波信息对于非周期信号则要关注频谱包络和带宽判断能量主要集中在哪个频段。3. 想看到频谱怎么操作最稳妥3.1 软硬件工具怎么选学习阶段不需要买昂贵的仪器。用软件也一样能看频谱。这里首选Python语言配合SciPy库中的FFT函数再搭一段Matplotlib代码就能画出漂亮的频谱图。代码量很小适合入门验证理论。import numpy as np import matplotlib.pyplot as plt from scipy.fft import fft, fftfreq fs 1000 # 采样率 1000 Hz t np.arange(0, 1, 1/fs) x np.sin(2*np.pi*50*t) 0.5*np.sin(2*np.pi*120*t) y fft(x) freqs fftfreq(len(x), 1/fs) plt.plot(freqs[:len(freqs)//2], np.abs(y[:len(y)//2])) plt.xlabel(频率 (Hz)) plt.ylabel(幅度) plt.grid(True) plt.show()这段代码生成了一个包含50Hz和120Hz两个正弦成分的信号然后通过FFT计算频谱并绘制前一半频点因为实信号的频谱关于零频对称通常只看正频率段。运行之后你会看到两条清晰的谱线分别位于50Hz和120Hz幅度比例约为10.5正好和原始信号里的幅度对应。如果你手头有真实的模拟电路想观察实际信号的频谱那么可以用频谱分析仪。频谱分析仪的原理本质上也是做窄带滤波在频率轴上扫一遍记录每个频点上的功率。现在很多示波器也自带FFT功能只不过谱线分辨率受限于时域采样长度适合做粗略观察精细分析还是交给专门的频谱仪器或者软件更靠谱。3.2 关键参数分辨率、窗函数与采样时长用软件做FFT时最容易被忽略的是频率分辨率。频率分辨率指频谱上相邻两个频率点之间的间隔等于fs / N其中N是FFT点数。要分辨两根靠得很近的谱线比如49Hz和50Hz必须保证分辨率小于1Hz。如果你采样率是1000Hz那至少需要N大于1000点。如果N不够那么这两条谱线会叠在一起看起来就像一条宽峰根本分不清。除了点数窗函数也影响频谱形状。直接对一段有限长度的信号做FFT相当于给信号加了一个矩形窗这会在频域产生旁瓣泄漏使得谱线周围出现很多虚假的甩尾。为了减小泄漏我们可以选择其他窗函数比如汉宁窗、海明窗、布莱克曼窗。这些窗的共同思路是把信号两端逐渐衰减到零从而减少截断带来的不连续性。选择窗函数是个折中汉宁窗主瓣宽度适中旁瓣衰减也比较好适合大多数音频信号矩形窗频率分辨能力最强但旁瓣大适合窄带信号分离布莱克曼窗旁瓣衰减更好但主瓣变宽会损失分辨率。我自己做音频调音分析时常用汉宁窗测纯正弦波频率时反而用矩形窗能让峰值更尖锐。另一个容易踩的坑是补零。很多人以为补零能提高频率分辨率实际上补零只是让FFT输出间隔更细图像更平滑并不能改变真实分辨率。真实分辨率只取决于采样时长采样时长越长分辨越细。所以如果你需要分开两个很近的频率唯一办法就是采集更长时间的数据。4. 从频谱回到信号逆变换与其他实用视角4.1 逆变换频谱还能还原出波形傅里叶变换是可逆的也就是说只要你完整保留了频谱的幅度和相位信息就能把原始信号精确重建。这里特别强调相位频谱图大多数时候只画幅度谱但相位谱同样重要。相位决定了各个频率成分在时间轴上的对齐方式。如果你只保留幅度谱把所有频率成分的相位清零再做逆变换得到的信号波形很可能面目全非。举个例子一个冲击脉冲信号的幅度谱看起来是宽而平的但相位谱信息一旦丢失重建出来的信号就变成在时间轴上散布的一大堆杂波完全不是那个脉冲了。所以做频谱分析时必要时要把相位信息记录下来。逆变换公式与正变换非常对称x(t) ∫ X(f) · e^(j2πft) df实际工程里从频域合成时域信号也很常见。比如均衡器调整音频时算法上就是在频域对某些频段加权然后通过逆FFT回时域输出。这里要注意频域修改完后逆变换前要确保频谱满足共轭对称性否则恢复出来的时域信号会是复数相位还可能出现扭曲。4.2 功率谱密度不同视角下的频谱有时候我们关心的不是频率成分的幅度而是它所占的功率。尤其对随机信号或噪声而言幅度谱很不稳定直接观察幅度谱看不出规律但统计意义上的功率谱密度PSD却相当稳定。功率谱密度描述单位频率内的功率。计算功率谱密度的经典方法是周期图法也可以直接对信号做自相关再对自相关函数做傅里叶变换。根据维纳-辛钦定理自相关函数的傅里叶变换等于功率谱密度。在软件中更常用的是Welch方法它把长信号切分成多段每段分别计算FFT再对结果取平均。这种方法能有效平滑噪声让PSD曲线看起来更可靠。我在调试一个物联网设备的无线射频干扰问题时就是靠功率谱密度图找出底噪抬升的频段。直接用FFT看幅度谱根本看不出固定频点但用Welch方法平均之后某个频段底噪明显抬高顺藤摸瓜找到了电源开关频率。四种常见频谱视角做个对比类型横轴纵轴适用场景幅度谱频率幅度观察谐波、正弦波成分相位谱频率相位时域重建、滤波设计功率谱密度频率功率/Hz噪声、随机信号分析时频图时间频率幅度频率随时间变化的信号4.3 时频分析当频谱随时间变化常规频谱是全局的横轴只有频率信息来自整个时间段。但如果信号频率随时间变化比如调频广播、语音里的音调变化、鸟叫声全局频谱只能告诉你这一段时间内包含过哪些频率却无法告诉你每个频率出现在什么时刻。想要同时看到时间和频率就得用短时傅里叶变换STFT。它的做法是把信号切成一帧一帧的短段对每一帧分别做FFT然后把各帧频谱按时间顺序排列画成一张三维图或热力图的时频图。你在音频编辑软件里看到的频谱图就是STFT的典型应用。短时傅里叶变换的两个参数——窗长和跳帧长度直接影响时间分辨率与频率分辨率。窗长越长频率分辨率越高但时间分辨率越差窗长越短时间定位更准但频率分辨率变差。物理上没有一种窗能同时做到两者都最优这就是不确定性原理在信号分析中的体现。实际使用时要根据信号特点选平衡点如果没有把握可以先从50毫秒左右的窗长开始尝试。5. 常见问题与踩坑记录从理论到项目的过渡5.1 频谱泄露怎么处理最合适频谱泄露几乎是每个做FFT的人都会遇到的问题。哪怕你的信号只是纯正弦波FFT结果里也会在主峰旁边出现一连串慢慢衰减的旁瓣。如果你叠加了几个幅度差距很大的正弦波那么幅度小的那个很可能完全被大信号的旁瓣盖住导致你根本分辨不出来。处理泄露的第一选择是加窗函数。但很多时候加了窗还不够因为窗函数本身也有主瓣宽度会让峰变宽。这时候你还要小心区分主瓣和旁瓣的混合效果。针对不同信号形态我有一条经验对于像语音这样频谱成分比较宽的信号用汉宁窗或高分辨率窗比较合适对于像雷达脉冲这样的窄带脉冲信号用矩形窗保留全部能量更重要。除了加窗还可以把信号截取的时长同步到周期信号周期的整数倍。如果你能精确做到这一点泄漏会大幅减少甚至接近零。当然前提是你对信号周期有准确估计这在测一个稳定的振荡器时可行但面对未知信号时很难实现所以窗函数仍然是通用方案。5.2 FFT结果幅值单位与归一化如何换算很多初学者做完FFT后发现幅度对不上。其实这是因为FFT输出的幅度与输入信号的幅度之间存在一个缩放关系。在不做任何归一化的情况下对一个幅度为A的正弦波做N点FFT频率对应的FFT输出幅度约为A * N / 2。所以要得到真实的幅度A需要把FFT结果乘以2/N。功率谱的计算也要注意幅度谱直接平方得到的值需要除以N^2才能换算成功率谱密度。如果用get_window之类的库加窗还要记得补偿窗函数的能量增益用因子sum(window)对幅度进行归一化。这些换算虽然简单但一旦忘记画出来的频谱图数值就和理论对不上尤其在处理需要精确控制幅度的音频或振动信号时会带来很多困惑。我做振动信号采集时传感器输出的加速度单位是gFFT后如果不做2/N归一化幅值会大得离谱。处理后才能从频谱上正确读出各频率分量对应的振动幅值。5.3 实信号频谱为什么只画一半之前说过实信号的傅里叶变换具有共轭对称性也就是正频率部分和负频率部分的幅度是相同的。所以画频谱图时通常只画从0到奈奎斯特频率fs/2的部分节省一半显示面积。但你用Python的fft函数直接画图时freqs序列前半是正频率后半是负频率截取前半时要小心坐标偏移。如果你用的是fftfreq函数生成频率轴默认会从负频率排到正频率直接在plot里画全部点会发现图形左右对称。这时候很多人会困惑我怎么看见两座同样的峰。处理方法是只取前N//2个点并且将x轴范围限制在[0, fs/2]之间。同时要注意频谱的0频分量代表直流成分对交流信号来说可以忽略但如果你关心信号的直流偏置就要单独看这个点。另外一个容易忽略的是FFT输出顺序并不是从0Hz开始依次递增而是从0Hz到正频率再到负频率在fftshift之前所以做频域滤波时直接对FFT结果进行切片操作前一定要先搞清楚这个顺序否则把正频率的滤波当成负频率来改恢复出来的信号会出现严重失真。结语从信号与频谱一开启的思维转变写了这么多我最想强调的还是思维方式的变化。一开始接触频谱时我总喜欢把时域波形和频域频谱当成两种独立的东西来回切换得很别扭。后来上手做实际项目比如设计滤波器、分析音频噪声才真正意识到其实它们是同一枚硬币的两面用起来应当是按需取用。时域让你看出事件发生的先后和幅度变化频域让你看出信号由哪些频率成分构成、能量如何分布。哪边看得清就用哪边往往事半功倍。第一篇里我们把最核心的概念、工具和常见坑都过了一遍。信号从连续到离散的基本思路、傅里叶变换的本质、FFT实操中的参数设置、窗函数的作用以及幅度和相位的相互关系每一点都值得在电脑上亲手跑一遍。你不需要把公式推导得很深但一定要多动手画频谱图看到正弦波在频谱上立起一根针看到噪声铺成一条地毯看到窗函数对谱线的整形效果这些直观体验能让抽象概念真正扎进脑子里。下一篇可以接着聊频谱在具体领域里的应用比如音频滤波、无线信号解调、振动故障诊断。但不管走哪条路基础都是这一篇的认知。如果你在自己实验时碰到什么奇怪的频谱现象不妨带着疑问回来对照这里列出的常见问题大概率能找到方向。愿你的每一个频率都能被看清。