基于Python的正弦曲线绘制:自适应采样点数计算问题
通用正弦曲线采样点数计算方案
核心原则
要画出平滑且准确的正弦曲线,采样需满足每个周期至少采集10~20个点(远高于奈奎斯特定理的2点要求,保证绘图视觉平滑)。这是通用计算的基础。
原代码问题分析
- 公式逻辑错误:之前参考的
Δt ≤ 1/(5ω)公式中,ω是角频率(ω=2πf),换算成频率f应该是Δt ≤ 1/(10πf),但原代码用floor取整会强行拉大采样间隔——比如f=2Hz时,计算出的Δt被取整为1秒,300秒仅采300个点,对应每个周期仅0.5个点,完全无法还原600个周期的正弦波。 - 低频场景适配失效:当频率极低(如0.02Hz),原取整逻辑会导致采样点数严重不足,无法完整呈现波形形态。
通用计算方法
直接按每个周期采样点数来推导,步骤清晰且适配全频率范围:
- 设定每个周期的采样点数(推荐10~20,兼顾平滑度与计算效率)
- 总周期数 = 频率(frequency) × 总时长(total_duration)
- 总采样点数 = 总周期数 × 每个周期采样点数 + 1(+1是因为
np.linspace包含首尾两个端点,保证时间序列完整覆盖)
修正后完整代码
import numpy as np import matplotlib.pyplot as plt # 参数配置 frequency = 2 # 目标频率(单位:Hz) total_duration = 300 # 绘图总时长(单位:秒) samples_per_cycle = 15 # 每个周期采样点数,可根据需求调整为10~20 # 计算总采样点数 total_cycles = frequency * total_duration num_points = int(total_cycles * samples_per_cycle) + 1 # 生成时间序列与正弦曲线 t = np.linspace(0, total_duration, num_points) sine_t = np.sin(2 * np.pi * frequency * t) # 绘图展示 plt.plot(t, sine_t, color='red') plt.title(f"{frequency}Hz 正弦曲线(时长{total_duration}秒)") plt.xlabel("时间(秒)") plt.ylabel("幅值") plt.show()
场景验证说明
- 当频率为0.02Hz、总时长300秒时,总周期数为6,按15点/周期计算,总点数为91,足够平滑呈现完整波形。
- 当频率为2Hz、总时长300秒时,总周期数为600,总点数为9001,能完美还原600个周期的正弦曲线形态。
- 可根据需求调整
samples_per_cycle:追求极致平滑设为20,追求计算效率设为10。
内容的提问来源于stack exchange,提问作者skm
相关产品推荐
相关产品推荐

