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代码存在两个关键问题:
- 相位计算错误:FM的瞬时相位是对瞬时频率的积分,当A(t)=t时,瞬时频率为
f + t,积分后相位应为f*t + 0.5*t²,而你的代码写成(frequency + time)*time = f*t + t²,相当于相位翻倍,导致频率变化速率异常。 - 偏移量累加错误:同样用
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
相关产品推荐
相关产品推荐

