如果您在 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,差距越小。
这些图片表明差异逐渐消失,如下所述。但是,我关于有限采样率机制的问题是:
- 采样频率如何在数学上导致这种差异?是否有任何错误界限的表达式?
- 双线性映射在这种差异中的作用是什么?是否可以调整此映射以减轻这种数值差异?
- 哪种方法更准确地估计对一般输入的响应,为什么(实施)?


