4

我试图找出一种方法来通过算法获得在 Maxima 计算机代数系统中具有正弦项的函数的幅度和相位。这仅适用于稳态(因为 t -> infinity 和瞬态衰减)。例如,一个简单的案例是:

f(t) = 1 / w * sin(w * t + theta) + exp(-a * t) + 8

在这种情况下,增益为 1 / w,相位偏移为 theta,我们将忽略瞬态项 exp(-a * t),因为我们只关心稳态增益和相位延迟,而 exp(- a * t) -> 0 作为 t -> 无穷大。我们也会忽略“+ 8”项,因为它只是一个 DC 偏移量。在我的工程课程中,我被教导这样做的方式需要大量的启发式方法和繁琐的方程式重新排列,以使它们以类似于上述的形式得到,其中答案是显而易见的。

考虑到我拥有计算机代数系统的全部功能(以及人们期望 CAS 具有的标准功能),有谁知道找到增益和相位延迟的通用算法方法。 ? 尽管我可能会在 Maxima 中实现它,但我当然会欣赏仅用数学解释的通用答案。

编辑: 我认为从我的示例中可以清楚地看出,我希望得到象征性的答案,就 w 而言。w 应该是欧米茄,代表输入的频率。我真正要问的是,是否有任何标准的数学运算可以产生增益和相位项,而无需进行大量启发式手动方程重新排列。

4

4 回答 4

7

你的意思是象征性的还是数字的?

从数值上讲,您需要执行傅立叶变换

  • 以至少两倍于预期的最大频率(如果您想要更精确地测量相位,甚至更高)和至少与您的最大预期波长一样长的时间对函数进行采样

  • 执行傅里叶变换(搜索 FFT 应该会找到很多示例 - 我的搜索表明 maxima 甚至可能具有内置的 fft 函数)

  • 这将为您提供函数的“频域”版本。您将有一系列复数值,其中幅度是该频率的幅度,角度是该频率分量的相位。在您的情况下,听起来您想寻找具有峰值幅度的频率

于 2009-09-19T19:42:39.787 回答
1

Either a Laplace or a Fourier transform may help; you can apply either symbolically as well as numerically. But I'm not sure you will be able to create a general algorithmic method - usually there are different case depending where the poles are.

于 2009-09-19T20:24:24.457 回答
1

这可能是理想的,也可能不是理想的,但我假设您无法对生成波形的函数执行任何数学运算(或该函数不可用) -

我会以明显小于周期的间隔对波形进行采样。这可能很困难 - 您需要确定波的周期大于采样间隔,但您不希望它太小,否则需要永远完成波的几个周期。也许您可以从某个最小值开始采样,然后逐步增加,直到该值以可接受的速率变化。

如果这样做,则可以将波移动到 X 轴的中心(通过减去或增加平均值)并确定 1) 提供幅度的最小值/最大值和 2) 提供幅度的 X 截距时期。

于 2009-09-19T19:44:00.657 回答
0

在考虑了一段时间后,我自己想通了。我会把它贴在这里,因为它很有趣。假设是:

  1. 信号已经存在了无限时间,所以一切都处于稳定状态。
  2. 你的表达只有一个频率。这很容易通过检查来检查,即使它是某种非常复杂的形式。例如,你不能有 sin(w1 * t) + sin(w2 * t) 否则这将不起作用。
  3. 您知道频率和时间变量的名称。
  4. 你有一个不错的计算机代数系统和所有的标准功能。

在这些假设下,算法是:

  1. 进行拉普拉斯变换。在实践中这是微不足道的,因为大多数时候当你遇到这样的问题时,你的答案最初是在拉普拉斯域中,你最终会转换回时域来获得正弦波的表达式。即使没有,一个像样的 CAS 也已经拥有成熟的拉普拉斯变换函数。
  2. 除以 sin(w*t) 的拉普拉斯变换。(假设您使用 w 表示频率,使用 t 表示时间)。这为您提供了传递函数,即输入正弦波乘以的拉普拉斯域常数。
  3. 由于 t -> infinity,即对于存在无限时间的信号,拉普拉斯变量 s 等价于 i w,因此只需将 i w 替换为 s,即可得到频域中的传递函数,实际上是傅立叶变换的传递函数。
  4. 对于频率为 w 的正弦波,增益是传递函数的复绝对值。(复数绝对值是复数平面中某个复数到原点的距离,sqrt(realpart(my_number)^2 + imagpart(my_number)^2)。
  5. 相位偏移只是arctan(虚部(transferFunction)/实部(transferFunction))。
于 2009-09-20T22:46:35.903 回答