如何模拟由给定信号驱动的谐波振荡器(不由正弦波驱动)

问题描述:

我有一张表格告诉我信号电平随时间如何变化,我想模拟由此信号驱动的谐波振荡器。模拟不是100%准确无关紧要。 我知道振荡器的频率。 我发现很多公式,但他们都使用正弦波作为驱动程序。如何模拟由给定信号驱动的谐波振荡器(不由正弦波驱动)

我想你想要执行一些时间离散模拟。众所周知的公式需要分析输入(请参阅格林函数)。如果你在某个时间点上有一张力表,那么典型的分析公式不会对你有太大的帮助。

想法是这样的:对于每个时间点t0,振荡器都有一定的加速度,速度等等。现在一个力作用在它上面 - 根据你给出的表格 - 这将改变它的加速度(F =嘛)。对于下一个时间步t1,我们假设加速度保持在那个常数,所以我们可以在这个时间范围内应用简单的Newtonian equations(v = a * dt)和dt =(t1-t0)。迭代直到模拟所需的时间范围。

这个模拟的最重要的参数是dt,也就是说,计算是多么细致。例如,您可能希望每秒执行10个步骤,但这完全取决于您的输入参数。实质上,我们在这里所做的是这些方程式的一个Eulerian integration

这当然不全是 - 这种模拟可能相当复杂,尤其是,在不那么好的情况下,极端加速度等情况下。在这些情况下,您需要在一个帧内执行数字完整性检查,因为在单个帧中会发生“极端”情况。还有一些数值积分可能变得必要,例如, Runge-Kutta algorithm。不过,我认为这在很大程度上导致了这一点。

编辑:就在我发布这个之后,有人发表了一个评论,指向“Verlet Algorithm”,这基本上是我上面描述的实现的原始问题。

+0

是啊,这就是为什么我把它拿下来了。但是麻省理工学院网页上有一个相关问题,我找不到合适的变体。可能想坚持速度verlet算法,但我找不到代码。 http://en.wikipedia.org/wiki/Verlet_integration#Velocity_Verlet – Incognito 2010-08-28 13:47:08

+0

我想这就是OP的任务所在 - 摆弄出现的数值缺陷并尝试实现模拟。让我们不要从中获得所有的乐趣;)不,老实说,我自己并不知道实现,但我想这个问题是回答的。实施它应该是一个单独的问题。 – mnemosyn 2010-08-28 13:54:37

+0

+1 - 的确是一个非常好的答案。如果可以的话,我会更多地给它。 – duffymo 2010-08-28 19:55:01

好吧,我终于找到它了,写了一个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^^ 
} 
+0

模拟可能非常*计算密集型。几乎世界上所有超级计算机所做的一切实际上只是一种模拟或另一种模拟。 – 2010-08-28 20:35:36

+0

以及我有一些错误和瓶颈。现在它可以很好地运行在512oscillators * 44100frames/sec的情况下,CPU占用率为40%,但是分析的设计有点不够清晰。 (与fft相同,但fft在低频时不是很准确) – Zotta 2010-08-29 12:25:55