我有一个数值表格,告诉我信号水平如何随时间变化,并且我想模拟由此信号驱动的谐振子。即使模拟不是100%准确也没关系。 我知道振荡器的频率。 我找到了很多公式,但它们都使用正弦波作为驱动。
我有一个数值表格,告诉我信号水平如何随时间变化,并且我想模拟由此信号驱动的谐振子。即使模拟不是100%准确也没关系。 我知道振荡器的频率。 我找到了很多公式,但它们都使用正弦波作为驱动。
好的,我终于弄清楚了,并编写了一个GUI应用程序来测试它,直到它正常工作。但是我的电脑不太喜欢每秒执行1000 * 44100次,即使没有GUI^^
无论如何:这是我的测试代码(运行得相当不错):
double lastTime;
const double deltaT = 1 / 44100.0;//length of a frame in seconds
double rFreq;
private void InitPendulum()
{
double freq = 2;//frequency in herz
rFreq = FToRSpeed(freq);
damp = Math.Pow(0.8, freq * deltaT);
}
private static double FToRSpeed(double p)
{
p *= 2;
p = Math.PI * p;
return p * p;
}
double damp;
double bHeight;
double bSpeed;
double lastchange;
private void timer1_Tick(object sender, EventArgs e)
{
double now=sw.ElapsedTicks/(double)Stopwatch.Frequency;
while (lastTime+deltaT <= now)
{
bHeight += bSpeed * deltaT;
double prevSpeed=bSpeed;
bSpeed += (mouseY - bHeight) * (rFreq*deltaT);
bSpeed *= damp;
if ((bSpeed > 0) != (prevSpeed > 0))
{
Console.WriteLine(lastTime - lastchange);
lastchange = lastTime;
}
lastTime += deltaT;
}
Invalidate();//No, i am not using gdi^^
}