傅里叶级数无法正常工作?请求排查错误及验证时域正确性
帮你排查傅里叶级数代码的问题&确认时域部分
嘿,我来帮你拆解这段代码的问题,先给你吃个定心丸:你的时域采样部分是正确的,然后咱们来解决傅里叶级数的核心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
相关产品推荐
相关产品推荐

