2026a

# 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、 和 2。要产生 chirp,可使用梯形法则将相位表示为转速的积分。

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,振幅为 。对于第二个电机,信号阶数为 0.8,振幅为

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.

# 另请参阅

orderspectrum | orderwaveform | rpmordermap