Проблема в том, что, когда вы изменяете частоты, каждая частота эффективно имеет различную фазу для данного времени. Когда вы быстро и непрерывно прокручиваете эти фазы, они приводят синусоидальную волну на более высокую частоту (или более низкую также возможно).
Представьте, например, что вы мгновенно изменили частоту - для этого вам нужно будет ввести коррекцию фазы p_1 = p_0 + 2*pi*t*(f_0-f_1)
, чтобы согласовать фазы в момент времени t
. Поскольку вы делаете это небольшими шагами, вы также должны сделать аналогичную фазовую коррекцию, с каждой фазовой коррекцией, добавленной к предыдущей.
Вот полученная цифра с кодом ниже. Верхний показатель - это частота, в которой середина не имеет фазовой коррекции, а нижняя имеет непрерывно корректируемую фазу.
from pylab import *
sample_rate = .001
f0, f1 = 10, 20
t_change = 2
times = arange(0, 4, sample_rate)
ramp = 1./(1+exp(-6.*(times-t_change)))
freq = f0*(1-ramp)+f1*ramp
phase_correction = add.accumulate(times*concatenate((zeros(1), 2*pi*(freq[:-1]-freq[1:]))))
figure()
subplot(311)
plot(times, freq)
subplot(312)
plot(times, sin(2*pi*freq*times))
subplot(313)
plot(times, sin(2*pi*freq*times+phase_correction))
show()