news 2026/9/19 19:02:17

方波信号的傅里叶分解与合成:MATLAB实验与吉布斯现象解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
方波信号的傅里叶分解与合成:MATLAB实验与吉布斯现象解析

简介:信号与系统课程中关于信号分解与合成实验的完整报告文档,适合电子信息类本科在读学生、备考或开展信号处理实验的初学者使用。内容依托实验五任务,涵盖方波与三角波信号的分解、各次谐波提取与再合成,并给出示波器观测结果、傅里叶级数系数比例验证及原理总结,可帮助读者快速理解有源带通滤波器选频、谐波幅度相位匹配等核心环节。压缩包为单份docx文档,共1个文件,大小589KB,排版结构与实验流程直接对应,便于查看和打印。该资源已被447人浏览学习,说明其对同类实验有现实参考价值。读者拿到后可直接对照其中的实验记录、波形说明和结论要点,形成自己的实验报告,同时借助方波、三角波频谱差异的分析提升对信号分解与合成基本原理的掌握。

1. 信号分解与合成实验:一条亲手走通的时域到频域回路

把方波拆开再装回去,中间隔着的就是傅里叶级数。这个实验的核心动作只有两个:先按频率把信号拆成不同振幅和相位的正弦分量,再把有限项分量重新叠回时域波形。看起来像是在验证数学公式,但它真正想让你理解的是工程里每天都在用的那件事——任何实际系统都是带限的,你拿到的永远不是原信号,而是它在有限带宽下的重构结果。读这一章的读者,无论你是正在做实验报告、备考信号与系统还是想补傅里叶分析的直觉,都值得把这条“时域→频域→时域”的回路亲手走通,它比背十遍变换对都有用。

2. 从傅里叶级数到吉布斯现象:分解与合成的理论边界

做实验之前,先回答一个问题:为什么一个周期矩形波可以被拆成一组正弦信号的加权和,而且是唯一的一组?如果拆法不唯一,合成结果就谈不上“还原”。这一章把傅里叶级数的适用条件、方波的系数特征和吉布斯现象摆清楚,后面写代码时才不会只看波形不问依据。

2.1 周期信号为什么能拆成三角级数

傅里叶级数的底气来自正交性。在区间 $(t_0, t_0+T)$ 上,三角函数系 ${1, \cos(n\omega_0 t), \sin(n\omega_0 t)}$($n=1,2,\dots$)满足两两正交:任意两个不同函数的乘积在一个周期内积分为零,只有自身与自身相乘时积分不为零。这意味着每个正弦分量在“信号空间”里都占据独立的坐标轴,把周期信号往这些坐标轴上投影,得到的就是各次谐波的幅度系数。

对实周期信号 $x(t)$,傅里叶级数写成

$$x(t) = a_0 + \sum_{n=1}^{\infty}\left[a_n\cos(n\omega_0 t) + b_n\sin(n\omega_0 t)\right]$$

其中 $\omega_0 = 2\pi/T$,系数为

$$a_n = \frac{2}{T}\int_{t_0}^{t_0+T} x(t)\cos(n\omega_0 t),dt, \qquad b_n = \frac{2}{T}\int_{t_0}^{t_0+T} x(t)\sin(n\omega_0 t),dt$$

$a_0$ 对应直流分量。正交性保证系数唯一,合成时分量之间不会互相污染。实验里常出现的错误是只把几个谐波幅度加起来,忘了每项前面的 $\frac{4}{\pi}$ 这类归一化系数,结果合成波形的幅度明显偏小,根源就是没从系数公式出发而是靠猜。

对于幅度为 $\pm 1$ 的周期方波,套用 $b_n$ 公式可得 $b_n = \frac{2}{n\pi}(1 - \cos n\pi)$。当 $n$ 为奇数时 $b_n = \frac{4}{n\pi}$,偶数时为 0。所以方波频谱只有奇次谐波,且幅度按 $1/n$ 衰减。这个衰减速度决定了重构方波难度不小:虽然系数幅度不断变小,但谐波数量多,跳变沿需要大量高频分量才能“立”起来。

2.2 收敛条件与方波的特殊地位

并非所有周期信号都能安全地做傅里叶展开。狄利克雷条件给出三条限制:信号在一个周期内只有有限个极值点、有限个第一类间断点,且绝对可积。周期方波恰好满足这三个条件,所以它成了分解实验的首选对象。三角波、锯齿波同样满足,但方波的间断点最尖锐,合成时的行为也最具代表性。

