引言:信号分析的双重视角

在工程、物理和电子领域,信号分析是诊断和优化的核心工具。信号通常以时域形式呈现,即随时间变化的波形,例如振动传感器记录的机器振动或麦克风捕捉的音频波形。然而,仅凭时域波形往往难以揭示隐藏的复杂信息,如特定频率成分的贡献或故障的根源。这就是频域分析的用武之地。通过将信号从时域转换到频域,我们可以将复杂的波形分解为基本频率成分的叠加,从而揭示故障频率(如旋转机械的轴承缺陷)和噪声源(如电磁干扰或环境噪声)。

频域分析的核心是傅里叶变换(Fourier Transform),它将信号表示为正弦波的组合。这种转换不仅帮助我们“看到”信号的频率组成,还能精确定位问题源头。本文将详细探讨从时域到频域的转换过程、频谱特征的解读,以及如何应用这些知识定位故障和噪声源。我们将结合理论解释、实际步骤和代码示例,确保内容通俗易懂且实用。

1. 时域信号的基础:理解波形的本质

时域信号的定义与表示

时域信号是信号在时间维度上的表示,通常以时间序列数据形式存在。例如,一个简单的正弦波信号可以表示为: [ x(t) = A \sin(2\pi f t + \phi) ] 其中,( A ) 是振幅,( f ) 是频率,( \phi ) 是相位。在实际应用中,时域信号往往是采样得到的离散序列,如 ( x[n] = x(nT_s) ),其中 ( T_s ) 是采样周期。

时域波形直观地展示了信号的幅度随时间的变化,但对于复杂信号(如包含多个频率成分的振动信号),它很难直接识别特定频率的贡献。例如,考虑一个旋转机械的振动信号:时域波形可能显示杂乱的波动,但无法直接看出是轴承故障(高频成分)还是轴不对中(低频成分)导致的。

时域分析的局限性

  • 直观但不深入:时域只能看到整体幅度和趋势,无法分离频率成分。
  • 噪声干扰:噪声往往掩盖有用信号,使得故障特征模糊。
  • 多成分叠加:真实信号是多个正弦波的叠加,时域波形是它们的总和,难以分解。

为了克服这些局限,我们需要转向频域分析。

2. 频域分析的核心:傅里叶变换与频谱

傅里叶变换的基本原理

傅里叶变换(FT)是频域分析的数学基础。它将连续时域信号 ( x(t) ) 转换为频域表示 ( X(f) ): [ X(f) = \int_{-\infty}^{\infty} x(t) e^{-j2\pi f t} dt ] 对于离散信号,我们使用离散傅里叶变换(DFT),其快速算法是快速傅里叶变换(FFT)。

FFT 将 N 个采样点的时域序列 ( x[n] ) 转换为 N 个频率点的复数序列 ( X[k] ),其中每个 ( X[k] ) 对应频率 ( f_k = k \cdot \frac{f_s}{N} ),( f_s ) 是采样频率。幅度谱 ( |X[k]| ) 显示每个频率的强度,相位谱 ( \angle X[k] ) 显示相位关系。

频谱的特征解读

频谱图(幅度 vs. 频率)揭示了信号的“指纹”:

  • 峰值:对应主要频率成分,如基频(fundamental frequency)或谐波(harmonics)。
  • 宽带噪声:均匀分布的低幅度成分,表示随机噪声。
  • 边带:围绕峰值的频率带,常表示调制或故障特征。

例如,在机械故障诊断中,轴承故障往往产生高频“冲击”成分(如 1-5 kHz),而轴不平衡产生低频谐波(如 1x、2x 转速频率)。

代码示例:使用 Python 进行 FFT 分析

我们使用 Python 的 NumPy 和 Matplotlib 库来演示从时域到频域的转换。假设我们有一个模拟的振动信号,包含 50 Hz 的基频和 100 Hz 的故障谐波,加上一些噪声。

import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft, fftfreq

# 参数设置
fs = 1000  # 采样频率 (Hz)
T = 1.0    # 信号持续时间 (s)
N = int(fs * T)  # 采样点数
t = np.linspace(0, T, N, endpoint=False)  # 时间数组

# 生成时域信号:50 Hz 基频 + 100 Hz 故障谐波 + 高斯噪声
f1 = 50  # 基频 (Hz)
f2 = 100 # 故障频率 (Hz)
A1, A2 = 1.0, 0.5  # 振幅
signal = A1 * np.sin(2 * np.pi * f1 * t) + A2 * np.sin(2 * np.pi * f2 * t)
noise = 0.2 * np.random.normal(size=N)  # 噪声
x = signal + noise  # 总信号

