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

傅里叶级数无法正常工作?请求排查错误及验证时域正确性

帮你排查傅里叶级数代码的问题&确认时域部分

嘿,我来帮你拆解这段代码的问题,先给你吃个定心丸:你的时域采样部分是正确的,然后咱们来解决傅里叶级数的核心bug~

一、先确认时域部分的正确性

你写的t = 0:1/fs:l-1/fs;完全没问题:

  • 采样频率fs=100Hz,所以采样间隔是1/100=0.01秒
  • 信号长度l=1秒,所以采样点从0到1-0.01=0.99秒,总共100个点,刚好对应1秒内的完整采样,符合采样定理要求(fs=100远大于信号频率f=5的2倍)。

二、傅里叶级数无法工作的核心问题

你的代码最大的问题是只计算了单个谐波分量,没有累加所有符合条件的谐波项。方波的傅里叶级数是多个奇次谐波的叠加,而不是只取第k次谐波。

你当前代码的错误点:

  • 变量覆盖:你先写了y = A*sin(2*pi*f*t*k);,然后立刻用傅里叶级数的式子覆盖了y,这行完全多余,应该删掉。
  • 缺少累加逻辑:方波(奇对称、50%占空比)的傅里叶级数公式是:
    $$y(t) = \frac{4A}{\pi} \sum_{n=1,3,5...}^{k} \frac{1}{n} \sin(2\pi n f t)$$
    你现在只计算了n=k这一项,没有从1到k的所有奇次项累加,所以画出来的只是单个正弦波,根本没法逼近方波。
  • 公式写法逻辑不够清晰:sin(2*pi*f*t*k)虽然数学上和sin(2*pi*k*f*t)等价,但后者更直观——k次谐波的频率是k*f,写成2*pi*(k*f)*t更符合谐波频率的物理意义。

三、修正后的代码示例

下面是调整后的代码,核心是加入循环累加奇次谐波:

f = 5; %固定信号频率
fs = 100; %固定采样频率(100Hz)
A=1; %固定幅值(1)
l=1; %固定信号长度(秒)
k = app.FourierSerieslength.Value; %傅里叶级数长度为1至21
t = 0:1/fs:l-1/fs; % 时域采样点(正确保留)

% 初始化输出信号为全0,用于累加谐波
y = zeros(size(t));

% 循环累加所有奇次谐波(方波只有奇次谐波分量)
for n = 1:2:k % 步长为2,取1到k之间的所有奇数
    y = y + (4*A/pi)*(1/n)*sin(2*pi*n*f*t);
end

plot(app.UIAxes,t,y);

修正后的效果:

当你把k设为1时,画出来的是基波(5Hz正弦波);k设为3时,叠加基波+3次谐波;k越大(比如21),叠加后的波形就越接近方波,边缘会出现吉布斯现象(这是傅里叶级数逼近的正常情况)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:17:11