收敛这件事要在两种点上分开看。在信号连续点上,部分和随 $N \to \infty$ 收敛于 $x(t)$;在间断点处,级数收敛到跳变的中点,也就是 $\frac{x(t_0^+) + x(t_0^-)}{2}$。用 MATLAB 画方波时,跳变处经常出现一个竖线或过冲,代码里如果不对 $t=0$ 这类点做特殊处理,画出来的图在跳变点附近形态会和手算结果对不上。

2.3 吉布斯现象:过冲不会随着 N 增大而消失

有限项合成时,跳变沿附近会出现固定幅度的振铃,这就是吉布斯现象。关键结论是:无论把截断阶数 $N$ 提高到多大,过冲幅度都不会趋于零。方波跳变幅度为 2(从 $-1$ 到 $+1$),过冲量约为跳变高度的 $8.95%$,也就是峰峰值约 $0.179$。随着 $N$ 增大,过冲区域不断向跳变点压缩,波形看起来越来越“陡”,但过冲的绝对高度基本不变。

下表总结了几种常见周期信号的系数衰减与收敛表现,写报告时可以用来对比论证。

信号类型傅里叶系数衰减间断点合成时最明显的现象
方波$1/n$吉布斯过冲约 8.95%
三角波$1/n^2$收敛快,少量阶次即贴合
锯齿波$1/n$跳变处同样出现过冲
半波整流$1/n^2$有(导数不连续)直流分量必须保留

系数的衰减速度决定了“截断误差”的主导形式。$1/n$ 的衰减意味着每提高一倍的谐波次数,只减少一半的残余能量,所以方波需要较多谐波才能让波形边缘看起来像样;$1/n^2$ 的衰减则快得多,三角波用前 5~10 次谐波就基本看不出差别了。

3. MATLAB 最小实现:方波逐次谐波分解与合成

理论归理论,落到实验报告上,最核心的产出就是一张“不同谐波阶次叠加逼近方波”的图。下面这套代码在 MATLAB 里可以直接跑通,生成合成对比图和能量收敛曲线,覆盖实验五最常见的两个要求。建议不要直接复制了事,逐行看清楚再改参数。

3.1 完整代码:一个文件跑出分解合成主图

% 实验五:周期方波的傅里叶分解与合成 % 参数定义 T = 2*pi; % 方波周期,基波角频率 w0 = 1 w0 = 2*pi/T; % 基频 fs = 5000; % 每周期采样点数,决定波形平滑度 t = linspace(-2*T, 2*T, 4*fs+1); % 时间轴,显示 4 个周期 % 理想方波:幅度 +-1 square_wave = sign(sin(w0*t)); % 需要观察的截断谐波阶次,从 1 到 21 N_list = [1 3 5 9 21]; legend_label = {'理想方波'}; figure('Position', [100 100 900 500]); hold on; plot(t, square_wave, 'k', 'LineWidth', 1.5); % 黑色理想方波 for N = N_list f_series = zeros(size(t)); % 每次从零开始重新叠加 for n = 1:2:N % 只取奇次谐波 f_series = f_series + (4/pi) * (1/n) * sin(n*w0*t); end plot(t, f_series, 'LineWidth', 1); legend_label{end+1} = sprintf('N=%d', N); end legend(legend_label, 'FontSize', 9, 'Location', 'northeast'); xlabel('时间 t'); ylabel('幅度'); title('方波信号的傅里叶合成:奇次谐波逐次逼近'); grid on; axis([-2*T 2*T -1.6 1.6]);

这段代码把合成过程画成一组曲线:N=1只有基波,是一条正弦;N=3开始出现方波轮廓;到N=21时波形边缘已经比较陡,但跳变处仍能看出振铃。1:2:N这个步长写法只遍历奇数下标,因为偶数次谐波的傅里叶系数本来为 0,加进去也只会增加计算量。4/pi*(1/n)是对应 $n$ 次奇次谐波的幅度系数,来自 $b_n = 4/(n\pi)$。zeros(size(t))保证每组 $N$ 都从空信号开始累加,避免上一次循环的残留污染结果。

3.2 代码逻辑说明:为什么循环步长是 2

方波分解实验最容易写错的地方,是把循环写成for n = 1:N,把偶次项也算进去。偶次谐波系数为 0,结果虽然不变,但计算时间翻倍且代码表达不准确。更隐蔽的错误是幅度系数漏写 $\pi$,比如直接写(1/n)*sin(...),合成波形幅度会明显小于 1,因为傅里叶系数的归一化被丢了。

