# ordertrack
跟踪并提取振动信号的阶次幅度
函数库: TySignalProcessing
# 语法
mag, = ordertrack(x, fs, rpm, orderlist)
mag, rpm, time = ordertrack(x, fs, rpm, orderlist)
__ = ordertrack(x, fs, rpm, orderlist, rpmrefidx)
__ = ordertrack(map, order, rpm, time, orderlist)
__ = ordertrack(___; Name=Value)
ordertrack(; plotfig=true)
# 说明
mag, = ordertrack(x, fs, rpm, orderlist) 返回一个矩阵 mag,其中包含输入信号 x 中指定阶次集合 orderlist 的随时间变化的均方根(RMS)振幅估计值。x 是在以每分钟转数表示的设定转速下测量的。fs 是测量采样率,单位 Hz。
mag, rpm, time = ordertrack(x, fs, rpm, orderlist) 返回与 mag 列相对应的转速和时间值向量。
__ = ordertrack(x, fs, rpm, orderlist, rpmrefidx) 使用一阶 Vold-Kalman 滤波器提取阶次幅度,并返回之前语法中的任何输出参数。
__ = ordertrack(map, order, rpm, time, orderlist) 计算一个幅度估计值矩阵,该矩阵由一个阶次-RPM 图 map、一个阶次向量 order 和一个时刻向量 time 组成。返回的振幅和比例与 map 中的相同。
__ = ordertrack(___; Name=Value) 使用名称-值对指定更多选项。有些选项只适用于 Vold-Kalman 追踪程序。
ordertrack(; plotfig=true) 在当前图中绘制出随时间变化的阶次和 RPM 值。
# 示例
4 阶 Chirp 信号的阶次幅度
创建一个以 600 Hz 频率采样的模拟信号,持续 5 秒钟。在观察期间,测试系统的转速从每秒 10 转增加到 40 转(或相当于从每分钟 600 转增加到 2400 转)。
生成转速计读数。
using TySignalProcessing
using TyMath
fs = 600
t1 = 5
t = 0:(1 / fs):t1
f0 = 10
f1 = 40
rpm = 60 * collect(LinRange(f0, f1, length(t)))
信号由四个谐波相关的阶次为 1、0.5、4 和 6 的 chirp 信号组成。chirp 的振幅分别为 1、1/2、
o1 = 1
o2 = 0.5
o3 = 4
o4 = 6
a1 = 1
a2 = 0.5
a3 = sqrt(2)
a4 = 2
ph = 2 * pi * cumtrapz(rpm / 60) ./ fs
x = [a1 a2 a3 a4] * cos.([o1 o2 o3 o4]' * ph')
提取并直观显示阶次的大小。
ordertrack(x, fs, rpm, [o1 o2 o3 o4]; plotfig=true)

跟踪交叉阶比
创建一个模拟振动信号,该信号由两个交叉阶组成,分别对应两个不同的电机。信号采样频率为 300 Hz,持续 3 s。在测量过程中,第一台电机的转速从每秒 10 转增加到 100 转(或相当于每分钟从 600 转增加到 6000 转)。第二台电机的转速在同一时间内从每秒 50 转增加到 70 转(或每分钟 3000 转增加到 4200 转)。
using TySignalProcessing
using TyMath
fs = 300
nsamp = 3 * fs
rpm1 = collect(LinRange(10, 100, nsamp) * 60)
rpm2 = collect(LinRange(50, 70, nsamp) * 60)
对于第一台电机,测量信号的阶数为 1.2,振幅为
x = [2 4] .* sqrt(2) .* cos.(2 * pi * cumtrapz([1.2 * rpm1 0.8 * rpm2] / 60) / fs)
让第一个电机在频率范围的中间位置产生共振。
rs = [(1 .+ 1 ./ (1 .+ collect(LinRange(-10, 10, nsamp)) .^ 4) / 2) ones(nsamp, 1)]
x = sum(rs .* x; dims=2)
计算两台电机的阶次大小与 RPM 的函数关系。使用 Vold-Kalman 算法解耦交叉阶次。
mag, Rpm, time = ordertrack(
x, fs, [rpm1 rpm2], [1.2 0.8], [1 2]; Decouple=true, plotfig=true
)

