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

基于Python的正弦曲线绘制:自适应采样点数计算问题

通用正弦曲线采样点数计算方案

核心原则

要画出平滑且准确的正弦曲线,采样需满足每个周期至少采集10~20个点(远高于奈奎斯特定理的2点要求,保证绘图视觉平滑)。这是通用计算的基础。

原代码问题分析

  1. 公式逻辑错误:之前参考的Δt ≤ 1/(5ω)公式中,ω是角频率(ω=2πf),换算成频率f应该是Δt ≤ 1/(10πf),但原代码用floor取整会强行拉大采样间隔——比如f=2Hz时,计算出的Δt被取整为1秒,300秒仅采300个点,对应每个周期仅0.5个点,完全无法还原600个周期的正弦波。
  2. 低频场景适配失效:当频率极低(如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:22:24