这里还涉及一个相位问题。上面代码用的是 $\sin(n\omega_0 t)$,对应的是奇函数方波(起点为 0,形状关于原点对称)。如果把 $\sin$ 全部换成 $\cos$,合成出来的波形相位偏了 90 度,结果完全是另一条曲线,不再是方波。实验报告里一般要求画出“分解出的基波、三次谐波、五次谐波单独波形”,再画“叠加后的合成波形”。单次谐波的画法是在循环体内单独成图,或者把每次的f_series存成矩阵再拆分。

3.3 用能量收敛曲线验证分解的完整性

波形趋近只说明视觉上的相似,报告里还需要一个量化指标。帕塞瓦尔定理给出:周期信号的平均功率等于各谐波分量平均功率之和。对幅度为 $\pm 1$ 的方波,总平均功率为 1,前 $N$ 次谐波的累计功率占比可以直接计算。

N_max = 100; n_odd = 1:2:N_max; a_n = 4./(pi*n_odd); % 各奇次谐波幅度 pow_odd = 0.5 * a_n.^2; % 单次谐波的平均功率 pow_total = 1; % 幅度 +-1 方波的平均功率 cum_pct = cumsum(pow_odd) / pow_total * 100; figure; plot(n_odd, cum_pct, 'o-'); xlabel('谐波阶次 n'); ylabel('累计能量占比 (%)'); title('有限项谐波合成的能量收敛'); grid on;

cumsum是 MATLAB 的累计和函数,逐项把前 $N$ 项功率加起来。0.5*a_n.^2来自正弦信号平均功率公式:幅度为 $A$ 的正弦平均功率是 $A^2/2$。运行后可以看到,$N=1$ 时能量只占约 81%,$N=9$ 时约 96%,到 $N=21$ 时约 98%。这个收敛速度说明:少量谐波就能捕获大部分能量,但剩下那 2% 的能量正好对应跳变沿的“陡峭程度”,所以视觉上依然能看出振铃。

4. 参数设置与易错点:采样率、截断阶数、相位对齐

MATLAB 仿真看似没有硬件约束,但时间轴点数、截断阶数和相位选择会直接改变实验结果。实验报告里如果波形“不对劲”,九成出在这三类参数上。这一章把每个参数的影响和推荐值列清楚,照着排查能少走弯路。

4.1 时间轴与采样点数:先保证波形不发“毛边”

linspace(-2*T, 2*T, 4*fs+1)fs是每周期采样点数,整段信号共 4 个周期,点数设为4*fs+1是为了让首尾对应同一个相位。若fs太小(比如 50),合成后的高频谐波在图上会呈明显折线,看起来像噪声叠加,容易误判为算法错误。仿真时建议每周期至少 2000 点,上面代码用 5000 点,曲线足够平滑。

还有个细节容易被忽略:sign(sin(w0*t))在 $t=0$、$t=\pm\pi$ 等跳变点处,sin的数值可能是一个很小的非零值,而不是严格 0,导致理想方波在跳变处出现一个窄脉冲。严格的方波在跳变点应该定义为中点值 0,但绘图时单点差异几乎不可见。如果想严谨,可以在生成square_wave后加一行square_wave(abs(square_wave)<1) = 0,把跳变处强制归零。

4.2 截断阶数 N 的选择:不是越大越好

N 太小,波形圆角明显;N 太大,叠加循环变慢,且吉布斯过冲依然存在。实验里常用取法是 $N=1,3,5,9,21$,用五条曲线展示渐进过程。工程上选 $N=20\sim50$ 里任意一个奇数即可,能量占比都在 98% 以上。下面这张表可以直接用于报告中的参数说明。

谐波阶次 N累计能量占比合成波形特征
181.1%正弦,幅度约 1.27,明显不是方波
390.1%顶部变平,跳变处出现第一个过冲
593.3%上升沿变陡,振铃范围收紧
996.3%视觉上已接近方波,顶部微有起伏
2198.2%近似方波,跳变沿仍有约 8.95% 过冲

需要特别说明的是,上表的能量占比是在幅度为 $\pm 1$ 的方波、且使用理论系数时得到的。如果代码里系数算错,能量占比曲线也会偏离这些值。报告里写结论时,应当以自己运行cum_pct得到的实际数值为准,表格只能作为量级参考。

