巴斯的回答很棒,但实际上并没有给出解析解决方案,所以这就是那部分......
据我所知,您想要诸如sin(Aexp(Bt))
whereA
和B
are 常量之类的东西。我会假设时间开始于0
并继续C
(如果它开始于其他时间,则从两者中减去)。
然后,正如巴斯所说,我认为,如果我们有sin(g(t))
频率f
是这样的2 * pi * f = dg / dt
。我们希望那是f0
在时间0
和fC
时间C
。
如果你通过数学,这很容易(真的是 - 学校的最后一年),你会得到:
B = 1/C * log(fC/f0)
A = 2 * pi * f0 / B
这是一些使用 1000 个样本在 5 秒内从 1 到 10Hz 的代码:
from math import pi, sin, log, exp
def sweep(f_start, f_end, interval, n_steps):
b = log(f_end/f_start) / interval
a = 2 * pi * f_start / b
for i in range(n_steps):
delta = i / float(n_steps)
t = interval * delta
g_t = a * exp(b * t)
print t, 3 * sin(g_t)
sweep(1, 10, 5, 1000)
这使:
(并且您可以添加一个常量 -sin(g_t + k)
以在任何您想要的地方获得起始阶段)。
更新
为了表明您看到的问题是采样的人工制品,这里有一个过采样的版本(如果您将其设置为参数):
from math import pi, sin, log, exp
def sweep(f_start, f_end, interval, n_steps, n_oversample=1):
b = log(f_end/f_start) / interval
a = 2 * pi * f_start / b
for i in range(n_steps):
for oversample in range(n_oversample):
fractional_step = oversample / float(n_oversample)
delta = (i + fractional_step) / float(n_steps)
t = interval * delta
g_t = a * exp(b * t)
print t, 3 * sin(g_t)
sweep(16000.0, 16500.0, 256.0/48000.0, 256) # looks strange
sweep(16000.0, 16500.0, 256.0/48000.0, 256, 4) # looks fine with better resolution
如果您检查代码,您会看到所有设置n_oversample
为 4(第二次调用)是为时间步添加更高的分辨率。特别是,代码 when oversample = 0
(ie fractional_step = 0
)与之前相同,因此第二个图包括第一个图中的点,以及“填充”缺失数据并使一切看起来不那么令人惊讶的额外点。
这是原始曲线和开始附近的过采样曲线的特写,详细显示了正在发生的事情:
最后,这种事情是完全正常的,并不表示任何错误。当从数字波形生成模拟信号时,您将获得“正确”的结果(假设硬件工作正常)。 如果不清楚,这个出色的视频将解释事情。