Я следовал этому руководству, но у меня возникли проблемы с пониманием/применением формулы для AM/FM (амплитудной/частотной модуляции) в моем коде. Вот как они появляются:
f(t) = A(t) * sin(2pi * f * t)
f(t) = sin(2pi * ((f + A(t)) * t))
Согласно руководству/вики, A(t)
— это «сигнал сообщения», и если я увеличиваю амплитуду/частоту линейно, то A(t) = t
, где t — это просто время, поэтому мой код выглядит так:
var time: float = 0.0
var frequency: float = 4.0
var amplitude: float = 200.0
var point = Vector2(50.0, 200.0)
func _physics_process(delta):
time += delta
point.y += amplitude * time * cos(frequency * time) * delta
point.x += 100.0 * delta
$Line2D.add_point(point)
ЯВЛЯЮСЬ:
Я могу увеличить амплитуду, однако частота тоже увеличивается. Я делаю это неправильно? (Я использую cos()
вместо sin()
, поэтому мне не нужно делать 2 * пи)
Точно так же я попытался выполнить частотную модуляцию:
func _physics_process(delta):
time += delta
point.y += amplitude * cos((frequency + time) * time) * delta
point.x += 100.0 * delta
$Line2D.add_point(point)
FM:
Частота увеличивается, но амплитуда уменьшается.
Я видел другие сообщения, в которых увеличение частоты описывается как «щебетание», которое имеет ту же функцию, что и частотная модуляция. Для справки, это было запрограммировано с помощью GDScript в Godot, у которого (0,0) в левом верхнем углу, поэтому + X справа, а + Y внизу.
ваш AM выглядит нормально для меня, я не вижу изменения частоты, и формула в порядке (если ваш amplitude(time) = 200.0*time
). Однако я вижу одну проблему, заключающуюся в том, что вы «увеличиваете» ось y+=
, что неверно и должно быть y=
, для значения x все в порядке.
FM неверен, я бы ожидал, по крайней мере, линейной интерполяции. Сначала вам нужны некоторые ограничения/константы:
f0 - min output frequency
f1 - max output frequency
a0 - min value of input signal
a1 - max value of input signal
A(t) - input signal you want to modulate with
B - output amplitude
t - time
затем:
// constants
B = 200.0
a0 = 0.0
a1 = amplitude * time_duration
f0 = 1500.0
f1 = 2500.0
---------------------
t += delta
A = amplitude*time
f = f0 + (f1-f0)*(A-a0)/(a1-a0)
point.y = B * cos(f * t) * delta
point.x += 100.0 * delta
Вы также можете добавить зажим f
к <f0,f1>
...
2 * PI * F * T
, поскольку оно относится к проценту по единичному кругу.Пример модуляции AM
extends Control
var time: float = 0.0
var frequency: float = 4.0
var carrier_amplitude : float = 1.0
var carrier_frequency : float = 0.2
const pixels_per_x = 100; # zoom on x
const pixels_per_y = 100; # zoom on y
func _physics_process(delta):
var point : Vector2
time += delta
var _signal = cos(2 * PI * frequency * time)
var modulating_signal = carrier_amplitude * cos(2 * PI * carrier_frequency * time)
point.y = pixels_per_y * (_signal * modulating_signal)
point.x = pixels_per_x * (time)
$Line2D.add_point(point)
Пример FM-модуляции
extends Control
var time: float = 0.0
var frequency: float = 2
var modulation_index : float = 4
var modulation_frequency : float = 0.2
const pixels_per_x = 100; # zoom on x
const pixels_per_y = 100; # zoom on y
func _physics_process(delta):
var point : Vector2
time += delta
var fm_signal = cos( (2 * PI * frequency * time) + modulation_index*sin(2 * PI * modulation_frequency * time) ) # this is another method that adds offset onto phase
point.y = pixels_per_y * (fm_signal)
point.x = pixels_per_x * (time)
$Line2D.add_point(point)