为什么脉冲响应的卷积与系统的输出不匹配?

信息处理 Python 线性系统 控制系统 scipy
2022-02-25 11:20:35

如果您在 scipy 中定义了一个LTI 系统 sys,您可以方便地向它提供输入x以获取其输出y,如下所示:

from scipy import signal
import numpy as np
import matplotlib.pyplot as plt

# let's define as mass-damper-spring system:
# x'' + beta x' + w0**2 x = F/m
m = 10
w0 = 20*2*np.pi
beta = 1.5 

fs = 500 # sampling frequency (Hz)
ts = np.arange(0,100,1./fs) # time interval of simulation
sys = signal.lti(1./m,[1,beta, w0**2]) 

# simulate the response to an input
x = 10+np.random.normal(0,1,size=ts.shape) # input
_, y, _ = sys.output(U = x, T=ts, ) # output

但是,也可以将脉冲响应(也可以通过lti模块访问)与输入卷积并找到输入的输出:

_, kern = sys.impulse(T=ts) # impulse response 
y_conv = signal.convolve(kern/fs,x)[:len(ts)] #1/fs=dt of integration

我意识到归一化y_conv和归一化y是不同的,即使它们在理论上应该是相同的(如下所示):

fig, axs= plt.subplots(3,1, figsize=(10,5), sharex=True)
axs[0].plot(ts, y,label='output y') 
axs[1].scatter(ts, y-y_conv,marker='.', label='difference') 
axs[2].plot(ts, kern, label='kernel (impulse response)') 
plt.xlabel('time')
for ax in axs:
    ax.legend()

在此处输入图像描述

事实上,scipy 团队并没有使用卷积实现线性系统的输出

我用一个更简单的系统 ( sys = signal.lti(1,[1,1])) 做了一个类似的实验,并意识到这个误差确实是采样频率的函数,fs如下图所示(注意中间面板的范围)。越高fs,差距越小。

在此处输入图像描述 在此处输入图像描述

这些图片表明差异逐渐消失,如下所述。但是,我关于有限采样率机制的问题是:

  1. 采样频率如何在数学上导致这种差异?是否有任何错误界限的表达式?
  2. 双线性映射在这种差异中的作用是什么?是否可以调整此映射以减轻这种数值差异?
  3. 哪种方法更准确地估计对一般输入的响应,为什么(实施)?
1个回答

采样频率如何导致这种差异?

差异是由于两个离散信号之间的离散时间卷积不等于两个连续信号之间的连续卷积的离散信号

signal.convolve给出离散时间的卷积结果,即卷积和,同时sys.output返回连续时间的卷积结果,也称为卷积积分。

虽然我们无法使用计算机实现卷积积分,但scipy.signal.lsim的文档表明它首先对输入信号进行插值,然后应用卷积和来模拟连续时间线性系统的输出。

哪种方法更准确地估计对一般输入的响应,为什么(实施)?

由于您正在模拟连续时间系统的质量阻尼弹簧系统,sys.output因此更准确。