# grpdelay
平均滤波器延迟(群延迟)
函数库: TySignalProcessing
# 语法
gd, w = grpdelay(b, a, n)
gd, w = grpdelay(sos, n)
gd, w = grpdelay(b, a, w)
gd, w = grpdelay(sos, w)
gd, w = grpdelay(___, "whole")
gd, f = grpdelay(___, n, fs)
gd, f = grpdelay(___, n, "whole", fs)
gd, w = grpdelay(b, a, win)
gd, w = grpdelay(sos, win)
gd, f = grpdelay(b, a, fin, fs)
gd, f = grpdelay(sos, fin, fs)
# 说明
gd, w = grpdelay(b, a, n) 返回传递函数系数存储在 b 和 a 中的数字滤波器的 n 点群延迟响应向量 gd 和相应的角频率向量 w。
gd, w = grpdelay(sos, n) 返回对应于二阶基本节矩阵 sos 的 n 点群延迟响应。
gd, w = grpdelay(___, "whole") 返回围绕整个单位圆的 n 个样本点处的群延迟。
gd, f = grpdelay(___, n, fs) 返回群延迟响应向量 gd 和相应的物理频率向量 f,用于数字滤波器,该滤波器旨在滤波以 fs 速率采样的信号。
gd, f = grpdelay(___, n, "whole", fs) 返回范围在 0 和 fs 之间的 n 个点的频率向量。
# 示例
巴特沃斯滤波器的群延迟
设计一个具有归一化 3 dB 频率 0.2π rad/sample的 6 阶巴特沃斯滤波器。使用 grpdelay 显示群延迟。
using TySignalProcessing
using TyPlot
using TyMath
z, p, k = butter(6, 0.2, "lowpass", otype = "zpk")
sos = zp2sos(z, p, k; g_flag = false)
grpdelay(sos, 128, plotfig = true)
hold("on")
绘制以分贝表示的幅度响应。
gd, = grpdelay(sos,512)
h,w = freqz(sos,512)
pd = -unwrap(angle.(h))./w[:]
figure()
plot(w/pi,gd,w/pi,pd)
grid("on")
xlabel("Normalized Frequency (×Π rad/sample)")
ylabel("Group and phase delays")
legend(["Group delay","Phase delay"])
hold("off")

巴特沃斯数字滤波器的群延迟响应
使用 fdesign_lowpass 设计一个 6 阶巴特沃斯滤波器,其归一化 3 dB 频率为 0.2π rad/sample。 显示其群延迟响应。
using TySignalProcessing
using TyDSPSystem
D = fdesign_lowpass("N,F3db", 6, 0.2)
d = design(D, "butter", "SystemObject", true)
include(pkgdir(TySignalProcessing) * "/examples/Resource/embedsos_scale_values.jl")
d.SOSMatrix = embedsos_scale_values(d.SOSMatrix, d.ScaleValues)
grpdelay(d.SOSMatrix; plotfig=true)

# 输入参数
b,a - 传递函数系数向量
传递函数系数,指定为向量。 用 b 和 a 表示传递函数为:
示例: b = [1 3 3 1]/6 和 a = [3 0 1 0]/3 指定具有归一化 3 dB 频率 0.5π rad/sample 的 3 阶巴特沃斯滤波器。
数据类型: Float
n - 评估点数512(默认) | 正整数标量
评估点数,指定为不小于 2 的正整数标量。当 n 不存在时,默认为 512。为获得最佳结果,请将 n 设置为大于滤波器阶数的值。
数据类型: Int
win,fin - 频率向量向量
评估滤波器在输入的频率向量中的群延迟。
sos - 二阶基本节系数矩阵
二阶基本节系数,指定为矩阵。 sos 是一个 K×6 矩阵,其中段数 K 必须大于或等于 2。如果段数小于 2,函数将输入视为分子向量。 sos 的每一行对应一个二阶(双二阶)滤波器的系数。 sos 的第 i 行对应 [bi[1] bi[2] bi[3] ai[1] ai[2] ai[3]]。
数据类型: Float
fs - 采样率正标量
采样率,指定为正标量。 当时间单位为秒时,fs 以赫兹表示。
数据类型: Float
# 输出参数
gd - 群延迟响应向量
群延迟响应,以向量形式返回。 如果指定 n,则 gd 的长度为 n。 如果不指定 n,或指定 n 作为空向量,则 gd 的长度为 512。
数据类型: Float
w - 角频率向量
角频率,以向量形式返回。 w 的值范围从 0 到 π。 如果您在输入中指定 "whole",则 w 中的值范围从 0 到 2π。
如果指定 n,则 w 的长度为 n。 如果不指定 n,或指定 n 作为空向量,则 w 的长度为 512。
f - 频率向量
频率,以赫兹表示的向量形式返回。 f 的值范围从 0 到 fs/2 Hz。 如果您在输入中指定 "whole",则 f 中的值范围从 0 到 fs Hz。 如果指定 n,则 f 的长度为 n。 如果不指定 n,或指定 n 作为空向量,则 f 的长度为 512。
# 详细信息
滤波器的群延迟响应是作为频率函数的滤波器平均延迟的量度,它是滤波器相位响应的负一阶导数。如果滤波器的频率响应为
其中 θ(ω) 是
# 版本历史记录
在 2024a 之前推出
2025b SP1:grpdelay 输出频率修改为总是向量
grpdleay(sos,w) 和 grpdelay(sos,f,fs) 用法,输出的频率更改为总是向量,例如:
b,a = butter(10,0.6)
sos, = tf2sos(b,a)
_, wout = grpdelay(sos,(pi/10:pi/10:pi)')
更新前结果:
wout
1×10 adjoint(::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}) with eltype Float64:
0.314159 0.628319 0.942478 1.25664 1.5708 1.88496 2.19911 2.51327 2.82743 3.14159
2025b SP1 更新后结果:
wout
10-element Vector{Float64}:
0.3141592653589793
0.6283185307179586
0.9424777960769379
1.2566370614359172
1.5707963267948966
1.8849555921538759
2.199114857512855
2.5132741228718345
2.827433388230814
3.141592653589793