傅里叶变换与调制解调:频谱分析原理及Python实战

发布时间:2026/9/1 23:29:48
傅里叶变换与调制解调:频谱分析原理及Python实战 信号与系统这门课最劝退的不是卷积不是拉普拉斯变换而是你学完一整章傅里叶之后不知道它到底用来干什么。这次我们把“调制解调、频谱分析、傅里叶变换”放在一条线上讲先是傅里叶给出频率视角然后用频率视角理解频谱分析最后用频谱搬移解释调制解调。全程配公式速查和可运行的 Python 代码学完你能自己把“信号变频谱、频谱再搬回去”的过程跑出来。这篇文章适合三类人正在准备信号与系统考试、需要在面试前快速梳理知识脉络的毕业生以及工作中要处理波形分析、音频处理、通信仿真但数学基础有点生疏的工程师。核心目标是给你一套可以直接套用的知识框架什么时候用傅里叶变换什么时候用 DFT/FFT调制解调为什么本质上就是频谱搬移以及做频谱分析时最容易踩的坑是什么。文章会包含傅里叶正反变换公式与性质表、常见的频谱分析方法、AM 调制解调的推导与 Python 验证、FFT 的频谱分辨率与泄漏问题、常见考点速查清单、以及避坑排查表。代码基于 Python 的 NumPy 和 SciPy没有这些库的话先pip install numpy scipy matplotlib装好即可。1. 信号与系统核心知识速览先把这门课的几条主线列出来。信号与系统本质上就三件事信号的表示、系统对信号的响应、以及如何用变换域简化分析。而傅里叶变换和调制解调恰好把这三件事串起来了。概念解决的问题核心数学形式高频考点连续时间傅里叶变换 CTFT连续信号频率分析$X(j\omega)\int_{-\infty}^{\infty}x(t)e^{-j\omega t}dt$正反变换、性质、变换对离散时间傅里叶变换 DTFT离散序列频谱$X(e^{j\omega})\sum_{n-\infty}^{\infty}x[n]e^{-j\omega n}$频谱以 $2\pi$ 为周期离散傅里叶变换 DFT / FFT计算机离散频谱分析$X[k]\sum_{n0}^{N-1}x[n]e^{-j2\pi kn/N}$频率分辨率、截断泄漏拉普拉斯变换系统稳定性、暂态分析$X(s)\int_{-\infty}^{\infty}x(t)e^{-st}dt$收敛域、零极点、初值终值定理Z 变换离散系统分析$X(z)\sum_{n-\infty}^{\infty}x[n]z^{-n}$收敛域、因果性、稳定性卷积LTI 系统时域响应$y(t)x(t)*h(t)$卷积性质、图解卷积法采样定理离散化不失真条件$f_s \ge 2f_h$奈奎斯特频率、混叠调制解调频谱搬移与恢复$s(t)m(t)\cos(2\pi f_c t)$频谱结构、相干解调这几个概念不是孤立的。傅里叶变换把时域信号变成频域表示频谱分析就是用 FFT 等工具把频域表示计算出来调制则是把原始信号的频谱搬到高频载波附近解调是再搬回来。全部打通之后信号与系统这门课的骨架就立住了。2. 傅里叶变换从时域到频域信号还有另一种看法很多同学学FT时只记住了积分式不知道它到底在算什么。其实傅里叶变换做的事非常直观把一个信号拆成不同频率复指数信号的加权叠加。正变换$$X(j\omega)\int_{-\infty}^{\infty}x(t)e^{-j\omega t}dt$$反变换$$x(t)\frac{1}{2\pi}\int_{-\infty}^{\infty}X(j\omega)e^{j\omega t}d\omega$$其中 $X(j\omega)$ 是复数包含幅度和相位两部分写成极坐标形式就是 $X(j\omega)|X(j\omega)|e^{j\angle X(j\omega)}$。$|X(j\omega)|$ 叫幅度谱$\angle X(j\omega)$ 叫相位谱。我们平时说的“频谱”默认指幅度谱。傅里叶变换能成立是因为复指数信号 $e^{j\omega t}$ 是 LTI 系统的特征函数系统输入一个频率为 $\omega$ 的复指数输出仍然是同一个频率的复指数只是幅度和相位会变。这个性质直接导致了后面要讲的“频率响应”概念也是用傅里叶变换分析系统的数学基础。2.1 必须背下来的性质考试和实际工程里性质比积分式更常用。下面这张表是最核心的一组性质时域频域线性$a_1x_1(t)a_2x_2(t)$$a_1X_1(j\omega)a_2X_2(j\omega)$时移$x(t-t_0)$$X(j\omega)e^{-j\omega t_0}$频移$x(t)e^{j\omega_0 t}$$X(j(\omega-\omega_0))$尺度变换$x(at)$$\frac{1}{卷积定理$x(t)*h(t)$$X(j\omega)H(j\omega)$乘法调制$x(t)\cdot s(t)$$\frac{1}{2\pi}X(j\omega)*S(j\omega)$帕塞瓦尔定理$\intx(t)对偶性$X(t)$$2\pi x(-\omega)$注意“乘法”这一行它和“频移”性质配合就是调制解调的数学依据。信号在时域乘一个余弦等效于频域里把频谱搬移到载波频率的两侧。2.2 常用变换对速查时域信号傅里叶变换冲激信号 $\delta(t)$$1$常数 $1$$2\pi\delta(\omega)$阶跃信号 $u(t)$$\pi\delta(\omega)\frac{1}{j\omega}$矩形脉冲 $g_{\tau}(t)$$\tau\cdot Sa(\frac{\omega\tau}{2})$$\cos(\omega_0t)$$\pi[\delta(\omega-\omega_0)\delta(\omega\omega_0)]$$\sin(\omega_0t)$$-j\pi[\delta(\omega-\omega_0)-\delta(\omega\omega_0)]$单边指数 $e^{-at}u(t)$$\frac{1}{aj\omega}$这些变换对建议手推一遍不要死记。推的过程中你会自然理解“冲激的频谱是平的”“余弦的频谱是两根对称的冲激”这类结论后面分析调制信号时会直接用到。3. 频谱分析用 FFT 把频谱算出来理论上的频谱是连续函数但计算机只能处理离散、有限长的数据所以实际频谱分析绕不开三个关键词采样、截断、FFT。3.1 采样定理与混叠把连续信号 $x(t)$ 以采样率 $f_s$ 离散化得到 $x[n]x(nT_s)$其中 $T_s1/f_s$。要保证采样后频谱不发生混叠必须满足$$f_s \ge 2f_h$$$f_h$ 是信号最高频率分量。如果采样率不够高频分量会折叠到低频区域和真实低频分量叠在一起这个现象叫混叠。工程上一般不会真的取 $2f_h$至少留 20% 以上余量并在采样前加抗混叠低通滤波器。3.2 FFT 的频率分辨率对 $N$ 点离散序列做 DFT得到 $N$ 个频域采样点。每个频点对应的物理频率是$$f_k \frac{k\cdot f_s}{N},\quad k0,1,\dots,N-1$$相邻频点间隔是 $\Delta ff_s/N$这个值就是频率分辨率。细节分辨能力取决于采样时长 $TN/f_s$采样时间越长频率分辨率越细。要提高分辨率加长采样时间比单纯补零更有效补零只能让频谱曲线更平滑并不能解决真实分辨率的限制。3.3 频谱泄漏与加窗对无限长信号做截断等价于在时域乘一个矩形窗频域上原来的冲激谱就会变成 sinc 函数形状能量向旁边泄漏这叫频谱泄漏。如果信号频率不是频率分辨率的整数倍泄漏会特别明显。解决方法是加窗比如汉宁窗、汉明窗让截断边缘平滑过渡主瓣更集中、旁瓣更小。代价是主瓣会变宽频谱看起来“胖”一点。下面用 Python 演示一个 $5\text{Hz}$ 余弦信号被 $100\text{Hz}$ 载波调制的 AM 信号直接看 FFT 频谱。import numpy as np import matplotlib.pyplot as plt fs 1000 # 采样率 1000Hz T 1.0 # 采样时长 1s N int(fs * T) # 总点数 1000 t np.arange(N) / fs fm 5 # 调制信号频率 5Hz fc 100 # 载波频率 100Hz m 0.8 * np.cos(2 * np.pi * fm * t) # 调制信号 carrier np.cos(2 * np.pi * fc * t) # 载波 am (1 m) * carrier # 常规AM信号 # 直接 FFT观察频谱 X np.fft.fft(am) freq np.fft.fftfreq(N, 1/fs) # 只画正频率部分 half N // 2 plt.figure(figsize(10, 4)) plt.plot(freq[:half], 2.0 / N * np.abs(X[:half])) plt.title(AM signal spectrum (rectangular window)) plt.xlabel(Frequency (Hz)) plt.ylabel(Magnitude) plt.grid(True) plt.show()运行后可以看到频谱在 $100\text{Hz}$ 附近出现三根谱线一个是载波 $100\text{Hz}$另外两个分别是 $95\text{Hz}$ 和 $105\text{Hz}$对应调制信号的频谱搬移。如果采样时长不是整周期三根谱线会明显变胖这就是泄漏。加窗对比w np.hanning(N) Xw np.fft.fft(am * w) plt.figure(figsize(10, 4)) plt.plot(freq[:half], 2.0 / N * np.abs(Xw[:half]), labelHanning window) plt.plot(freq[:half], 2.0 / N * np.abs(X[:half]), alpha0.6, labelRectangular window) plt.title(Spectrum comparison: window vs no window) plt.xlabel(Frequency (Hz)) plt.ylabel(Magnitude) plt.legend() plt.grid(True) plt.show()加窗后旁瓣明显降低但主瓣更宽。实际工程中频谱分析不是“直接 FFT”就能完事选窗、设采样率、确定分析时长每一步都影响结果可读性。3.4 频谱分析的完整流程一套比较规范的频谱分析流程是明确信号最高频率确定采样率留足余量。设置采样时长使频率分辨率满足要求。必要时加抗混叠滤波去掉带外噪声。截断并加窗汉宁窗是常用默认选项。做 FFT用 $\frac{2}{N}|X[k]|$ 还原单边幅度谱。标注频率轴验证峰值频率是否符合预期。4. 调制与解调本质就是频谱搬移调制为什么存在一个直接原因是天线尺寸和传播效率。语音信号频率在几百到几千赫兹直接辐射效率很低也不适合多路复用。把信号搬到高频载波上之后天线尺寸可以做得合理而且不同业务用不同载波频率就能在同一个信道里互不干扰地传输。4.1 幅度调制 AM 的数学最简单的幅度调制是把消息信号 $m(t)$ 和一个高频载波相乘$$s_{DSB}(t)m(t)\cos(2\pi f_c t)$$这就是双边带抑制载波调制DSB-SC。用傅里叶变换的频移性质$$m(t)\cos(2\pi f_c t) \longleftrightarrow \frac{1}{2}\left[M(j(f-f_c)) M(j(ff_c))\right]$$时域乘法变成频域的频谱搬移原始频谱 $M(jf)$ 被复制到 $\pm f_c$ 两侧幅度减半。常规 AM 会在消息上再加一个直流偏置方便接收端用包络检波$$s_{AM}(t)\left[A_0m(t)\right]\cos(2\pi f_c t)$$这里的 $A_0$ 要保证 $A_0m(t)0$也就是调制度 $m_a\frac{|m(t)|_{max}}{A_0}$ 不超过 1。如果 $m_a1$包络会过调包络检波会失真。4.2 解调把频谱搬回去相干解调的思路是接收端再用一个同频同相载波乘一次把频谱搬回基带。$$y(t)s_{AM}(t)\cdot \cos(2\pi f_c t)$$展开后$$y(t)\left[A_0m(t)\right]\cos^2(2\pi f_c t)\left[A_0m(t)\right]\cdot\frac{1\cos(4\pi f_c t)}{2}$$第一项是 $A_0m(t)$ 的一半是基带信号第二项是载波二次谐波频率在 $2f_c$ 附近。用一个截止频率远低于 $2f_c$、高于消息最高频率的低通滤波器就能把基带信号滤出来再隔直去掉 $A_0/2$就恢复了 $m(t)/2$。4.3 Python 验证 AM 调制解调接着前面的信号做相干解调from scipy import signal # 相干解调本地载波相乘 local_carrier np.cos(2 * np.pi * fc * t) mix am * local_carrier # 设计低通滤波器截止频率 20Hz滤掉 2fc 分量 sos signal.butter(8, 20, lowpass, fsfs, outputsos) demod signal.sosfiltfilt(sos, mix) # 去掉直流偏置 A0/2再放大 2 倍 demod (demod - 0.5) * 2 plt.figure(figsize(10, 4)) plt.plot(t, m, labeloriginal message) plt.plot(t, demod, --, labeldemodulated) plt.title(AM coherent demodulation) plt.xlabel(Time (s)) plt.ylabel(Amplitude) plt.legend() plt.grid(True) plt.show()如果本地载波的频率和相位与发送端不一致解调输出会有频率偏移或幅度衰减相位差接近 $90^\circ$ 时输出直接趋近于零这是相干解调最需要注意的地方。工程上通常用锁相环或导频信号来恢复载波。5. 傅里叶变换与 LTI 系统分析傅里叶变换不仅用来做频谱分析它还把系统分析从卷积运算变成了乘法运算。5.1 频率响应对 LTI 系统输入 $x(t)e^{j\omega t}$输出是 $y(t)H(j\omega)e^{j\omega t}$其中$$H(j\omega)\int_{-\infty}^{\infty}h(t)e^{-j\omega t}dt$$$H(j\omega)$ 是系统的频率响应也就是单位冲激响应 $h(t)$ 的傅里叶变换。幅度 $|H(j\omega)|$ 是幅频特性相位 $\angle H(j\omega)$ 是相频特性。任何输入信号做傅里叶变换后每个频率分量乘以对应的 $H(j\omega)$就得到输出信号的频谱。这就是卷积定理给我们的工程红利$$y(t)x(t)*h(t) \longleftrightarrow Y(j\omega)X(j\omega)H(j\omega)$$5.2 频域滤波滤波器本质上就是设计一个 $H(j\omega)$让需要的频率分量通过把不需要的衰减掉。低通、高通、带通、带阻都是在频率响应的形状上做文章。Python 里可以用 SciPy 快速设计滤波器并观察它的频率响应# 设计一个截止频率 200Hz 的 8 阶低通滤波器 sos_lp signal.butter(8, 200, lowpass, fsfs, outputsos) w, h_resp signal.sosfreqz(sos_lp, worN2048, fsfs) plt.figure(figsize(10, 4)) plt.plot(w, 20 * np.log10(np.maximum(np.abs(h_resp), 1e-12))) plt.title(Butterworth lowpass filter magnitude response) plt.xlabel(Frequency (Hz)) plt.ylabel(Magnitude (dB)) plt.grid(True) plt.show()如果对一段信号做频域滤波也可以直接操作 FFT 结果把不需要的频段置零再 IFFT 回去。注意这样做会有边缘效应严格工程场景建议用滤波器实现而不是直接截频域。5.3 相关、匹配滤波与卷积定理卷积定理还支撑了另一个重要应用相关和匹配滤波。接收信号 $r(t)$ 与本地模板 $s(t)$ 做相关等价于 $r(t)$ 通过一个冲激响应为 $s(-t)$ 的匹配滤波器。雷达、通信、声呐里检测已知波形用的都是这个原理让有用信号分量积累增强让噪声因为随机相位无法相干积累从而提升信噪比。这个概念考试喜欢考“匹配滤波器的冲激响应是发射信号的镜像”实际工程里则是检测灵敏度的重要来源。6. 傅里叶变换的典型工程应用把前面的知识放到真实系统里看傅里叶变换几乎无处不在。语音与音频处理降噪、EQ 均衡、音频压缩MP3 的 MDCT 本质上是改进型 DFT 的一种都是先分析频谱再处理频谱。图像处理JPEG 用离散余弦变换做频域压缩图像模糊和锐化对应频域的低通和高通滤波。通信系统OFDM 把高速数据流拆到多个并行子载波上调制解调靠 IFFT/FFT 实现是 4G/5G 物理层的地基。雷达与声呐脉冲压缩靠匹配滤波多普勒频移检测靠 FFT 做频率估计。仪器测量数字示波器里的频谱分析、电机振动的故障特征提取都是 FFT 的日常应用。控制系统频率响应法分析系统稳定性伯德图本身就是傅里叶视角的扩展。可以说傅里叶变换不是一门课的考点而是信号处理类工作的通用语言。学会它之后再看 OFDM、滤波器设计、频谱监测这些内容思路会顺很多。7. 信号与系统速成复习清单如果你的目标是短期备考下面这份清单可以当目录用。每一条都建议做到“能默写出公式、能说出工程含义、能手算简单例题”。模块必备知识点常见题型信号基础冲激信号性质、阶跃、抽样、能量信号与功率信号求 $x(t)\delta(t-t_0)$、画波形傅里叶变换正反变换公式、常用变换对、性质表求频谱、画幅度谱和相位谱采样定理奈奎斯特频率、混叠条件、内插恢复判断采样后是否混叠、求最低采样率调制解调AM/DSB 的频谱结构、相干解调、包络检波画调制信号频谱、判断调制度LTI 系统卷积计算、频率响应、系统稳定性图解法卷积、求系统输出拉普拉斯/Z 变换收敛域、零极点、初值终值定理判断因果稳定性、反变换离散傅里叶DFT 定义、FFT 点数、频谱分辨率计算 $N$ 点 DFT、分析泄漏复习顺序建议先连续后离散先傅里叶后拉普拉斯。只要把“傅里叶变换是一种频谱视角调制解调是频谱搬移系统和滤波是频域乘一个 $H(j\omega)$”这三句话想明白大部分题目都能找到下手点。8. 常见问题与排查方法这里整理一份“信号分析避坑表”很多问题不是公式不会而是概念应用场景没对上问题现象可能原因排查方式解决方案FFT 结果在左右两边对称没有理解复指数谱的对称性观察实信号频谱是否偶对称只画正频率部分幅度乘 2频谱峰值频率偏了采样率、FFT 点数设置不对检查 $f_kk\cdot f_s/N$重新计算频率轴频谱出现不应该的分量混叠检查信号最高频率和采样率关系提高采样率或加抗混叠滤波实际单频信号频谱很宽截断泄漏看时域波形截断边界是否突变加汉宁窗或增大采样时长解调信号幅度很小本地载波频率/相位不同步对比载波振荡器参数用 PLL 恢复载波或加导频解调后还有高频毛刺低通滤波器截止频率太高看滤波器和 $2f_c$ 的差距降低截止频率或增加滤波阶数卷积结果和手算不一致卷积区间、边界处理错误先用简单序列验证用numpy.convolve对照IFFT 恢复信号有虚部频域操作破坏了共轭对称性检查频域是否保持 $X[k]X^*[N-k]$对实信号保持频域共轭对称9. 学习与实践建议如果你想把这门课的知识真正变成可用的能力而不是考完就忘建议按下面的方式做。第一每个公式都配合代码验证一遍。傅里叶正反变换、卷积定理、调制解调都可以在 Python 里用几分钟验证。代码验证过的结论比背十遍公式都牢固。第二保留一套可复用的频谱分析脚本。把采样率、窗函数、FFT 点数、频率轴计算封装成函数以后处理任何波形数据都能直接套用。第三手动做一遍关键推导。比如 AM 信号的频谱搬移过程从时域乘法到频域卷积再画出频谱图比如相干解调后 $2f_c$ 分量怎么被滤掉。这些步骤手推一次考试和工程理解都受益。第四做题时把“公式、性质、工程含义”三者对齐。单纯会套公式换一道复杂应用题就卡住能把性质说成“时域相乘就是频域卷积所以调制就是频谱搬移”这种话才算真正理解了。第五涉及实际通信、信号采集、音频处理时注意数据合规和测试环境隔离确保使用的是合法采集的、可公开使用的信号样本。10. 总结与下一步这次梳理的核心就三点傅里叶变换给了你频域视角频谱分析是把这个视角用 FFT 算出来同时要处理采样、泄漏、分辨率的问题调制解调是频谱在频域里搬出去再搬回来的过程AM 的相解调本质上就是“再乘一次载波、再用低通滤波把高频滤掉”。最容易踩的坑有三个采样率不够导致混叠、FFT 不关注分辨率导致谱峰错位、相干解调没有考虑载波同步导致信号丢失。建议你先做一件事把自己经常处理的信号比如一段录音、一段传感器数据跑一遍频谱分析标出主要频率分量再试着构造一个 AM 信号并完成解调。跑通之后信号与系统的知识框架就真正建立起来了。下一步可以往 OFDM 原理、数字滤波器设计或拉普拉斯变换的系统稳定性方向继续深入这时候你会发现这门课的所有内容都是连在一起的。