振动信号抗混滤波与加窗技术

1. 振动信号分析的一般过程

我们已经知道,在求得了系统的频响函数之后,我们就可以知道关于系统质量,阻尼,刚度、频率以及模态振型的全部信息,所以信号采集的最终目的就是得到系统的频响函数 。该过程的一般步骤包括:1. 利用传感器测量输入信号与输出信号的模拟信号;2. 对输入信号与输出信号进行抗混叠滤波,这一步的目的是滤除振动信号中不关心的高频分量;3. 对信号进行数字采样,这一步的目的是将连续信号转化为离散信号,方便计算机处理,采样时应注意最低采样频率至少为最高频信号的两倍;4. 对信号进行加窗,这一步的目的是,避免信号在做傅里叶变换时出现泄露;5. 对信号进行FFT变换;6. 计算信号的自功率谱与互功率谱;7. 计算系统的频响函数与相干。这一节,将着重介绍避免信号泄露的加窗技术。

2. 振动信号的抗混滤波

我们都知道,在对连续信号进行采样时,只有保证最大采样频率至少高于信号最大分量频率的两倍,才能保证采集信号不失真。即:
f s > 2 f max ⁡ f_{s}>2 f_{\max } fs>2fmax
采样时间 T T T,采样间隔 Δ t \Delta t Δt,采样量 N N N,采样频率 f s f_s fs以及频率分辨率 Δ f \Delta f Δf之间的关系为:
f s = 1 Δ t , Δ f = 1 T , T = N Δ t = N f s f_{s}=\frac{1}{\Delta t}, \Delta f=\frac{1}{T}, T=N \Delta t=\frac{N}{f_{s}} fs=Δt1,Δf=T1,T=NΔt=fsN
不难看出,信号分辨率与采样频率之间的关系为 Δ f = f s N \Delta f=\frac{f_{s}}{N} Δf=Nfs,由此可知,如果要提高信号的采样频率,一定会导致采样分辨率变粗,并使得采样时间变短,这将造成被测数据无法完整覆盖信号的全部信息,造成信号泄露。如果频率分析仪的采样量为 N = 1024 N=1024 N=1024,取 f s = 4 f max ⁡ f_{s}=4 f_{\max } fs=4fmax,那么仪器的显示谱线为256(1024/4)线。

3. 信号加窗技术

在一个采样样本中,如果被采样信号不是周期信号,则必然出现信号的失真,包括信号频率的丢失、添加与幅值的改变。还有就是,对于周期信号,采样时间不足以完整覆盖信号的全部信息,这都会造成信号的泄露。需要明白的是,信号泄露是必然发生的,但是我们可以通过一些手段减少信号的泄露。一般来讲,减少信号泄露可以通过以下几个手段,平均技术、增加频率分辨率、使用周期/特定的激励技术、使用窗函数。而窗函数是其中较为有效的手段,他可以通过加权的方式让样本看起开更具有周期性。下面介绍几个常见的窗函数。
矩形窗适用于被测信号为周期信号,且窗长必须等于被测函数周期的整数倍。汉宁窗在平衡频率分辨率与幅值精度上拥有不错的能力。平顶窗适用于幅值精度非常高的任务。力窗可以减小输入信号的噪声。指数窗将迫使响应称为周期函数。值得注意的是,如果一个信号在一个被测时间内能够自然衰减到0,就不需要施加任何窗,这种信号称为自窗函数。

### 振动信号特征提取方法概述 振动信号的特征提取是机械状态监测和故障诊断的重要环节之一。通过有效的特征提取技术,可以从复杂的振动信号中获取反映设备健康状况的关键信息。以下是几种常见的振动信号特征提取方法及其对应的算法实现。 #### 频域分析方法 频域分析是一种常用的振动信号处理手段,其中 **Welch 方法** 是一种估计功率谱密度的有效方式。该方法通过对信号进行分段傅里叶变换来减少随机噪声的影响[^1]。 在 Python 中可以利用 `scipy.signal.welch` 函数完成这一过程: ```python from scipy.signal import welch import numpy as np fs = 1000 # Sampling frequency (Hz) t = np.linspace(0, 1, fs, endpoint=False) # Time vector frequencies = [50, 120] # Signal frequencies amplitudes = [2, 1] # Amplitude of each sine wave x = sum([amp * np.sin(2 * np.pi * freq * t) for amp, freq in zip(amplitudes, frequencies)]) + \ 0.5 * np.random.randn(len(t)) # Add noise to signal # Apply Welch method freqs, psd = welch(x, fs) print(f"Frequencies: {freqs}") print(f"Power Spectral Density: {psd}") ``` 上述代码展示了如何使用 Welch 方法计算信号的功率谱密度,并从中识别主要频率成分。 --- #### 奇异值分解(SVD) 奇异值分解是一种强大的线性代数工具,在振动信号分解中有广泛应用。它能够将复杂信号分解成若干正交子空间,从而帮助分离有用的信息干扰项[^2]。 以下是一个简单的 SVD 实现示例: ```python import matplotlib.pyplot as plt U, s, Vh = np.linalg.svd(x.reshape(-1, 1), full_matrices=False) # Perform SVD on reshaped data reconstructed_signal = U @ np.diag(s[:k]) @ Vh[:, :k].conj().T # Reconstruct using top k singular values plt.plot(reconstructed_signal.flatten(), label="Reconstructed") plt.legend() plt.show() ``` 此代码片段说明了如何选取前 \( k \) 个最大的奇异值重构原始信号,以便去除高频噪声并保留低频趋势。 --- #### 包络谱分析 对于旋转机械设备而言,包络谱分析常被用来检测早期故障迹象。其核心思想是对带通滤波后的信号求解希尔伯特变换得到包络曲线,再对其进行快速傅里叶变换获得频谱分布[^3]。下面是在 MATLAB 下的一个简单例子: ```matlab % Load vibration signal and sampling rate load('vibration_data.mat'); % Assume 'data' contains time-domain samples at Fs Hz Fs = 1e4; % Band-pass filter design parameters lowcut = 80; highcut = 2e3; [b,a] = butter(4,[lowcut highcut]/(Fs/2),'bandpass'); filteredSignal = filtfilt(b,a,data); envelopeSignal = abs(hilbert(filteredSignal)); % Compute envelope via Hilbert Transform [freq,envelopeSpec] = pwelch(envelopeSignal,[],[],[],Fs,'centered','power'); figure; plot(freq,envelopeSpec); title('Envelope Spectrum Analysis Result'); xlabel('Frequency (Hz)'); ylabel('Magnitude'); grid on; ``` 这段脚本实现了对振动信号的包络谱分析流程,有助于发现特定频率范围内的异常现象。 --- #### 变分模态分解(VMD) 当面对含有多个瞬态事件的非平稳信号时,变分模态分解提供了一种有效解决方案。这种方法试图找到一组最优中心频率以及相应振幅函数使得残差最小化[^4]。下面是部分伪代码表示形式: ```matlab function [u_hat, u, omega] = vmd(signal, alpha, tau, K, DC, init, tol) ... end [u_modeled, ~, central_frequencies] = vmd(data_segment, ...); % Decompose into modes ``` 这里省略了一些细节参数设置,但可以看出 VMD 能够很好地适应实际工程需求。 --- ### 总结 以上介绍了四种主流的振动信号特征提取方法:基于 Welch 的频域分析、奇异值分解、包络谱分析以及变分模态分解。每种方法都有各自适用场景和技术优势,可根据具体应用场景灵活选用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值