直升机震动数据的阶次跟踪
分析放置在直升机驾驶舱内的加速度计的模拟数据。
加载直升机数据。振动测量值 vib 的采样率为 500 Hz,持续 10 s。对数据进行检查后会发现其具有线性趋势。移除该趋势,防止其降低阶次估计的质量。
using TySignalProcessing
using TyBase
using TyMath
vib = pkgdir(TySignalProcessing) * "/examples/VibrationAnalysis/ordertrack/helidata.mat"
load(vib)
vib = detrend(vib)
计算阶次-RPM 图。指定阶次分辨率为 0.005。
map, order, Rpm, time, res = rpmordermap(vib, fs, rpm, 0.005)
计算并信号的平均阶谱。
spectrum, specorder = orderspectrum(map, order)
_, pkords = findpeaks(spectrum, specorder; SortStr="descend", NPeaks=3)
跟踪三个最高峰的振幅。
mag, Rpm, time = ordertrack(map, order, Rpm, time, pkords)
mag = 3×8 Matrix{Float64}:
2.97552 5.42441 6.75203 7.218 6.94329 6.18961 5.24709 4.26343
2.19229 3.97012 4.84644 5.05688 5.01001 4.41406 3.69302 3.11241
1.27453 2.34548 2.79305 2.86163 2.76399 2.53551 2.1653 1.78417
Rpm = 8-element Vector{Float64}:
18320.011584805452
24315.024225791494
26808.290194994872
27601.168791046905
27241.99398155246
25832.830784661164
23726.02346743598
21731.454208248033
time = 8-element Vector{Float64}:
2.043851689176856
3.0910640817999133
3.9704574008121956
4.799102220844088
5.621773516624196
6.471850515477709
7.385801946217741
8.382586680501976
# 输入参数
x - 输入信号向量
输入信号,指定为行或列向量。
示例: cos.(pi/4*(0:159)')+randn(1,160) 表示嵌入白高斯噪声的正弦波。
fs - 采样率正标量
采样率,以 Hz 为单位的正标量。
rpm - 转速正值向量 | 正值矩阵
转速,指定为正值向量或矩阵,单位为每分钟转数。如果 rpm 是一个向量,它的长度必须与 x 相同。如果 rpm 是一个矩阵,并且指定了 rpmrefidx,那么 rpm 必须至少有两列,每列的元素数必须与 x 相同。
如果有转速计脉冲信号,可使用 tachorpm 直接提取 rpm;
如果没有转速计脉冲信号,则使用 rpmtrack 从振动信号中提取转速。
示例: 100:10:3000 表示系统初始转速为每分钟 100 转,然后以 10 为增量运行到每分钟 3000 转。
orderlist - 阶次列表向量
阶次列表,以向量形式指定。阶次列表的值不得大于 fs/(2 × max(rpm/60))。
rpmrefidx - RPM 列索引向量
RPM 列索引,指定为与 orderlist 大小相同的向量。该参数的存在表示将使用 Vold-Kalman 算法。
map - 阶次-RPM 图矩阵
以矩阵形式指定的阶次-RPM 图。使用 rpmordermap 计算阶次-RPM 图。
order - 阶次-RPM 图语法中的阶次向量
阶次-RPM 图语法中的阶次,以向量形式指定。order 的长度必须等于 map 中的行数。
time - 时刻向量
时刻,以向量形式输入。
# 名称-值对参数
指定 Name=Value 参数对。Name 是参数名称,Value 是相应的值。您可以按任意顺序指定多个名称和值对参数,如 Name1=Value1,...,NameN=ValueN。
示例: Decouple=true,Amplitude="peak" 同时提取指定的阶次,并返回每个阶次的峰值振幅。
Amplitude - 振幅类型"rms"(默认) | "peak" | "power"
振幅类型,包括 Amplitude 和 "rms"、"peak" 或 "power":
"rms" - 返回每个估计阶次的均方根振幅;
"peak" - 返回每个估计阶次的峰值振幅;
"power" - 返回每个估计阶次的功率水平。
Scale - 幅值缩放"linear"(默认) | "dB"
幅度缩放,以 Scale 和 "linear" 或 "dB" 对指定:
"linear" - 以线性单位返回幅值;
"dB" - 返回按对数缩放并以分贝表示的幅值。
Bandwidth - 近似半功率带宽fs/100(默认) | 实标量 | 实向量
近似半功率带宽,包括 Bandwidth 和一个实数标量或一个与 orderlist 元素数目相同的实数向量。较小的 Bandwidth 值会产生平滑的窄带输出。但是,这种输出可能无法准确反映阶次振幅的快速变化。此参数仅适用于 Vold-Kalman 算法。
Decouple - 模式解耦选项false(默认) | true
模式去耦选项,由 Decouple 和布尔值组成。如果将该选项设置为 true,ordertrack 将同时提取阶次幅度,从而能够分离间距较近或交叉的阶次。该参数仅适用于 Vold-Kalman 算法。
SegmentLength - 重叠区段的长度整数
重叠区段的长度,以 SegmentLength 和整数对指定。如果指定了信号段长度,ordertrack 就会将输入信号分成若干信号段。然后计算每个分段的阶次幅度,并将结果合并生成输出。如果分段太短,函数可能无法正确捕捉局部事件,如交叉阶次。此参数仅适用于 Vold-Kalman 算法。
# 输出参数
mag - 阶次-幅度矩阵矩阵
阶次-幅度矩阵,以矩阵形式返回。
rpm - 转速正值向量
转速,以正值向量形式返回,单位为每分钟转数。
time - 时刻向量
时刻,以向量形式返回。
# 参考文献
[1] Brandt, Anders. Noise and Vibration Analysis: Signal Analysis and Experimental Procedures. Chichester, UK: John Wiley & Sons, 2011.
[2] Feldbauer, Christian, and Robert Höldrich. "Realization of a Vold-Kalman Tracking Filter — A Least Squares Problem." Proceedings of the COST G-6 Conference on Digital Audio Effects (DAFX-00). Verona, Italy, December 7–9, 2000.
[3] Vold, Håvard, and Jan Leuridan. "High Resolution Order Tracking at Extreme Slew Rates Using Kalman Tracking Filters." Shock and Vibration. Vol. 2, 1995, pp. 507–515.
[4] Tůma, Jiří. “Algorithms for the Vold-Kalman Multiorder Tracking Filter.” Proceedings of the 14th International Carpathian Control Conference (ICCC), 2013, pp. 388–94.