对阶次分析的一些理解
本文是我在项目过程中,对振动加速度数据的阶次分析的一些理解
频谱分析
原理
在不考虑数据滤波的情况下,频谱分析为时域数据作FFT的结果,其中纵轴为振动幅度(常见单位有g,mm/s2等),横轴为频率,其中,能够采集到的最大频率为Fmax,频谱分辨率为Fn,采样率为Fs,采样点数为N
\[
F_{max}=\frac{Fs}{2}, F_n=\frac{Fs}{N}
\] 示例: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20Fs = 1024
Fb = 10
x = np.arange(0, 1024)
t = x / Fb
data_len = 1024
y = np.sin(2 * np.pi * x / Fs * Fb)
fft_y = np.fft.fft(y)
fft_y = (np.abs(fft_y) / data_len)[range(int(data_len / 2))] * 2
fft_y[0] = fft_y[0] / 2
fig, ax = plt.subplots(2, 1)
line_0 = ax[0].plot(t, y)
ax[0].set_xlabel('time [s]')
line_1 = ax[1].plot(fft_y)
ax[1].set_xlabel('Frequency [Hz]')
mplcursors.cursor(line_0, hover=False, multiple=True).connect("add", lambda sel: sel.annotation.set_text(
f"x={sel.target[0]:.2f}, y={sel.target[1]:.2f}"))
mplcursors.cursor(line_1, hover=False, multiple=True).connect("add", lambda sel: sel.annotation.set_text(
f"x={sel.target[0]:.2f}, y={sel.target[1]:.2f}"))
plt.show()
阶次分析
阶次分析和频谱分析有完全不同的应用场景,阶次分析的好处是,一个转动系统,转速往往一直在变化,如果做频谱分析,我们会发现频谱会随转速变化,但是阶次分析与转速无关。频率分析适合系统中有固定频率存在的情况,而阶次分析适合系统中各部件互相耦合,转速一致变化的情况
基于时域采样的阶次分析
假设基准频率固定为FHz,转速为Srpm,易得: \[
F=\frac{S}{60}
\] 传统的频谱分析也是基于时域采样,所以,频谱到阶次谱只需要:
1
2# fft_y不变
fft_x = fft_x / F
非平稳信号的拖尾效应示例: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24Fb = 10
x = np.arange(0, 1024)
t = x / Fb
data_len = 1024
order_x = np.linspace(0, int(data_len / 2 / Fb), int(data_len / 2))
instantaneous_frequency = Fb + np.linspace(0, 20, data_len )
y = np.sin(2 * np.pi * np.cumsum(instantaneous_frequency) / len(t))
fft_y = np.fft.fft(y)
fft_y = (np.abs(fft_y) / data_len)[range(int(data_len / 2))] * 2
fft_y[0] = fft_y[0] / 2
fig, ax = plt.subplots(3, 1)
line_0 = ax[0].plot(t, y)
ax[0].set_xlabel('Time [s]')
line_1 = ax[1].plot(fft_y)
ax[1].set_xlabel('Frequency [Hz]')
line_2 = ax[2].plot(order_x, fft_y)
ax[2].set_xlabel('Order')
mplcursors.cursor(line_0, hover=False, multiple=True).connect("add", lambda sel: sel.annotation.set_text(
f"x={sel.target[0]:.2f}, y={sel.target[1]:.2f}"))
mplcursors.cursor(line_1, hover=False, multiple=True).connect("add", lambda sel: sel.annotation.set_text(
f"x={sel.target[0]:.2f}, y={sel.target[1]:.2f}"))
mplcursors.cursor(line_2, hover=False, multiple=True).connect("add", lambda sel: sel.annotation.set_text(
f"x={sel.target[0]:.2f}, y={sel.target[1]:.2f}"))
plt.show()
基于角度域采样的阶次分析
角度域采样的原理是,选择旋转部件,该部件旋转一周,等间隔采样N个点,此时N为角度域采样的采样频率,对角度域信号做FFT,可得到基于旋转部件转速的阶次谱
采样时间内转速无变化
假设旋转部件的转动频率为F不变,转过一圈采样N个点,每采N×n做一次FFT,由于转速不变,可知时域采样率为F * N,FFT后的频谱,点数为N×n/2,最大频率为F*N/2,我们把频谱的横轴除以旋转部件的频率,得到阶次谱,阶次谱的最大阶次为Ordermax,谱线分辨率为Ordern,可知: \[ order_{max} =\frac{ N}{2} \] \[ order_{n} =\frac{order_{max} }{\frac{N×n}{2}} =\frac{1}{n} \] 可以看到,相比于时域采样,角度域采样之后的阶次谱,最大阶次和阶次分辨率都与转速无关了,我们可以通过增大采样率N来扩大阶次谱范围,通过增大采样次数n来减小分辨率,提升精度
采样时间内转速变化
我的理解:阶次分析时需要把FFT后的频率轴转为阶次轴,也就是除以转频F,那么这里转频需要是一个固定的量,目前看到的处理方法基本为求采样时间内转速的平均值,作为该段时间的转速。如果在采样时间内转速变化很大,那么会导致求取阶次时误差也比较大
对于角度域采样,有硬件和软件两种处理方式,硬件处理是每转过恒定角度时触发采样,得到的原始数据就是角度域数据(但是不知道这种方法是否方便切换采样率);软件处理指先采集时域信号,上位机端结合转速信号对时域信号进行基于角度域的重采样,这种做法好处是采样率很好控制,坏处是软件端的工作量会比较大