4. 信号处理基础:时域分析、频域分析与时频分析

各位工程师朋友,大家好。这一章我们聊聊信号处理。说实话,干我们风电振动分析这行,信号处理就是吃饭的家伙。你拿到的原始数据,说白了就是一堆电压值或者加速度值,乱七八糟的。怎么从这里面看出门道?就得靠时域、频域和时频分析这三板斧。

我个人习惯,拿到数据先做时域分析,心里有个大概。然后再做频域,找具体频率。最后,如果遇到非平稳信号,就得请出时频分析这个杀手锏。咱们一个一个来。

信号处理基础:三大分析方法 时域分析 • 峰值 • 均方根值 • 峭度 直观,看幅值变化 频域分析 • FFT • 功率谱密度 找频率成分,定位故障 时频分析 • 短时傅里叶变换 • 小波变换 非平稳信号的利器 从简单到复杂,从平稳到非平稳

4.1 时域分析:最直观的第一印象

时域分析,说白了就是看波形。横轴是时间,纵轴是幅值。你想想看,一个正常的风机,振动波形应该是平稳的、随机的。如果突然出现一个很大的尖峰,或者波形变得有规律了,那肯定有问题。

常用的时域指标,我归纳为三个:峰值、均方根值和峭度。

4.1.1 峰值

峰值就是信号的最大绝对值。这个指标很简单,但很实用。我在项目中遇到过,有一次塔筒振动报警,一看峰值,比平时大了三倍。上去一查,原来是螺栓松了。峰值对瞬时冲击特别敏感,但缺点也很明显——它容易受噪声干扰。一个偶然的毛刺,就能让峰值变得很大。

我的习惯: 看峰值时,一定要结合原始波形一起看。如果峰值很大,但波形整体平稳,那多半是噪声。如果波形本身就有大尖峰,那才是真问题。

4.1.2 均方根值

均方根值,英文叫RMS,是反映信号能量的指标。它比峰值稳定得多,是振动分析中最常用的量。说白了,RMS值越大,振动能量越大,对设备的破坏力也越大。

举个例子,一个轴承正常磨损时,RMS值会缓慢上升。如果RMS值突然跳变,那可能是出现了严重故障。我一般用RMS值做长期趋势监测,每天记录一次,画成曲线,一目了然。

计算公式: RMS = sqrt( (1/N) * Σ x_i² )
其中 x_i 是采样点,N 是采样点数。

4.1.3 峭度

峭度这个指标,很多人容易忽略。它反映的是信号分布的"尖锐程度"。正常振动信号,峭度值接近3。如果峭度远大于3,说明信号中有很多冲击成分。

我记得有一次,一个齿轮箱的振动RMS值变化不大,但峭度从3.2飙到了8.5。我当时就觉得不对劲,拆开一看,齿轮上已经有了裂纹。峭度对早期故障特别敏感,尤其是轴承和齿轮的局部损伤。

注意: 峭度对冲击敏感,但也对噪声敏感。如果传感器安装不牢,或者有电磁干扰,峭度值也会虚高。所以,峭度要结合波形一起看,别被假象骗了。

4.2 频域分析:找到故障的"身份证"

时域分析能告诉你"有没有问题",但频域分析能告诉你"问题出在哪"。每个旋转部件都有自己特定的频率,比如转频、齿轮啮合频率、轴承故障频率。通过频域分析,我们可以把这些频率找出来。

4.2.1 FFT(快速傅里叶变换)

FFT是频域分析的核心工具。它把时域信号变换到频域,让我们看到信号由哪些频率成分组成。说白了,就是把一堆乱糟糟的波形,拆解成一个个正弦波。

做FFT时,有几个参数要特别注意:采样频率和采样点数。采样频率至少是最高分析频率的两倍,这是奈奎斯特定理说的。采样点数决定了频率分辨率,点数越多,分辨率越高。

# Python示例:简单的FFT分析
import numpy as np
import matplotlib.pyplot as plt

# 生成模拟信号:50Hz + 120Hz + 噪声
fs = 1000  # 采样频率 1000Hz
t = np.arange(0, 1, 1/fs)
x = 0.7*np.sin(2*np.pi*50*t) + 1.2*np.sin(2*np.pi*120*t) + 0.5*np.random.randn(len(t))

# 做FFT
X = np.fft.fft(x)
freq = np.fft.fftfreq(len(x), 1/fs)

