Basの答えは素晴らしいですが、実際には分析的な解決策を提供していないため、その部分は次のとおりです...
私が知る限り、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 Hz から 10 Hz に変化するコードを次に示します。
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 への設定 (2 番目の呼び出し) がタイムステップに高い解像度を追加するだけであることがわかります。特に、 コード when oversample = 0
(ie fractional_step = 0
) は以前と同じであるため、2 番目のプロットには、最初のプロットの点に加えて、欠落しているデータを「埋め」、すべてがそれほど驚くべきものにならないようにする追加の点が含まれます。
以下は、元のカーブとオーバーサンプリングされたカーブの開始付近のクローズアップで、何が起こっているかを詳細に示しています。

最後に、この種のことは完全に正常であり、エラーを示すものではありません。デジタル波形からアナログ信号が生成されると、「正しい」結果が得られます (ハードウェアが正しく機能していると仮定します)。 この優れたビデオは、明確でない場合に説明します。