ss2sos
态空间中的数字滤波器参数变换为二阶段。
库::`工程师`
争论
输入参数
# *比例尺* — 增益和分子的缩放
+
"没有" (默认)| "inf" | "二"
Details
增益系数和分子的缩放,设置为以下值之一:
* "没有" -不应用缩放;
* "inf" -无限速率缩放;
* "二" —根据第二范数缩放。
使用带顺序的无限范数缩放 "向上" 实现中最大限度地减少溢出的机会。 使用根据第二范数与顺序缩放 "向下" 最大限度地减少峰值舍入噪声。
| 按无限范数和按第二范数缩放仅适用于直接形式II的实现。 |
例子:
以二阶段形式表示滤波器
Details
让我们开发一个5阶巴特沃斯低通滤波器,通过设置截止频率为
import EngeeDSP.Functions: butter, ss2sos
A, B, C, D = butter(5, 0.2, out = 4)
sos, g = ss2sos(A, B, C, D)
println("sos = ", sos)
sos = [1.0 1.0004631991200947 0.0 1.0 -0.5095254494944288 0.0; 1.0 1.9995370439927413 0.9995370439927413 1.0 -1.0965794655679613 0.35544676217239035; 1.0 1.999999756887197 0.9999999713279842 1.0 -1.3693171946832927 0.6925691353878634]
import EngeeDSP.Functions: freqz
freqz(sos, out = :plot)

质量弹簧系统
Details
一维离散振荡系统由单个质量块组成
生成 50 采样周期。 让我们定义采样间隔
Fs = 5
dt = 1 / Fs
N = 50
t = dt * (0:N-1)
振荡器可以通过状态空间的方程来描述:
哪里
A = [cos(dt) sin(dt); -sin(dt) cos(dt)]
B = [1 - cos(dt); sin(dt)]
C = [-1 0]
D = 1
系统由正方向的单个脉冲激励。 我们使用状态空间模型来计算系统的时间演变,从零初始状态开始。
u = [1; zeros(N-1)]
x = [0.0; 0.0]
y = zeros(N)
for k = 1:N
y[k] = (C * x)[1] + D * u[k]
global x = A * x + B * u[k]
end
让我们绘制质量加速度对时间的依赖性。
plot(t, y,
seriestype = :stem,
marker = :circle,
legend = false)
让我们计算加速度对时间的依赖性使用传递函数来过滤输入信号。 让我们以二阶段的形式表达传递函数。 让我们绘制结果图。 结果在两种情况下是相同的。
import EngeeDSP.Functions: ss2sos, sosfilt
sos = ss2sos(A, B, C, D)
yt = sosfilt(sos[1], u)
plot(t, yt,
seriestype = :stem,
marker = :circle,
legend = false)
算法
功能 *ss2sos* 使用四步算法确定输入状态空间系统的二阶部分的表示:
-
使用函数
*zp2sos系列*,其中首先使用函数将零点和极点分组为复共轭对*cplxpair*. 然后*zp2sos系列*通过按照以下规则组合成对的极点和零点来形成二阶段:-
将最接近单位圆的极点与最接近这些极点的零点组合。
-
将最接近单位圆的极点与最接近这些极点的零点组合。
-
继续,直到所有极点和零点合并。
功能
*ss2sos*将实极点分组为实极点在绝对值上最接近它们的部分。 同样的规则适用于真正的零。 -
-
根据所述成对极与所述单位圆的接近度排列所述区段。 通常情况下
*ss2sos*用最接近单位圆的极点排列部分,这是级联中的最后一个。 您可以指定函数*ss2sos*以便它使用参数以相反的顺序对部分进行排序[参数:顺序]. -
功能
*ss2sos*根据参数中指定的规范缩放部分[参数:比例]. 对于任意函数 缩放定义如下:哪里
它可以是无限的,也可以是2. 有关缩放的详细信息,请参阅文学作品部分中的源代码。 该算法遵循此缩放以最小化定点滤波器实现中的溢出或峰值舍入噪声。