ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

周期信号傅里叶变换详解:从傅里叶级数到冲激串的推导与仿真

周期信号傅里叶变换详解:从傅里叶级数到冲激串的推导与仿真 周期信号是否真的存在傅里叶变换是很多初学信号与系统的读者最困惑的一点。教材里既说“周期信号不满足绝对可积条件不能用傅里叶变换”又会在频谱分析时直接画出周期信号的一根根离散谱线还用傅里叶变换去推导采样定理。这种前后“矛盾”很容易让人思路走偏。本文把这套逻辑完整梳理一遍先讲周期信号为什么能写成傅里叶级数再推导周期信号傅里叶变换为什么是一串冲激最后用 Python 做几个直观仿真帮助你把连续傅里叶变换、傅里叶级数、DFT/FFT 之间的关系一次串起来。阅读本文不需要很深的基础但如果你已经学过傅里叶级数和傅里叶变换的基本定义理解起来会更快。内容偏重原理讲解与工程对照比较适合电子信息、通信、自动化相关专业的学生也适合正在做频谱分析、采样系统设计、信号仿真开发的工程师。1. 为什么周期信号也能做傅里叶变换1.1 从傅里叶级数说起周期信号最自然的数学描述是傅里叶级数。一个周期为 (T) 的信号 (x(t))如果满足一定条件可以分解成一系列频率为基波频率整数倍的正弦、余弦分量之和。设基波角频率为[ \omega_0\frac{2\pi}{T} ]那么指数形式的傅里叶级数可以写成[ x(t)\sum_{n-\infty}^{\infty}C_n e^{jn\omega_0 t} ]其中傅里叶级数系数为[ C_n\frac{1}{T}\int_{T}x(t)e^{-jn\omega_0 t},dt ]这里的 (C_n) 是复数它的模反映了第 (n) 次谐波分量的幅度辐角反映了该次谐波的初始相位。由于 (n) 只取整数所以周期信号的频率分量天然就是离散的相邻两根谱线之间的频率间隔固定为[ \Delta f\frac{1}{T} ]这一条是整个周期信号频谱分析的基础。周期越长谱线越密周期越短谱线越疏。1.2 傅里叶变换的适用范围傅里叶变换通常定义为[ X(\omega)\int_{-\infty}^{\infty}x(t)e^{-j\omega t},dt ]这个式子对信号的时间范围没有限制积分区间是整个实轴。为了保证积分收敛一般要求信号满足绝对可积或平方可积条件。对于周期信号而言它在整个时间轴上无限重复。只要信号不是恒等于零它在无限区间上的能量就是无穷大因此直接代入上式积分往往不收敛。所以严格地说在普通函数意义下周期信号没有经典傅里叶变换。但这并不影响工程中使用周期信号频谱因为我们可以引入冲激函数在广义函数意义下定义它的傅里叶变换。这就解释了教材中看似矛盾的现象一方面说周期信号不满足傅里叶变换条件另一方面正弦信号、周期方波、周期冲激串又都给出了对应的傅里叶变换表达式。这两种说法的本质区别在于是不是允许使用冲激函数。1.3 周期信号频谱的特殊形态周期信号傅里叶级数中的谱线表示的是“某次谐波的幅度”单位是信号本身的物理单位例如伏特而傅里叶变换的物理含义是“频谱密度”单位是信号单位除以赫兹或弧度每秒。当周期信号的傅里叶变换中出现冲激时冲激的强度才有实际意义直接画“高度”没有意义。如果只看这个区别初学者很容易把傅里叶级数系数 (C_n) 和傅里叶变换 (X(\omega)) 混淆。后面我们会证明这两个概念之间有非常简单漂亮的换算关系[ X(\omega)2\pi\sum_{n-\infty}^{\infty}C_n\delta(\omega-n\omega_0) ]也就是说周期信号的傅里叶变换是一组位于离散频率点 (n\omega_0) 处的冲激每个冲激的强度由傅里叶级数系数乘以 (2\pi) 得到。这个结论是贯穿全文的核心。2. 数学基础傅里叶级数与几个重要条件2.1 三角函数形式与指数形式很多教材先从三角函数形式的傅里叶级数讲起[ x(t)a_0\sum_{n1}^{\infty}\left(a_n\cos(n\omega_0 t)b_n\sin(n\omega_0 t)\right) ]其中[ a_0\frac{1}{T}\int_{T}x(t),dt ][ a_n\frac{2}{T}\int_{T}x(t)\cos(n\omega_0 t),dt ][ b_n\frac{2}{T}\int_{T}x(t)\sin(n\omega_0 t),dt ]三角函数形式直观便于理解奇偶性带来的化简。指数形式则更简洁也更适合与傅里叶变换、卷积运算衔接。两种形式通过欧拉公式转换[ e^{j\theta}\cos\thetaj\sin\theta ]在推导周期信号的傅里叶变换时使用指数形式最方便因为每个复指数分量的傅里叶变换形式非常清晰。2.2 狄利克雷条件与吉布斯现象并不是所有周期信号都能展开成傅里叶级数。傅里叶级数存在的充分条件通常称为狄利克雷条件主要包括三条条件说明在一个周期内绝对可积信号在一个周期内积分的绝对值有限在一个周期内只有有限个极值点不能在一个周期内无限次上下震荡在一个周期内只有有限个间断点间断点处的跳变值也必须有限工程中遇到的周期信号绝大多数都能满足这些条件。即使是理想方波在一个周期内也只有两个跳变点完全可以展开成傅里叶级数。吉布斯现象是傅里叶级数截断时的典型现象用有限次谐波去逼近一个带有跳变的周期信号时在跳变点附近会出现固定大小的过冲约为跳变值的 9%。随着谐波次数增加过冲会越来越窄但峰值不会消失。这不是算法实现错误而是傅里叶级数逼近本身的性质在实际滤波器设计和波形合成中需要留意。2.3 为什么一定要引入冲激函数如果只在“常规函数”范围内讨论周期信号没有傅里叶变换。但实际频谱分析、调制解调、采样理论都要用到周期信号的傅里叶变换。引入单位冲激函数 (\delta(t)) 后傅里叶变换可以推广到广义函数。例如常数信号的傅里叶变换为一个冲激[ 1 \longleftrightarrow 2\pi\delta(\omega) ]直流信号只在零频率处有能量所以它的频谱是位于 (\omega0) 处的冲激。这个结论是后面推导周期信号傅里叶变换的基础。3. 核心推导周期信号的傅里叶变换3.1 先求复指数信号的傅里叶变换考虑最简单的周期复指数信号[ x(t)e^{j\omega_0 t} ]由常数信号傅里叶变换对和傅里叶变换的频移性质可以得到[ e^{j\omega_0 t}\longleftrightarrow 2\pi\delta(\omega-\omega_0) ]频移性质的本质是时域乘以一个复指数相当于频谱在频域搬移。所以单频复指数信号的频谱是一个位于 (\omega\omega_0) 处的冲激。同理[ e^{-j\omega_0 t}\longleftrightarrow 2\pi\delta(\omega\omega_0) ]这个结果虽然简单却是整个周期信号傅里叶变换推导的基石。3.2 对傅里叶级数逐项做变换设 (x(t)) 是周期为 (T) 的信号其指数形式傅里叶级数为[ x(t)\sum_{n-\infty}^{\infty}C_n e^{jn\omega_0 t} ]对等号两边同时做傅里叶变换。由于傅里叶变换具有线性性质可以将变换运算交换到求和号内部[ X(\omega)\sum_{n-\infty}^{\infty}C_n\cdot \mathcal{F}\left{e^{jn\omega_0 t}\right} ]根据上一小节的结论[ \mathcal{F}\left{e^{jn\omega_0 t}\right} 2\pi\delta(\omega-n\omega_0) ]所以最终得到[ X(\omega)2\pi\sum_{n-\infty}^{\infty}C_n\delta(\omega-n\omega_0) ]这就是周期信号傅里叶变换的通用公式。它说明周期信号的频谱不是连续曲线而是一串冲激每个冲激出现在谐波频率 (n\omega_0) 上强度与该次谐波的傅里叶级数系数成正比。3.3 离散谱与频谱密度之间的关系有时候读者会问为什么书上写周期矩形脉冲的频谱是一根根“线谱”但又说傅里叶变换结果是冲激这两种说法是否矛盾不矛盾。傅里叶级数分析给出的是离散的幅度谱纵轴是各次谐波的幅度 (C_n)。傅里叶变换给出的则是一个“密度”概念在谐波频率处密度为无穷大因此用冲激表示。平时画频谱图时习惯直接画 (C_n) 的离散谱线但严格写成傅里叶变换表达式时必须保留 (2\pi\delta(\omega-n\omega_0))。如果把周期信号的周期 (T) 不断增大基波频率 (\omega_0) 会不断减小谱线会不断变密。当周期趋于无穷大即信号退化为非周期信号时离散谱就过渡成了连续谱。这就是从傅里叶级数到傅里叶变换的极限视角。4. 常见周期信号的傅里叶变换4.1 余弦信号与正弦信号对于余弦信号[ \cos(\omega_0 t)\frac{e^{j\omega_0 t}e^{-j\omega_0 t}}{2} ]利用前文复指数的傅里叶变换结果可得[ \cos(\omega_0 t) \longleftrightarrow \pi\left[\delta(\omega-\omega_0)\delta(\omega\omega_0)\right] ]也就是说余弦信号的频谱是左右对称的两根冲激一根在正频率 (\omega_0) 处一根在负频率 (-\omega_0) 处。对于正弦信号[ \sin(\omega_0 t) \frac{e^{j\omega_0 t}-e^{-j\omega_0 t}}{2j} ]其傅里叶变换为[ \sin(\omega_0 t) \longleftrightarrow j\pi\left[\delta(\omega\omega_0)-\delta(\omega-\omega_0)\right] ]两个冲激的方向相反体现了正弦函数的奇对称性。4.2 周期矩形脉冲串周期矩形脉冲串是工程中非常典型的周期信号。设脉冲幅度为 (A)脉冲宽度为 (\tau)周期为 (T)且在一个周期内[ x(t) \begin{cases} A, |t|\le \frac{\tau}{2}\ 0, \frac{\tau}{2}|t|\frac{T}{2} \end{cases} ]先计算傅里叶级数系数。直流分量为[ C_0\frac{A\tau}{T} ]第 (n) 次谐波系数为[ C_n\frac{A\tau}{T}\cdot\frac{\sin(n\omega_0\tau/2)}{n\omega_0\tau/2} ]其中 (\omega_02\pi/T)。于是周期矩形脉冲串的傅里叶变换为[ X(\omega) 2\pi\sum_{n-\infty}^{\infty} \frac{A\tau}{T} \frac{\sin(n\omega_0\tau/2)}{n\omega_0\tau/2} \delta(\omega-n\omega_0) ]这个结果有很多工程结论。谱线包络的第一个零点在频率 (1/\tau) 附近脉宽越窄包络的主瓣越宽高频分量越丰富。所以窄脉冲的带宽往往比宽脉冲更大这在雷达和通信系统中直接影响距离分辨率和带宽设计。4.3 周期冲激串周期冲激串可以写成[ p(t)\sum_{m-\infty}^{\infty}\delta(t-mT) ]它在每个整数倍周期处都有一个单位冲激。对它求傅里叶级数时只需要在一个周期内积分[ C_n\frac{1}{T}\int_{-T/2}^{T/2}\delta(t)e^{-jn\omega_0 t},dt \frac{1}{T} ]也就是说周期冲激串的所有谐波分量的幅度相同都等于 (1/T)。因此其傅里叶变换为[ P(\omega)\frac{2\pi}{T}\sum_{n-\infty}^{\infty}\delta(\omega-n\omega_0) ]这是一个非常有对称美的结论时域中的周期冲激串其傅里叶变换仍然是频域中的周期冲激串。冲激串在采样理论中非常关键现实中的理想采样就可以抽象成信号乘以周期冲激串。4.4 常用变换对速查时域信号傅里叶变换(1)(2\pi\delta(\omega))(e^{j\omega_0 t})(2\pi\delta(\omega-\omega_0))(\cos(\omega_0 t))(\pi[\delta(\omega-\omega_0)\delta(\omega\omega_0)])(\sin(\omega_0 t))(j\pi[\delta(\omega\omega_0)-\delta(\omega-\omega_0)])周期冲激串 (\sum\delta(t-mT))(\frac{2\pi}{T}\sum\delta(\omega-n\omega_0))周期信号 (\sum C_n e^{jn\omega_0 t})(2\pi\sum C_n\delta(\omega-n\omega_0))这张表不需要死记关键在于理解两个变换规则复指数函数的傅里叶变换是一个冲激傅里叶级数与傅里叶变换之间存在 (2\pi C_n) 的缩放关系。5. 从连续到离散与 DFT/FFT 的关系5.1 为什么要单独讨论离散频率连续周期信号理论上用傅里叶级数就可以分析但实际工程中信号进入计算机前必须采样计算机只能处理有限长度的离散序列。真正在代码里跑的是 FFT它在数学上对应的是离散傅里叶变换。很多同学把 FFT 的结果直接理解成“周期信号的傅里叶变换”实际上这中间还需要经过采样和截断两个步骤。周期信号先被采样成离散序列再被截断成有限长度然后做 FFT。每一步都会影响最终看到的频谱形态。如果采样频率为 (f_s)采样点数为 (N)那么 FFT 的频率分辨率是[ \Delta f\frac{f_s}{N}\frac{1}{T_{window}} ]其中[ T_{window}N\cdot T_s ]是时域截断窗口的总时长。窗口长度越长频率分辨率越高谱线之间的间距越小。5.2 栅栏效应与整数周期截断假设一个连续周期信号的基频是 (f_05\text{Hz})采样率 (f_s1000\text{Hz})窗口长度 (T_{window}1\text{s})那么 FFT 频率分辨率为 (1\text{Hz})5Hz 正好落在某个离散频点上。这种情况下FFT 结果中可以看到非常清晰的谱线因为窗口里包含了完整的 5 个信号周期。如果窗口长度改为 (0.9\text{s})FFT 分辨率变为 (1/0.9\approx1.11\text{Hz})5Hz 就不再是离散频点的整数倍。此时信号能量会“泄漏”到所有相邻频点原本单根的谱线变成一片旁瓣。这就是栅栏效应和频谱泄漏带来的影响。从数学上说对无限长序列做矩形窗截断相当于原信号频谱与一个 (\text{sinc}) 函数的卷积。(\text{sinc}) 函数的旁瓣就是我们看到的泄漏分量。因此做频谱分析时让窗口长度尽量覆盖信号周期的整数倍是降低泄漏最简单有效的手段之一。5.3 频谱泄漏的工程本质频谱泄漏不是 FFT 算法本身的问题而是把无限长周期信号硬生生截断产生的。截断相当于给信号乘上了一个矩形窗而矩形窗在频域有旁瓣。这些旁瓣和原信号的谱线卷积后就形成了泄漏。如果截断长度刚好是整数个周期矩形窗的频域零点正好落在其他谐波谱线上泄漏在离散采样点上就不会被看到。一旦截断长度不是整数周期任何谐波谱线都会受到相邻旁瓣的干扰频谱就变得不再干净。同理当信号本身不是严格周期时“整数周期截断”无从谈起就需要使用汉宁窗、海明窗等窗函数来压低旁瓣代价是主瓣会变宽。这是频谱分析中一个典型的权衡。6. Python 仿真验证6.1 环境准备本文示例使用 Python 3 编写依赖 NumPy 和 Matplotlib。如果还没有安装可以执行pip install numpy matplotlib代码中会用到以下模块import numpy as np import matplotlib.pyplot as plt下文所有代码都是完整可运行的。建议在 Jupyter Notebook 或 VS Code 中逐段运行观察输出。6.2 用傅里叶级数合成方波先看最直观的例子方波可以由无限多次奇次谐波叠加而成。取一个周期为 (T1\text{s})、幅度 (A1) 的奇对称方波在一个周期内[ x(t) \begin{cases} 1, 0t\frac{T}{2}\ -1, \frac{T}{2}tT \end{cases} ]它的三角形式傅里叶级数为[ x(t)\frac{4}{\pi}\sum_{k1,3,5,\dots}\frac{1}{k}\sin(2\pi k f_0 t) ]下面的代码用前 21 次谐波合成方波并与理想方波对比import numpy as np import matplotlib.pyplot as plt f0 1.0 # 基频 1Hz T 1.0 / f0 # 周期 fs 10000 # 绘图时的高采样率 t np.linspace(0, 2 * T, int(fs * 2 * T), endpointFalse) # 理想方波前半周期为 1后半周期为 -1 x_ideal np.where(np.mod(t, T) T / 2, 1.0, -1.0) def fs_square(t, A1.0, f01.0, n_terms21): 用前 n_terms 次奇次谐波合成方波 x np.zeros_like(t) for k in range(1, n_terms 1, 2): x (1.0 / k) * np.sin(2 * np.pi * f0 * k * t) return 4 * A / np.pi * x x_21 fs_square(t, A1.0, f0f0, n_terms21) plt.figure(figsize(10, 4)) plt.plot(t, x_ideal, k--, linewidth1.5, labelideal square wave) plt.plot(t, x_21, linewidth1.0, labelFourier series, N21) plt.xlabel(t/s) plt.ylabel(x(t)) plt.legend() plt.grid(True) plt.tight_layout() plt.show()运行这段代码可以明显看到在方波跳变处合成波形出现了振荡这就是吉布斯现象。谐波次数越高振荡范围越靠近跳变点过冲幅度仍然保持在跳变值的 9% 左右。6.3 计算周期矩形脉冲的傅里叶级数系数矩形脉冲串的傅里叶级数系数适合用 NumPy 批量计算。设幅度 (A1)周期 (T1\text{s})脉冲宽度 (\tau0.2\text{s})。import numpy as np A 1.0 T 1.0 tau 0.2 w0 2 * np.pi / T # 计算 n 从 -10 到 10 的傅里叶级数系数 n_arr np.arange(-10, 11) C np.zeros_like(n_arr, dtypefloat) for i, n in enumerate(n_arr): if n 0: C[i] A * tau / T else: C[i] (A * tau / T) * np.sin(n * w0 * tau / 2) / (n * w0 * tau / 2) for n, c in zip(n_arr, C): print(fn{n:3d}, C_n{c:.6f})从输出中可以观察到两个结论第一直流系数为 (0.2)等于脉冲占空比第二系数在 (n5) 附近接近 0因为频谱包络的第一个零点出现在[ \frac{n\omega_0\tau}{2}\pi ]即[ n\frac{T}{\tau}5 ]这说明脉冲越窄包络零点的 (n) 越大高频分量衰减越慢。6.4 FFT 谱线与截断泄漏对比下面用 FFT 观察方波的谱线并对比“整周期截断”和“非整周期截断”的区别。这里用方波代替矩形脉冲串重点看谱线位置和泄漏形态。import numpy as np import matplotlib.pyplot as plt fs 1000.0 f0 5.0 def make_square(T_total): 生成 T_total 秒的 5Hz 方波 N int(fs * T_total) t np.arange(N) / fs # 使用余弦型方波避免采样点正好落在跳变点附近 x np.sign(np.cos(2 * np.pi * f0 * t)) return x def single_side_spectrum(x): 计算单边幅度谱 N len(x) X np.fft.fft(x) freq np.fft.fftfreq(N, 1 / fs) half N // 2 mag np.abs(X[:half]) * 2 / N return freq[:half], mag # 第一种情况窗口长度 1s正好包含 5 个完整周期 plt.figure(figsize(12, 8)) x1 make_square(1.0) freq1, mag1 single_side_spectrum(x1) plt.subplot(2, 1, 1) plt.stem(freq1, mag1, basefmt ) plt.xlim(0, 60) plt.title(Integer period truncation: 1.0s window) plt.xlabel(Frequency (Hz)) plt.ylabel(Magnitude) plt.grid(True) # 第二种情况窗口长度 0.9s包含 4.5 个周期不是完整周期 x2 make_square(0.9) freq2, mag2 single_side_spectrum(x2) plt.subplot(2, 1, 2) plt.stem(freq2, mag2, basefmt ) plt.xlim(0, 60) plt.title(Non-integer period truncation: 0.9s window) plt.xlabel(Frequency (Hz)) plt.ylabel(Magnitude) plt.grid(True) plt.tight_layout() plt.show()运行后可以看到上图中理想位置 (5\text{Hz},15\text{Hz},25\text{Hz}\dots) 处出现清晰谱峰且偶次谐波接近 0。下图由于截断窗口不是整数周期频谱上出现了大量旁瓣谱峰也不再集中在少数几个频点上。这就是频谱泄漏的直观体现。需要注意这里绘制的是幅度谱的显示值FFT 数值做过 (2/N) 的单边谱显示处理并没有对窗函数效应做精细补偿。工程上如果要与理论傅里叶级数系数精确对比还需要考虑窗函数、采样点数、信号幅度等因素。7. 常见问题与误区排查问题现象常见原因解决思路周期信号直接代入傅里叶变换公式不收敛信号不满足绝对可积条件常规傅里叶变换不存在引入冲激函数使用广义傅里叶变换定义把 (C_n) 和 (X(\omega)) 当成同一个量傅里叶级数是离散幅度谱傅里叶变换是频谱密度记住关系 (X(\omega)2\pi\sum C_n\delta(\omega-n\omega_0))FFT 得到的谱线和理论谱线不完全一致截断窗口没有包含整数倍周期或归一化方式不同尽量整周期截断并确认 DFT 归一化方式矩形脉冲频谱零点位置找不到零点位置与脉宽和周期有关不是固定值计算 (nT/\tau)或绘制包络函数观察有限谐波合成方波有振荡吉布斯现象不是程序错误增加谐波次数振荡会变窄但过冲不会完全消失频谱图出现非谐波频率分量频谱泄漏、采样率不足或信号本身不稳定检查时域截断长度必要时加窗函数8. 工程建议与最佳实践8.1 频谱分析前先预估基频做周期信号频谱分析时不要一上来就写 FFT。先明确信号的周期 (T) 或基频 (f_0)然后设计采样参数尽量让窗口长度等于信号周期的整数倍。这样能显著减少频谱泄漏得到的谱线也更接近理论分析结果。如果事先不知道信号周期可以先做一次粗略 FFT从频谱中找到峰值位置再反向调整窗口长度做第二次精细分析。这种“先粗后细”的流程在实际数据处理中很实用。8.2 注意理论谱与 FFT 幅度谱的归一化理论分析中周期矩形脉冲的傅里叶级数系数 (C_n) 是一个与采样无关的连续数学量。而 FFT 输出的幅度与采样点数 (N)、窗函数、信号幅度都有关系。不要直接把 FFT 纵轴和理论 (C_n) 画在同一张图里比较必须先明确归一化方式。对于包含直流分量的实信号单边谱的直流分量通常除以 (N)其他频率分量乘以 (2/N)。这只是一种常用显示方式不同教材和软件实现可能有差异阅读文档时要留意。8.3 谨慎处理冲激函数冲激函数是广义函数不能把它当作普通函数去计算函数值。在论文或报告中写周期信号的傅里叶变换时要明确写出“在广义函数意义下”或“引入冲激函数后”这个前提。否则容易在数学严谨性上出问题。在代码中不要试图直接生成一个真正的 (\delta(t)) 序列来模拟冲激DFT 中不会出现冲激函数。要观察周期信号频谱直接分析 FFT 谱峰即可不要把“理论冲激串”和“FFT 谱线”混为一谈。8.4 条件允许时使用解析公式交叉验证FFT 能给出数值结果但数值结果容易掩盖理解层面的错误。建议对矩形脉冲、方波、正弦信号这类可以被解析求解的周期信号先用傅里叶级数公式算出理论系数再和 FFT 结果对比。如果两者谱峰位置和相对幅度不一致通常说明采样参数或截断方式有问题。这种“理论解析 数值验证”的方法比单纯运行代码更可靠也能帮助你在调试复杂信号时快速定位问题。9. 总结与后续学习路线这篇内容可以提炼成三个核心结论第一周期信号在常规函数意义下没有傅里叶变换
返回列表