You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Octave/Matlab中移位方波的傅里叶级数绘制异常问题

傅里叶级数贴合方波失败的问题分析与修正

核心错误点

1. 直流分量重复计算

傅里叶级数的标准形式里,直流分量$a_0$是单独计算的,$a_n$、$b_n$则对应从$n=1$开始的谐波分量。你的代码中n = (0:N).'包含了$n=0$的情况,此时$\omega=0$、$\cos(0)=1$,算出的an(1)等于$2a_0$,后续求和时又叠加了单独的$a_0$,导致直流分量错误放大为$3a_0$,直接偏离原信号的直流水平。

2. 信号非周期,不符合傅里叶级数应用场景

当前代码生成的f是单个脉冲(仅在$-1 \leq t < 0$时为1),但傅里叶级数是用来逼近周期重复信号的,用周期级数拟合非周期脉冲,自然无法贴合。

3. 周期T设置错误

如果要生成“$-1 \leq t <0$为1、$0 \leq t <1$为0”的周期方波,其实际周期应为2,但代码里将$T$设为4($Tf-T0=4$),这会导致基频$\omega_0=2\pi/T$偏差,所有谐波分量的频率都不匹配,逼近曲线必然错位。

修正后的代码

N = 50;

% 设定方波周期为2
T = 2;
T0 = -2;
Tf = 2;
DeltaT = T/4000;
t = T0:DeltaT:Tf;

% n从1到N,避免直流分量重复计算
n = (1:N).';
omega0 = 2*pi/T;
omega = n * omega0;

% 生成周期为2的方波:每个周期内[-1,0)为1,[0,1)为0
u = @(t) heaviside(t);
t_mod = mod(t + T/2, T) - T/2;  % 将t映射到单个周期区间内
f = u(t_mod + T/2) - u(t_mod);

% 计算傅里叶级数系数
a0 = (1./T) .* trapz(DeltaT, f);
an = (2./T) .* trapz(DeltaT, f .* cos(omega * t));
bn = (2./T) .* trapz(DeltaT, f .* sin(omega * t));

% 计算傅里叶级数逼近值
F = an .* cos(omega * t) + bn .* sin(omega * t);
FS = a0 + sum(F, 1);

% 绘图展示
figure(1);
clf
hold on
plot(t, f, 'k', 'LineWidth', 1.5);
plot(t, FS, 'r', 'LineWidth', 1);
axis([-3 3 -0.5 1.5]);
grid on;
legend('原方波', '傅里叶级数逼近');

修正说明

  • 调整n的范围为1到N,彻底解决直流分量重复计算的问题。
  • 通过mod函数构造周期方波,让信号符合傅里叶级数的应用场景。
  • 将周期$T$设为方波的实际周期2,确保基频及所有谐波分量的频率正确。
  • 优化坐标轴范围,更清晰地展示逼近曲线与原方波的贴合效果。

内容的提问来源于stack exchange,提问作者Casey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:12:16