阶跃函数卷积自己_如何看待大神/老师说“阶跃响应曲线调参并不准确”的观点?…

  • Post author:
  • Post category:其他






使用K-Mean均值算法进行聚类只是一种判断干扰因素的手段,不是最终目的



近期有几个特别热衷于调参的小伙伴问我,“那些大神/老师总说通过阶跃响应曲线来调PID参数并不正确,是这样吗”。

7b974a6723b20617e237b8154334083e.png

我难以揣测这背后到底有着多少对于数学的恶意,也无法猜测这其中掺杂了多少不懂装懂的尴尬。 但是既然大家对这些工具的恶意这么大,索性今天也就不计字数,给大家粗略解释一下PID-Analyzer和PIDtoolbox的阶跃响应形状不同的原因,以及其背后的反卷积原理。

01


为什么同一个LOG会出现截然不同的结果?

简单来说,这是因为

PID-Analyzer直接输出全部阶跃响应帧的平均结果

,而

PIDtoolbox启用了根据稳定时长筛选阶跃响应帧的算法来控制分析数据的质量

d8bcee8e5ab0293d1c9c9e0b157d0937.png


在PIDtoolbox内看起来还算正常的log,在PID-analyzer里则完全超调

查阅代码可知,PID-analyzer在进行维纳反卷积之后直接对全部阶跃响应帧进行了求平均,并进行了图像绘制。

def wiener_deconvolution(self, input, output, cutfreq):      # input/output are two-dimensional 输入输出信号均为二维信号  pad = 1024 - (len(input[0]) % 1024)                        # padding to power of 2, increases transform speed 将 padding设置为2的幂次数以提高变换速度  input = np.pad(input, [[0,0],[0,pad]], mode='constant')    # 指定输入信号及模式,下为输出信号  output = np.pad(output, [[0, 0], [0, pad]], mode='constant')  H = np.fft.fft(input, axis=-1)  G = np.fft.fft(output,axis=-1)  freq = np.abs(np.fft.fftfreq(len(input[0]), self.dt))  sn = self.to_mask(np.clip(np.abs(freq), cutfreq-1e-9, cutfreq))  len_lpf=np.sum(np.ones_like(sn)-sn)  sn=self.to_mask(gaussian_filter1d(sn,len_lpf/6.))  sn= 10.*(-sn+1.+1e-9)       # +1e-9 to prohibit 0/0 situations  Hcon = np.conj(H)  deconvolved_sm = np.real(np.fft.ifft(G * Hcon / (H * Hcon + 1./sn),axis=-1))  # 此为反卷积核心公式  return deconvolved_sm  # 将阶跃响应结果返回输出def stack_response(self, stacks, window):  # 绘制阶跃响应曲线  inp = stacks['input&