用 NumPy 求正弦谐波的总和

Posted

技术标签:

【中文标题】用 NumPy 求正弦谐波的总和【英文标题】:Find the sum of sinusoidal harmonics with NumPy 【发布时间】:2022-01-13 07:58:11 【问题描述】:

我有以下公式来计算 Z^2 值。我的 t(time) 和 v(pulse frequency) 都是长度相同的 NumPy 数组,而 n(harmonics) 是 1 到 3 之间的整数值,N 是单个整数值。

在下面,您看到了我的幼稚尝试,但无法弄清楚如何准确地包含谐波和所有内容:

phase = t*v
zstat = (2/N)*np.sum(np.sum(np.cos(phase))**2 + np.sum(np.sin(phase))**2)

我需要遍历所有频率以找到最高的 Z,所以我尝试了这个:

for f in frequencies:
        phase = timenp * frequencies 
zstat += (np.sum(np.cos(k*phase[:N]))**2 + np.sum(np.sin(k*phase[:N]))**2)
zstat = zstat * 2/N

但是,我收到此错误:

ValueError: operands could not be broadcast together with shapes

(28005,) (400,)

代码有什么问题,我该如何解决?

【问题讨论】:

既然 v 是向量而 t_j 是标量,不应该是 phi_j = v_j * t_j 吗? 【参考方案1】:

我认为你可以解决你的问题:

通过使用 phase[:N] 将其从第一个元素求和到 N 个元素。 通过在 k 上使用 for 循环而不是您的第一个 np.sum()。

看起来像

for k in [1,2,3]: 
  zstat += (np.sum(np.cos(k*phase[:N]))**2 + np.sum(np.sin(k*phase[:N]))**2)
zstat = zstat * 2/N

注意,也许它可以优化,如果你可以避免计算 cos(phase[:N]) k-time 更好。

【讨论】:

谢谢。我刚刚编辑了我的问题。我需要迭代频率,但我收到上面的错误。是否也可以迭代频率? @SaraKrauss 您能否提供一个完整的示例,以便其他人(和我)可以测试代码?以一小组数据为例。看起来您的数据由于某种原因没有相同的形状。编辑:你的错误可能是因为你做的相位 = timenp * 频率而不是相位 = timenp * f @SaraKrauss zstat 也不在 for 循环中。所以...这有点令人困惑!

以上是关于用 NumPy 求正弦谐波的总和的主要内容,如果未能解决你的问题,请参考以下文章

Python:2D Numpy 数组(矩阵) - 求负数之和(行)

使用 Numpy 手动反转 FFT

在 Numpy 中从一个音高到另一个音高的正弦波滑音

如何使用 pylab 和 numpy 将正弦曲线拟合到我的数据中?

numpy数学数据处理

Python/NumPy:实现运行总和(但不完全)