# 只取正频率部分
X_mag = np.abs(X[:len(X)//2])
freq_pos = freq[:len(freq)//2]

# 绘制频谱
plt.plot(freq_pos, X_mag)
plt.xlabel('频率 (Hz)')
plt.ylabel('幅值')
plt.title('FFT频谱分析')
plt.grid(True)
plt.show()
避坑指南: 我曾经犯过一个错误,采样频率设得太低,结果把高频信号混叠到了低频区,怎么分析都不对。后来才意识到是混叠问题。所以,采样频率一定要留足余量,至少是最高频率的2.56倍,这是工程上的常用做法。

4.2.2 功率谱密度

功率谱密度,简称PSD,是FFT的升级版。它描述的是信号功率在频率上的分布。对于随机振动,PSD比FFT更稳定,更物理。说白了,FFT看的是幅值,PSD看的是能量。

在风电行业,PSD常用于分析风载荷引起的振动。风是随机的,它的能量分布在很宽的频率范围内。通过PSD,我们可以知道哪个频段的能量最大,从而优化控制策略。

指标 FFT PSD
物理意义 幅值 功率/能量
适用信号 周期信号、确定性信号 随机信号、平稳信号
单位 g 或 m/s² g²/Hz 或 (m/s²)²/Hz
稳定性 受噪声影响大 平均后更稳定

4.3 时频分析:对付"变脸"信号的绝招

前面说的时域和频域分析,都假设信号是平稳的。但风机的振动信号,很多是非平稳的。比如变桨过程中,转速在变,频率也在变。这时候,时频分析就派上用场了。

4.3.1 短时傅里叶变换

短时傅里叶变换,简称STFT。它的思路很简单:把信号切成一段一段,对每一段做FFT。这样,我们就能看到频率随时间的变化。

STFT有个关键参数:窗函数和窗长。窗长决定了时间分辨率和频率分辨率的平衡。窗越长,频率分辨率越高,但时间分辨率越低。反之亦然。这是个trade-off,没有完美的选择。

我的经验: 对于风机变桨过程的振动分析,我一般用汉宁窗,窗长取256或512点。这样既能看清频率变化,又不会丢失时间信息。

4.3.2 小波变换

小波变换是STFT的升级版。它用可伸缩的小波基函数代替了固定长度的窗函数。低频时用长窗,高频时用短窗,自动适应信号特点。说白了,小波变换能同时兼顾时间和频率的分辨率。

小波变换在风电中应用很广。比如,检测叶片裂纹、齿轮箱早期故障,小波变换比STFT更灵敏。我记得有一次,一个轴承的微弱冲击信号,在STFT上几乎看不到,但在小波时频谱上清晰可见。

# Python示例:小波变换(使用PyWavelets库)
import pywt
import numpy as np
import matplotlib.pyplot as plt

# 生成模拟信号:频率随时间变化
fs = 1000
t = np.linspace(0, 1, fs)
x = np.sin(2*np.pi*50*t**2)  # 频率从0线性增加到100Hz

# 做连续小波变换
scales = np.arange(1, 128)
coef, freqs = pywt.cwt(x, scales, 'morl', sampling_period=1/fs)

# 绘制时频谱
plt.imshow(np.abs(coef), extent=[0, 1, freqs[-1], freqs[0]], 
           aspect='auto', cmap='jet')
plt.xlabel('时间 (s)')
plt.ylabel('频率 (Hz)')
plt.title('小波时频谱')
plt.colorbar(label='幅值')
plt.show()
注意: 小波变换虽然强大,但计算量大,不适合实时分析。另外,小波基的选择也很关键。不同的小波基,分析结果可能差异很大。我建议多试几种,找到最适合你信号的那一个。

4.4 三种方法的对比与选择

说了这么多,到底什么时候用哪种方法?我总结了一个简单的选择逻辑:

  • 先做时域分析:看峰值、RMS、峭度,判断有没有异常。这是第一步,快速筛查。
  • 再做频域分析:如果时域有异常,用FFT或PSD找具体频率,定位故障源。这是第二步,精确定位。
  • 最后用时频分析:如果信号是非平稳的,或者故障特征在时域和频域都不明显,用小波或STFT。这是第三步,深度挖掘。

嗯,这套流程我用了十几年,基本没出过大的偏差。当然,具体问题还得具体分析。比如,对于轴承故障,我习惯先看峭度,再看包络谱。对于齿轮故障,我更喜欢用倒频谱。这些后面章节会详细讲。

最后说一句: 工具再好,也得靠人用。别迷信任何一种方法,多对比、多验证,才能做出准确的判断。我在现场见过太多人,拿着频谱图瞎猜,结果拆开机器发现根本不是那回事。所以,信号处理是基础,但现场经验同样重要。

公众号:蓝海资料掘金营,微信deep3321