numpy.sin模拟采样频率时101Hz采样下计算结果异常问题咨询
问题根本原因
这个现象既不是np.sin的计算缺陷,也不是float64数据类型的精度异常,本质是时间轴生成逻辑存在错误,101Hz的参数设置刚好让所有采样点落在正弦信号的过零点上,你观测到的1e-14量级结果是浮点数计算的正常舍入误差,完全符合预期。
具体问题拆解
- 你对
np.linspace的间隔计算逻辑存在误用:np.linspace(start, end, num)默认会同时包含首尾两个端点,因此相邻采样点的间隔是(end - start)/(num - 1),而非(end - start)/num。 - 当设置采样频率为101Hz时,代码中计算的采样点数
N = 1*101 = 101,调用np.linspace(0, 1, 101)生成的实际时间点间隔为1/(101-1) = 0.01s,对应的真实采样率是100Hz,并非你设定的101Hz。 - 将时间点代入正弦公式计算:信号频率f=50Hz,每个采样点的相位为
2π*50*t = 2π*50*0.01*k = π*k(k取0到100的整数),数学上sin(π*k)的精确值就是0,你看到的1e-14量级结果,只是浮点数近似表示π时的固有精度误差,不属于计算错误。
其他采样频率未触发异常的原因
其余测试采样频率下,linspace生成的点间隔不会刚好凑出π整数倍的相位:
- 100Hz采样时,N=100,点间隔为1/99≈0.0101s,相位不会落在π的整数倍上,正弦值计算结果正常
- 102Hz采样时,N=102,点间隔为1/101≈0.0099s,同样不会出现所有点对齐过零点的情况
修复方案
要生成和设定采样率匹配的正确时间轴,选择任意一种写法即可:
- 使用
np.arange生成,天然不包含右边界,间隔严格等于采样周期:linear = np.arange(0, T, 1/i) - 继续使用
np.linspace时,关闭终点包含参数,保证点间隔为1/fs:N = int(T * i) linear = np.linspace(0, T, N, endpoint=False)
修复后重新运行代码,101Hz采样下的正弦信号幅值就会恢复正常。
内容的提问来源于stack exchange,提问作者ProperPitch
相关产品推荐
相关产品推荐

