LLRFLibsPy库中iden_impulse函数解读
source code: Github
这个函数 iden_impulse
用于通过输入输出数据识别系统的脉冲响应。脉冲响应是线性时不变系统的特性函数,描述了系统对脉冲输入的响应。函数通过最小二乘法拟合得到脉冲响应。以下是详细解读:
函数参数
U
:复数类型的输入波形数组,维度为 (n_wf, N),其中n_wf
是波形的数量,N
是每个波形的采样点数。Y
:复数类型的输出波形数组,维度与U
相同。order
:脉冲响应的阶数,即要识别的脉冲响应的长度。
返回值
status
:布尔值,表示成功(True)或失败(False)。h
:复数类型的脉冲响应数组。
函数逻辑
输入验证:
- 检查
U
和Y
的形状是否相同,以及order
是否大于等于 2。如果任意一个条件不满足,返回失败状态和空值。
- 检查
获取维度:
- 获取波形的数量
n_wf
和每个波形的采样点数N
。 - 如果
order
大于N
,将order
设置为N - 1
,因为脉冲响应的阶数不能超过波形的采样点数。
- 获取波形的数量
构造线性方程:
- 初始化矩阵
A
和向量B
,用于最小二乘拟合。A
的维度为 ((N - order) * n_wf, order),B
的维度为 ((N - order) * n_wf)。 - 通过遍历每个波形,将输入数据
U
和输出数据Y
填充到矩阵A
和向量B
中。
- 初始化矩阵
最小二乘拟合:
- 使用
np.linalg.lstsq
进行最小二乘拟合,求解线性方程A * h = B
,得到脉冲响应X
。
- 使用
返回结果:
- 返回成功状态和识别出的脉冲响应
X
,并将X
反转顺序。
- 返回成功状态和识别出的脉冲响应
代码解释
1 | def iden_impulse(U, Y, order = 20): |
函数用途
这个函数的主要用途是通过实验或仿真的输入输出数据,识别线性系统的脉冲响应。脉冲响应在系统辨识、控制设计和信号处理等领域具有广泛的应用。例如,可以用于射频腔体的脉冲响应识别,以优化控制系统的设计。
示例:脉冲响应识别
假设我们有一个简单的一阶低通滤波器,其脉冲响应为 h[n] = (0.5)^n
,我们希望通过输入输出数据来识别出该脉冲响应。
1. 生成输入输出数据
我们使用随机输入信号通过滤波器生成输出信号,来模拟真实的输入输出数据。
1 | import numpy as np |
结果分析
运行上述代码后,你应该会看到一个图表,对比真实的脉冲响应和识别出的脉冲响应。这将验证 iden_impulse
函数是否正确识别出系统的脉冲响应。
解释
参数设置:
- 设置要识别的脉冲响应的阶数
order
。 - 生成
n_wf
个波形,每个波形的采样点数为N
。
- 设置要识别的脉冲响应的阶数
生成脉冲响应:
- 生成目标脉冲响应
h[n] = (0.5)^n
。
- 生成目标脉冲响应
生成输入输出数据:
- 生成随机的复数输入信号
U
。 - 使用
np.convolve
函数将输入信号通过目标滤波器,生成输出信号Y
。
- 生成随机的复数输入信号
使用
iden_impulse
识别脉冲响应:- 调用
iden_impulse
函数,使用生成的输入输出数据识别脉冲响应。
- 调用
结果对比:
- 检查识别是否成功,如果成功,则绘制真实脉冲响应和识别脉冲响应的对比图。
通过这个示例,你可以直观地看到 iden_impulse
函数的工作效果,并了解如何在实际应用中使用该函数来识别系统的脉冲响应。