我是数字信号处理的新手,在开发我的第一个基于模型的控制方法时,我第一次面临着在任何学校背景之外计算卷积的需要(我的背景是数值模拟的另一个领域)。我将代码从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()
通常使用卷积运算时,内核(你的脉冲响应)与应用它的数组相比是相当小的。可能有3、5或9个元素宽。当然要视情况而定
在您的情况下,它似乎是数组长度的一半,对吗
我的猜测是,在你的情况下,结果可能不一样,但非常相似,以至于你没有注意到。巨大的内核“涂抹”(或平均)了所有东西
相关问题 更多 >
编程相关推荐