Numpy卷积:比较阶跃和脉冲响应

2024-06-02 04:57:59 发布

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

我是数字信号处理的新手,在开发我的第一个基于模型的控制方法时,我第一次面临着在任何学校背景之外计算卷积的需要(我的背景是数值模拟的另一个领域)。我将代码从this question改编为我的问题,根据经验,我知道阶跃时间响应,并且非常适合。我理解将系统中的impulse_response乘以时间步长的必要性,不会有任何困难

tend = 600.0  # Total time [s]
dt = 15.0     # Time step [s]
k = 0.01      # Time constant [s]
sp = 0.15     # Step height [a.u.]

# Time interval
t = np.arange(0, tend + 1, dt)

# Define step function.
H = np.ones_like(t)
H[0] = 0.5

def impulse_response(t):
    """ Unit response. """
    return k * np.exp(-k * t) * H

# Response to step. Multiply by dt in discrete case.
response = np.convolve(H, impulse_response(t) * dt, 'full')
response = response[:len(response)//2]

# Define new, longer, time array for plotting response - must 
# be same length as response, with step dt
tp = np.arange(len(response)) * dt

t = np.arange(-tend, tend, dt)
Hp = sp * np.ones_like(t)
Hp[t < 0] = 0.0

plt.style.use('bmh')
plt.step(t, Hp, label='Unit step function')
plt.plot(tp, sp * response, label='Response')
plt.tight_layout()
plt.xlabel('Time (s)')
plt.ylabel('Response [a.u.]')
plt.xlim(-100, tend + 1)
plt.legend()

在上面的代码中,我唯一不明白的一点是,如果我在下面的函数中不乘以H,为什么会得到不同的结果(如参考答案中所述,根据我的理解,由于t<;0的步长为零,这应该没有什么区别)

def impulse_response(t):
    """ Unit response. """
    return k * np.exp(-k * t) * H

我的问题是:在动力系统的实际应用中,需要计算卷积的信号是任意的。为了确保我很好地理解了问题陈述,并验证开发中的下一步,我尝试检查这个函数对于单个单元的delta脉冲是如何起作用的。这种delta的时间长度是零,我相信这就是为什么在单脉冲情况下我不需要乘以dt的原因。是这样吗?通过这样做,我得到了预期的解析解,但我对我的结论没有信心。下面是修改后的代码

# Define impulse function.
d = np.zeros_like(t)
d[0] = 1.0

def impulse_response(t):
    """ Unit response. """
    return k * np.exp(-k * t)

# Response to impulse. Multiply by dt in discrete case.
response = np.convolve(d, impulse_response(t), 'full')
response = response[:len(response)//2]

# Define new, longer, time array for plotting response - must 
# be same length as response, with step dt
tp = np.arange(len(response)) * dt

plt.style.use('bmh')
plt.plot(tp, response, label='Response')
plt.plot(tp, k * np.exp(-k * tp), label='Analytical')
plt.tight_layout()
plt.xlabel('Time (s)')
plt.ylabel('Response [a.u.]')
plt.legend()

Tags: lentimeresponsestepnpdtunitplt
1条回答
网友
1楼 · 发布于 2024-06-02 04:57:59

通常使用卷积运算时,内核(你的脉冲响应)与应用它的数组相比是相当小的。可能有3、5或9个元素宽。当然要视情况而定

在您的情况下,它似乎是数组长度的一半,对吗

我的猜测是,在你的情况下,结果可能不一样,但非常相似,以至于你没有注意到。巨大的内核“涂抹”(或平均)了所有东西

相关问题 更多 >