如何用numpy对一维信号进行N点循环卷积?

Out*_*ime 6 python numpy

N我想要一个循环卷积函数,我可以根据需要设置数字。

\n

我在这里这里查看的所有示例都假设需要完整填充,但这不是我想要的。

\n

我想要得到不同值的结果N

\n
    \n
  • 所以输入将是Nand 和 两个不同的值数组
  • \n
  • 输出应该是N点卷积信号
  • \n
\n
\n

这是循环卷积的公式。SubN可以看作是求模运算。

\n

在此输入图像描述

\n
\n

摘自这个基本介绍

\n
\n
\n

更新可能的解决方案

\n

当数组a根据 的不同情况进行相应堆积时,这个答案N是一个合适的解决方案。

\n

当我有时间时,我会发布完整的答案,同时请随意这样做。

\n

感谢@Andr\xc3\xa9 在评论中指出这一点!

\n
\n
\n

输入/输出的示例来自此处

\n

数 = 4

\n

在此输入图像描述

\n

N = 7,带零填充

\n

在此输入图像描述

\n

bb1*_*bb1 3

我认为这应该有效:

\n
def conv(x1, x2, N):\n    n, m = np.ogrid[:N, :N]\n    return (x1[:N] * x2[(n - m) % N]).sum(axis=1)\n
Run Code Online (Sandbox Code Playgroud)\n

这是问题中发布的公式的直接翻译:

\n

在此输入图像描述

\n

为了实现这个公式,首先我们计算 x\xe2\x82\x82 使用的索引数组。这是使用代码完成的

\n
n, m = np.ogrid[:N, :N]\nindices = (n - m) % N\n
Run Code Online (Sandbox Code Playgroud)\n

例如,对于N=5,数组indices为:

\n
[[0 4 3 2 1]\n [1 0 4 3 2]\n [2 1 0 4 3]\n [3 2 1 0 4]\n [4 3 2 1 0]]\n
Run Code Online (Sandbox Code Playgroud)\n

第 i 行第 j 列中的条目是(i-j) % N。然后,\nx2[indices]创建一个由与这些索引相对应的元素组成的数组x2。剩下的就是将该数组的每一行乘以 的第一个N元素x1,并取每行的总和:

\n
(x1[:N] * x2[indices]).sum(axis=1)\n
Run Code Online (Sandbox Code Playgroud)\n

  • 很酷,谢谢!您介意添加一些函数的具体部分正在做什么的细节吗? (2认同)