信号卷积给出了与手工计算卷积积分不同的结果

2024-10-01 00:23:03 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有两个函数

f(t) = sin(t)

以及

g(t) = cost(t)

我知道fg的卷积是

0.5 * t * sin(t)

(用手here)和下面的合题:

import sympy as sp

t, tau = sp.symbols('t tau')
sol = sp.integrate(sp.sin(t - tau) * sp.cos(tau), (tau, 0, t))
print(sol)
# t*sin(t)/2

用scipy的convolve如何得到这个结果?目前我得到了两种截然不同的输出:

^{pr2}$

Tags: 函数importhereassincos卷积sp
1条回答
网友
1楼 · 发布于 2024-10-01 00:23:03

首先,signal.convolve方法执行求和。为了使它近似积分,你需要乘以dt,步长。在

第二,产生0.5*t*sin(t)的积分只涉及从0开始的值:将f(tau)*g(t-tau)与tau从0到t进行积分。要用离散卷积来模拟这一点,请从0开始计算linspace,并选择mode='full',然后从开始将结果截断到大小。这样,卷积的第一个元素只涉及很少的项,所以它们基本上是从0开始的。在

n = 1000
t = np.linspace(0, 10, n)
dt = t[1] - t[0]
f = np.sin(t)
g = np.cos(t)
conv = 0.5 * t * np.sin(t)
conv2 = signal.convolve(f, g, mode='full')[:n] * dt
plt.plot(t, conv)   # assuming import matplotlib.pyplot as plt
plt.show()
plt.plot(t, conv2)
plt.show()

compare

得到负的部分,所以相同的东西,但是用t = -np.linspace(0, 10, n)。注意t现在应该倒转,仍然从0开始-就像积分一样。在

相关问题 更多 >