# 计算 FFT
X = fft(x)
freqs = fftfreq(N, 1/fs)[:N//2]  # 只取正频率
magnitudes = 2.0/N * np.abs(X[:N//2])  # 幅度谱 (归一化)

# 绘图
plt.figure(figsize=(12, 6))

# 时域波形
plt.subplot(2, 1, 1)
plt.plot(t, x)
plt.title('时域波形:振动信号 (含噪声)')
plt.xlabel('时间 (s)')
plt.ylabel('幅度')
plt.grid(True)

# 频域频谱
plt.subplot(2, 1, 2)
plt.plot(freqs, magnitudes)
plt.title('频域频谱:FFT 幅度谱')
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.xlim(0, 200)  # 只显示 0-200 Hz
plt.grid(True)
plt.tight_layout()
plt.show()

代码解释

  • 时域部分:我们生成了一个包含 50 Hz 和 100 Hz 成分的信号,并添加噪声。时域波形看起来杂乱,但 FFT 能清晰分离出 50 Hz 和 100 Hz 的峰值。
  • 频域部分:FFT 输出幅度谱,峰值对应于输入频率。噪声表现为低幅度的宽带背景。
  • 实际应用:在真实场景中,你可以替换 x 为从传感器读取的数据(如振动数据文件)。这有助于识别故障频率,例如如果 100 Hz 峰值异常高,则可能表示轴承故障。

通过这个例子,你可以看到频域如何将时域的“混沌”转化为清晰的频率“地图”。

3. 从时域到频域的转换过程:步骤详解

步骤 1: 数据采集与预处理

  • 采样:确保采样频率 ( f_s ) 满足奈奎斯特准则(( f_s > 2 \times ) 最高感兴趣频率),以避免混叠。
  • 预处理:去除直流偏移、应用窗函数(如汉宁窗)减少频谱泄漏。
    • 窗函数示例:在 FFT 前乘以窗函数 ( w[n] ),如 x_windowed = x * np.hanning(N)

步骤 2: 应用 FFT

  • 使用上述代码中的 fft() 函数。
  • 对于长信号,可使用 Welch 方法(scipy.signal.welch)计算功率谱密度(PSD),减少噪声影响。

步骤 3: 频谱分析

  • 幅度谱:识别峰值频率。
  • 功率谱密度 (PSD):单位频率的功率,适合噪声分析。PSD = ( \frac{1}{f_s N} |X(f)|^2 )。
  • 相位谱:用于分析信号同步性,但故障诊断中较少用。

示例:Welch 方法的 PSD 分析

对于噪声源定位,PSD 更有效。以下代码扩展上述例子,使用 Welch 方法计算 PSD。

from scipy.signal import welch

# 计算 PSD
f_psd, psd = welch(x, fs, nperseg=256, window='hann')

plt.figure(figsize=(8, 4))
plt.semilogy(f_psd, psd)  # 对数尺度显示
plt.title('功率谱密度 (PSD)')
plt.xlabel('频率 (Hz)')
plt.ylabel('功率/频率 (V^2/Hz)')
plt.xlim(0, 200)
plt.grid(True)
plt.show()

解释:Welch 方法将信号分段计算 FFT 并平均,减少随机噪声。PSD 曲线显示噪声在所有频率的分布,帮助识别宽带噪声源(如电子噪声)。

4. 频谱特征解读:识别故障频率与噪声源

4.1 故障频率的定位

故障频率通常与机械旋转相关:

  • 基频 (1x):转速频率,计算为 ( f_{\text{rotor}} = \frac{\text{RPM}}{60} )。
  • 谐波:2x、3x 等,表示不平衡或不对中。
  • 轴承故障:特征频率如球通过频率 (BPFO/BPFI),公式复杂,但频谱中表现为高频峰值(>1 kHz)。
  • 齿轮故障:啮合频率及其边带。

定位方法

  1. 计算预期故障频率(基于机械参数)。
  2. 在频谱中搜索匹配峰值。
  3. 检查幅度是否异常(例如,超过正常水平 3 倍)。

例子:一台电机转速 1800 RPM(30 Hz),频谱中 30 Hz 峰值高表示不平衡;如果 120 Hz(4x)峰值高,则可能是不对中。

4.2 噪声源的识别

噪声分为:

  • 随机噪声:宽带 PSD,均匀分布。来源:热噪声、风噪。
  • 周期噪声:窄带峰值,如 5060 Hz 电源干扰。
  • 冲击噪声:瞬时高频成分,如电弧。

定位方法

  1. 频谱过滤:使用带通滤波器隔离特定频段,观察时域变化。
  2. 相干分析:比较两个信号的相干性(scipy.signal.coherence),定位噪声源(如振动与噪声的相关性)。
  3. 时频分析:对于非平稳噪声,使用短时傅里叶变换 (STFT) 或小波变换。

代码示例:带通滤波器隔离噪声 假设我们想隔离 50-60 Hz 的电源噪声。

from scipy.signal import butter, filtfilt

# 设计带通滤波器 (Butterworth)
lowcut, highcut = 50, 60
nyquist = 0.5 * fs
low = lowcut / nyquist
high = highcut / nyquist
b, a = butter(4, [low, high], btype='band')

# 应用滤波器
filtered_x = filtfilt(b, a, x)

# 绘制滤波后时域和频域
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(t, filtered_x)
plt.title('滤波后时域 (50-60 Hz)')
plt.xlabel('时间 (s)')
plt.ylabel('幅度')
plt.grid(True)

# FFT 滤波后信号
X_filt = fft(filtered_x)
magnitudes_filt = 2.0/N * np.abs(X_filt[:N//2])
plt.subplot(2, 1, 2)
plt.plot(freqs, magnitudes_filt)
plt.title('滤波后频谱')
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.xlim(0, 200)
plt.grid(True)
plt.tight_layout()
plt.show()

解释:滤波后,只有 50-60 Hz 成分保留。如果滤波信号在时域中显示周期性波动,则确认电源噪声是主要来源。通过比较滤波前后总功率,可以量化噪声贡献(例如,使用 np.sum(psd) 计算总功率)。

4.3 高级技巧:多通道分析与故障诊断

  • 多传感器:使用两个振动传感器,计算互谱或相干性,定位故障位置(例如,上游 vs. 下游)。
  • 阶次分析:对于变速机械,将频率归一化为转速阶次(order),避免 RPM 变化的影响。
  • 机器学习辅助:提取频谱特征(如峰值频率、总谐波失真 THD)作为输入,训练模型自动分类故障。

THD 计算示例: 总谐波失真衡量谐波对基频的影响: [ \text{THD} = \frac{\sqrt{A_2^2 + A_3^2 + \dots}}{A_1} \times 100\% ] 在代码中,从频谱提取峰值幅度计算 THD,如果 >5%,表示严重故障。

5. 实际应用案例:工业振动诊断

案例背景

一家工厂的离心泵振动异常。时域波形显示高幅度波动,但无法定位问题。

分析过程

  1. 采集:采样频率 10 kHz,记录 10 秒数据。
  2. FFT:频谱显示 25 Hz(泵转速 1500 RPM)峰值正常,但 1 kHz 处有异常峰值。
  3. 定位:1 kHz 匹配轴承内圈故障频率(基于轴承几何计算)。
  4. 噪声分析:PSD 显示 60 Hz 宽带噪声,相干分析确认来自电机电磁干扰。
  5. 行动:更换轴承,添加滤波器消除 60 Hz 噪声,振动降低 80%。

这个案例展示了频域分析如何从“症状”到“病因”的精准诊断。

6. 常见 pitfalls 与最佳实践

  • 采样不足:导致混叠,确保 ( f_s ) 足够高。
  • 频谱泄漏:使用窗函数。
  • 噪声影响:多次平均或使用 Welch 方法。
  • 工具选择:Python (SciPy)、MATLAB、LabVIEW 适合工程;对于实时分析,使用嵌入式 FFT 库。
  • 安全考虑:在工业环境中,确保数据采集不影响设备运行。

结论:频域分析的强大威力

通过从时域波形到频谱特征的转换,频域分析为我们提供了诊断故障和噪声源的精确工具。它不仅揭示了信号的内在结构,还指导了针对性的维护策略。掌握 FFT、频谱解读和滤波技术,你将能高效定位问题,提升系统可靠性。建议从简单模拟信号开始实践,逐步应用到真实数据中。如果你有特定场景或数据,我们可以进一步定制分析。