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

AM/FM调制代码实现异常求助(Godot GDScript)

AM调制问题分析与修正

你的AM代码核心问题是错误地累加偏移量,而非基于基准Y坐标计算瞬时偏移。原代码中point.y += ...会让波形持续向Y轴正方向(向下)偏移,累加效果导致视觉上误以为频率升高,实际频率并未变化。

另外,用cos()替代sin()完全没问题,但要注意Godot坐标系Y轴向下,需用基准Y值减去调制后的偏移量,才能得到符合视觉习惯的波形(向上为正波动)。

修正后的AM代码:

var time: float = 0.0
var frequency: float = 4.0
var amplitude: float = 200.0
# 基准点,Y为波形中心位置
var base_point = Vector2(50.0, 200.0)
var current_point: Vector2

func _physics_process(delta):
    time += delta
    # 线性计算当前X位置
    current_point.x = base_point.x + 100.0 * time
    # AM调制:基准Y减去振幅调制后的偏移量
    var am_offset = amplitude * time * cos(frequency * time)
    current_point.y = base_point.y - am_offset
    $Line2D.add_point(current_point)

修正后,振幅随时间线性增加,频率保持稳定,完全符合AM调制的预期效果。

FM调制问题分析与修正

你的FM代码存在两个关键问题:

  1. 相位计算错误:FM的瞬时相位是对瞬时频率的积分,当A(t)=t时,瞬时频率为f + t,积分后相位应为f*t + 0.5*t²,而你的代码写成(frequency + time)*time = f*t + t²,相当于相位翻倍,导致频率变化速率异常。
  2. 偏移量累加错误:同样用point.y += ...会让波形持续偏离基准线,视觉上表现为振幅“下降”,实际是波形偏移了正常波动范围。

修正后的FM代码:

var time: float = 0.0
var frequency: float = 4.0
var amplitude: float = 200.0
var base_point = Vector2(50.0, 200.0)
var current_point: Vector2

func _physics_process(delta):
    time += delta
    current_point.x = base_point.x + 100.0 * time
    # FM调制:使用正确的积分后相位
    var fm_phase = frequency * time + 0.5 * time * time
    var fm_offset = amplitude * cos(fm_phase)
    current_point.y = base_point.y - fm_offset
    $Line2D.add_point(current_point)

修正后,频率随时间线性升高,振幅保持稳定,符合FM调制的预期效果。

补充说明

  • 如果想严格遵循物理公式,需在相位计算中乘以2*PI,比如cos(2*PI * frequency * time),此时frequency参数的数值才和实际物理频率对应。
  • 若Line2D的点过多会影响性能,建议限制点的数量(比如超过1000个时移除最早的点)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:15:34