实验设计:激励信号的选择与数据预处理

做模型辨识,说白了就是给系统做一次「体检」。你得知道怎么刺激它,它才会告诉你真实的动态特性。这一章,我重点聊聊激励信号怎么选、采样时间怎么定、数据怎么洗白白。

一、激励信号的选择

我个人习惯把激励信号分成三类:阶跃、正弦、PRBS。每种都有它的脾气。

1. 阶跃信号

阶跃信号最简单,给系统一个突变,看它怎么响应。我在项目中遇到过不少现场工程师,上来就喜欢用阶跃。为什么?因为直观啊!

但这里有个坑:阶跃信号只适合开环稳定的系统。如果你的系统本身就不稳,阶跃一上去,输出直接飞了,啥也辨识不出来。

注意:阶跃信号的能量集中在低频,高频动态信息基本没有。想辨识系统的快速响应特性?阶跃不太行。

2. 正弦信号

正弦信号的好处是频率单一,可以精确测试系统在某个频率点的响应。我记得有一次做伺服系统的辨识,就是用不同频率的正弦扫了一遍,Bode图画出来,相位裕度一目了然。

但正弦信号有个致命缺点:慢。你要扫完整个频段,得花不少时间。工业现场哪有那么多时间给你慢慢扫?

小技巧:如果你非要用正弦,建议用「扫频」的方式,频率从低到高连续变化,效率会高很多。

3. PRBS信号

PRBS(伪随机二进制序列)是我最常用的激励信号。它看起来像随机噪声,但其实是确定性的。你想想看,它同时包含丰富的频率成分,一次实验就能覆盖整个频段。

我曾经用PRBS辨识一个化工反应器的温度模型,效果出奇的好。不过要注意PRBS的幅值不能太大,否则系统会进入非线性区。

信号类型 优点 缺点 适用场景
阶跃 简单直观 高频信息少 开环稳定系统
正弦 频率精确 耗时 频域分析
PRBS 频带丰富 幅值受限 通用辨识

二、采样时间的确定

采样时间怎么定?我有个简单的经验法则:采样频率至少是系统带宽的10倍。说白了,就是系统最快的变化,你一个周期内至少要采10个点。

为什么会这样?因为采样定理告诉我们,采样频率低于信号最高频率的两倍,就会发生混叠。但实际工程中,两倍远远不够。我建议至少5-10倍。

我的经验:

  • 对于温度系统,采样时间可以设1-5秒
  • 对于电机转速,采样时间通常10-50毫秒
  • 对于电流环,采样时间要1毫秒以内

嗯,这里要注意:采样时间太短,数据量太大,计算负担重;采样时间太长,会丢失动态信息。你得在两者之间找个平衡。

三、数据预处理

采集到的原始数据,不能直接用。为什么?因为里面有各种噪声、趋势项、异常点。我见过太多人拿原始数据直接辨识,结果模型一塌糊涂。

1. 去趋势

去趋势,就是把数据中的缓慢变化成分去掉。比如温度系统,环境温度缓慢变化,这个趋势不是我们关心的动态特性。

常用的方法有:

  • 差分法:最简单,一阶差分就能去掉线性趋势
  • 高通滤波:设置一个截止频率,低于这个频率的成分统统滤掉
  • 多项式拟合:拟合出趋势项,然后减去
避坑指南:我曾经犯过一个错误,去趋势时把低频动态也去掉了。结果辨识出来的模型,低频特性完全不对。所以去趋势的截止频率要选好,别把有用的信息也丢了。

2. 滤波

滤波是为了去掉高频噪声。但滤波有个副作用:会改变信号的相位。你想想看,滤波后的数据,相位滞后了,辨识出来的模型也会偏。

我个人建议:

  • 能不用滤波就不用滤波
  • 如果非要用,选择零相位滤波(比如filtfilt函数)
  • 滤波器的截止频率要远高于系统带宽
# Python示例:零相位滤波
from scipy.signal import butter, filtfilt

def zero_phase_filter(data, cutoff, fs, order=4):
    nyquist = 0.5 * fs
    normal_cutoff = cutoff / nyquist
    b, a = butter(order, normal_cutoff, btype='low')
    # 零相位滤波
    filtered = filtfilt(b, a, data)
    return filtered

四、知识体系总览

下面这张图,是我梳理的实验设计核心逻辑。你看一遍,心里就有数了。

实验设计核心流程 激励信号选择 阶跃信号 正弦信号 PRBS信号 其他 采样时间确定 采样频率 ≥ 10倍系统带宽 数据预处理 去趋势 差分/高通滤波/拟合 滤波 零相位滤波优先 异常值处理 3σ原则/中位数滤波 高质量辨识数据

这张图把整个流程串起来了。从激励信号开始,到采样时间,再到数据预处理,最后得到高质量的数据。每一步都马虎不得。

最后说一句:数据预处理花的时间,往往比辨识本身还多。但这是值得的。垃圾数据进,垃圾模型出。这个道理,做控制的人应该都懂。

可可精品资料库