4.3 相位对齐:合成失真的隐藏原因

傅里叶级数每一项都带有确定的初始相位。方波分解中,所有奇次谐波相位一致(都是 0),合成时才能对齐跳变位置。如果误用cos函数代替sin,每个谐波都被平移 90 度,合成结果会变成完全不同的波形。这个错误在图形上非常明显:原本关于原点对称的方波,会变成类似偶对称的形状,且跳变位置错位。排查方法很简单——单独画一次 $N=1$ 的基波,检查它是不是过原点上升的正弦;如果是余弦形态,说明相位基准已经错了。

4.4 仿真与硬件实验箱的差异

部分学校要求用 DSP 或实验箱做这组实验,合成的效果和 MATLAB 仿真会有差异。硬件系统的采样率、DAC 位数、低通滤波器相频特性都会影响各次谐波的幅度和相位。特别是滤波器,即使幅度响应平坦,相频特性也会让不同频率的谐波产生不同延迟,结果波形跳变沿两侧出现不对称振铃。遇到这种情况,不要误以为是理论错了,要检查信号链中每一级的相位延迟。报告里如果能写出“仿真理想条件下吉布斯过冲为 8.95%,实物链路中因模拟滤波器相频失真,过冲左右不对称”,比单纯抄结论更有说服力。

5. 报告收尾:帕塞瓦尔验证、图表规范与结论写法

实验报告的分数差距往往不在实验过程,而在最后那几页的验证与结论。这一章给出可以直接用的验证代码和报告写作套路。

5.1 用帕塞瓦尔定理量化合成误差

写完合成主图和能量收敛曲线后,再加一个误差验证:计算前 $N$ 次谐波重构信号与理想方波的平均绝对误差(MAE)。

N_test = [1 3 5 9 21 51 101]; for N = N_test f = zeros(size(t)); for n = 1:2:N f = f + (4/pi) * (1/n) * sin(n*w0*t); end mae = mean(abs(f - square_wave)); fprintf('N=%3d, MAE=%.4f\n', N, mae); end

MAE 会随 N 增大而下降,但下降速度越来越慢。这组数字放进报告表格里,和能量占比配合使用:能量占比说明“高频分量虽小,但不可忽略”,MAE 说明“时域误差的收敛趋势”。两列数据都来源于同一个合成过程,逻辑上是自洽的。

5.2 图表规范与结论里必须有数据

信号与系统实验报告最忌贴一张没坐标标签的图。我的建议是每个图至少做到四点:横纵坐标标明物理量和单位(时间 t、幅度);多条曲线必须有图例;不同 N 用不同颜色或线型区分;吉布斯过冲处加一个局部放大子图,直观显示过冲大小。

结论部分不要只写“验证了傅里叶级数”。更合理的是写:当 N=21 时能量占比约 98%,时域波形与理想方波的 MAE 约为某个值;跳变沿处过冲约为 0.179,约为跳变高度的 8.95%,符合理论值;继续增大 N 过冲不消失,仅向跳变点压缩。这样写,每个数字都指向你的实验数据,既说明你理解了原理,也说明你关注了实验细节,这份报告的信息量就出来了。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 19:01:50

Nimmake:面向MCU的跨架构固件构建DSL工具

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 19:00:49

初中物理电路教学:从串并联定义到实物连接诊断

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 18:58:14

ESP32多芯片适配本质:引脚、时钟与内存三重硬件契约

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 18:58:04

BrewUI 实战指南:给 Homebrew 配上图形化界面的完整方案

第一次注意到 BrewUI 这个项目&#xff0c;是在翻开源社区作品列表时无意撞见的。那会儿我刚好被 Homebrew 的命令行参数折腾得有点烦&#xff1a;明明只是想装个软件&#xff0c;却要记住brew search、brew install、brew services start这一连串命令&#xff1b;想看看哪些依…

作者头像 李华
网站建设 2026/9/19 18:55:47

C语言考试题库核心考点解析:指针、字符串与边界问题

简介&#xff1a;面向C语言初学者与备考人群的精选试题集&#xff0c;汇集了字符串结束标志、合法标识符、数据类型、数组初始化与引用、函数返回值类型及存储类别等高频考点&#xff0c;以单项选择题为主&#xff0c;适合期末复习、计算机等级考试或自学阶段自测。资源为典型的…

作者头像 李华