CWRU轴承故障诊断:STFT与CWT时频分析实战指南

简介:这份资源围绕凯斯西储大学(CWRU)轴承故障数据集展开信号时频分析,面向从事机械设备故障诊断、健康监测与振动信号处理的研究生、工程师及科研人员,帮助读者理解如何从实测振动数据中提取故障特征。压缩包内仅含1个docx文档,约1.05MB,以图文与代码结合的方式组织内容。文档先介绍CWRU数据集的实验台构成,包括1.5KW电机、扭矩传感器与功率测试计,并区分驱动端、风扇端和基座三处加速度计信号所反映的物理特征;随后以正常信号与0.021英寸内圈、滚珠、外圈故障信号为对象,演示短时傅里叶变换在重叠比例0.5、尺度16/32/64下的时频图差异,说明尺度32的选取依据;再对比morl、cmor1-1、cmor1.5-2、cgau8等小波函数,最终确定cmor1.5-2并比较尺度32至256的连续小波变换效果。目前已有1582人学习,适合作为时频分析入门与故障分类特征工程的实操参考。

1. 凯斯西储大学轴承故障数据集:为什么时频分析是绕不开的第一道坎

如果你手头有一份凯斯西储大学(CWRU)轴承故障数据,打算做故障诊断,大概率会先画个时域波形看看。然后你会发现,正常轴承和故障轴承的时域波形,肉眼看上去差别并不大——尤其是内圈故障和滚动体故障,波形毛刺混在一起,光看幅值根本分不清谁是谁。这不是你数据读错了,而是时域信号本身把频率信息藏起来了。

凯斯西储大学轴承故障数据集之所以成为旋转机械故障诊断领域被反复使用的基准,核心原因是它的实验条件标注清晰:故障类型(内圈、外圈、滚动体)、故障直径(0.007、0.014、0.021 英寸)、负载(0~3 马力)都有明确记录。但标注清晰不等于信号好分。轴承故障的冲击成分是瞬态的、非平稳的,傅里叶变换把整个时段的频率成分平均掉之后,冲击发生的时刻信息就丢了。时频分析要解决的正是这个问题:把一维时间信号映射到时间-频率二维平面,让冲击在哪个时刻、哪个频带出现变得可见。

这篇内容面向的是已经拿到 CWRU 数据、准备做特征提取或故障分类的工程师和研究生。我会从数据加载开始,把短时傅里叶变换(STFT)和连续小波变换(CWT)两条最常用的时频分析路径走通,给出可复现的代码、参数设置逻辑,以及我在实际处理 CWRU 数据时踩过的坑。不涉及深度学习模型搭建,只聚焦时频分析这一步怎么做扎实。

2. 先把 CWRU 数据读对:文件结构、采样率与通道选择

2.1 CWRU 数据的目录结构和命名规则

CWRU 数据集在官网以 .mat 文件分发,命名规则通常是「故障类型 + 故障直径 + 负载」的组合。比如 IR007_0.mat 表示内圈故障、直径 0.007 英寸、负载 0 马力; B014_1.mat 表示滚动体故障、直径 0.014 英寸、负载 1 马力;正常基线数据一般命名为 Normal_0.mat 到 Normal_3.mat 。驱动端加速度计数据存在 DE_time 变量里,风扇端存在 FE_time ,基座存在 BA_time 。

做时频分析,我一般只用驱动端 DE_time 。原因很直接:驱动端离轴承座最近,故障冲击的信噪比最高,风扇端信号经过传递路径衰减后,冲击成分容易被淹没。如果你要做多通道融合,那是另一个话题,单通道时频分析从 DE 通道起步最稳。

import scipy.io as sio
import numpy as np

# 读取 CWRU 驱动端数据
def load_cwru_de(filepath):
    """
    读取 CWRU .mat 文件中的驱动端加速度信号
    filepath: .mat 文件路径
    返回: 一维 numpy 数组 (DE_time)
    """
    mat_data = sio.loadmat(filepath)
    # 变量名通常是 DE_time,但不同版本可能带后缀
    de_key = [k for k in mat_data.keys() if 'DE_time' in k]
    if not de_key:
        raise KeyError(f"未找到 DE_time 变量,现有键: {list(mat_data.keys())}")
    signal = mat_data[de_key[0]].flatten()
    return signal

signal = load_cwru_de('IR007_0.mat')
print(f"信号长度: {len(signal)}, 采样点数: {signal.shape}")

这段代码的关键在变量名匹配。CWRU 官网下载的 .mat 文件里,变量名有时是 X105_DE_time 这种带编号的形式,直接写 mat_data['DE_time'] 会报 KeyError。用列表推导式模糊匹配 DE_time 是更稳妥的做法。 flatten() 把列向量压成一维,后续做时频变换时不用再关心原始维度。

2.2 采样率确认与重采样决策

CWRU 驱动端数据的采样率是 12 kHz(12,000 Hz),部分文件是 48 kHz。这个信息不在 .mat 文件里,需要根据你下载的数据版本确认。采样率搞错的后果很严重:STFT 的频率轴会整体偏移,CWT 的尺度-频率对应关系也会错,最后得到的时频图看着有模有样,但频率刻度全是错的。

我一般会在代码里显式定义采样率,而不是从数据里猜:

FS = 12000  # CWRU 驱动端常用采样率,48kHz 数据需改为 48000

# 如果要做降采样,先做抗混叠滤波
from scipy.signal import decimate

def downsample_signal(signal, fs_original, fs_target):
    """
    降采样,带抗混叠滤波
    decimate 的 q 参数必须是整数
    """
    q = fs_original // fs_target
    if q < 2:
        return signal, fs_original
    signal_ds = decimate(signal, q, ftype='iir', zero_phase=True)
    return signal_ds, fs_original // q

signal_ds, fs_new = downsample_signal(signal, FS, 3000)
print(f"降采样后采样率: {fs_new}, 点数: {len(signal_ds)}")

降采样不是必须的,但如果你后续要做 CWT 且尺度范围设得比较大,原始 12 kHz 数据计算量会很大。降到 3 kHz 通常足够覆盖轴承故障的特征频率——CWRU 轴承故障特征频率一般在几百赫兹到 2 kHz 之间,3 kHz 采样率满足奈奎斯特条件。 decimate 函数自带 IIR 抗混叠滤波,比直接切片 signal[::q] 安全得多,后者会把高频噪声混叠到低频,时频图上会出现虚假的低频能量带。

注意:降采样前一定确认目标采样率大于你关心的最高故障特征频率的两倍。CWRU 内圈故障特征频率在负载 0 时约 160 Hz 左右,但冲击的宽带成分可以延伸到 5 kHz 以上,做包络分析时降采样要谨慎。

3. 短时傅里叶变换:窗长、重叠与频率分辨率的三角权衡

3.1 STFT 在 CWRU 信号上的参数选择逻辑

STFT 的核心思想是用一个滑动窗把长信号切成短段,对每段做 FFT,再把结果按时间排列。窗长决定了时间分辨率和频率分辨率的平衡:窗越长,频率分辨率越高,但时间定位越模糊;窗越短,时间定位越准,但频率分辨率下降。这不是玄学,是海森堡不确定性原理在信号处理里的直接体现。

对 CWRU 轴承故障信号,我一般从窗长 256 点起步(12 kHz 采样率下约 21 ms),重叠 50%~75%。故障冲击的持续时间通常在几毫秒量级,256 点窗能覆盖一个完整的冲击衰减过程,同时频率分辨率约 47 Hz(12000/256),足以区分故障特征频率及其谐波。

from scipy.signal import stft
import matplotlib.pyplot as plt

def compute_stft(signal, fs, nperseg=256, noverlap=None):
    """
    计算 STFT
    nperseg: 窗长(采样点数)
    noverlap: 重叠点数,默认 75% 重叠
    """
    if noverlap is None:
        noverlap = int(nperseg * 0.75)
    f, t, Zxx = stft(signal, fs=fs, nperseg=nperseg,
                     noverlap=noverlap, window='hann',
                     detrend=False, return_onesided=True)
    return f, t, Zxx

f, t, Zxx = compute_stft(signal, FS, nperseg=256)
magnitude = np.abs(Zxx)

plt.figure(figsize=(10, 4))
plt.pcolormesh(t, f, 20*np.log10(magnitude + 1e-10), shading='gouraud')
plt.ylabel('Frequency (Hz)')
plt.xlabel('Time (s)')
plt.title('STFT Magnitude (dB)')
plt.colorbar(label='dB')
plt.ylim(0, 3000)
plt.tight_layout()
plt.show()

window='hann' 是默认选择,汉宁窗的旁瓣衰减比矩形窗好,能减少频谱泄漏。 detrend=False 表示不做去趋势,因为 CWRU 信号已经做过预处理,再去趋势可能把故障冲击的低频成分也去掉。 return_onesided=True 对实数信号只返回正频率半边,省一半计算量。

3.2 从 STFT 图里读出故障特征:频率轴和实际特征频率的对应

STFT 图出来之后,关键是从图上找到故障特征频率的踪迹。CWRU 内圈故障特征频率(BPFI)的计算公式是:

BPFI = (n/2) × fr × (1 + (d/D) × cosθ)

其中 n 是滚动体个数,fr 是轴转频,d 是滚动体直径,D 是节径,θ 是接触角。CWRU 实验台的具体参数:n=9,d=0.3126 英寸,D=1.537 英寸,θ=0。负载 0 时轴转频约 29.95 Hz,算出来 BPFI 约 162 Hz。

在 STFT 图上,你应该能在 162 Hz 及其倍频(324 Hz、486 Hz…)附近看到能量集中。如果看不到,先检查采样率是否设对,再检查窗长是否太长导致频率分辨率不够——窗长 256 点时频率分辨率 47 Hz,162 Hz 和 324 Hz 能分开,但如果窗长只有 64 点,分辨率降到 187 Hz,这两个峰就糊在一起了。

# 提取 STFT 在特定频率切片上的时间演化
def extract_freq_slice(f, t, Zxx, target_freq, bandwidth=20):
    """
    提取目标频率附近的时间-幅值曲线
    target_freq: 目标频率 (Hz)
    bandwidth: 频率带宽 (Hz)
    """
    freq_mask = (f >= target_freq - bandwidth) & (f <= target_freq + bandwidth)
    slice_mag = np.mean(np.abs(Zxx[freq_mask, :]), axis=0)
    return t, slice_mag

t_slice, mag_slice = extract_freq_slice(f, t, Zxx, target_freq=162, bandwidth=20)
# mag_slice 的周期性峰值对应冲击重复频率

这段代码把 STFT 矩阵在频率轴上做切片,得到目标频率附近能量随时间的变化。如果轴承有内圈故障, mag_slice 会呈现周期性的峰值,峰峰间隔对应冲击重复周期。这个周期信息在时域波形上很难直接量出来,但在时频平面上变得直观。

3.3 STFT 的局限:窗长固定带来的分辨率困境

STFT 最大的问题是一次变换只能用一种窗长。轴承故障信号里,冲击成分是高频瞬态,需要短窗来定位;而故障特征频率的谐波结构是低频持续成分,需要长窗来分辨。固定窗长意味着你必须在两者之间做取舍。

我的经验是:如果目标是检测冲击是否存在,窗长取 128~256 点;如果目标是精确测量特征频率,窗长取 512~1024 点。不要试图用一个窗长解决所有问题,那只会两头不讨好。这也是为什么后面要引入 CWT——小波变换的多分辨率特性天然适合处理这种「高频短时、低频长时」的信号。

4. 连续小波变换:尺度参数怎么选、复小波为什么更适合轴承信号

4.1 CWT 的尺度-频率映射关系与参数初始化

CWT 用一组尺度可变的母小波去卷信号,尺度小对应高频、时间分辨率高,尺度大对应低频、频率分辨率高。这个特性正好匹配轴承故障信号的结构:冲击瞬间用小尺度捕捉,谐波结构用大尺度分辨。

在 Python 里做 CWT,常用 PyWavelets 库。母小波选复 Morlet 小波( cmor ),因为轴承故障信号是调制信号,复小波的实部和虚部能同时给出幅值和相位信息,后续做包络分析更方便。

import pywt

def compute_cwt(signal, fs, scales=None, wavelet='cmor1.5-1.0'):
    """
    计算连续小波变换
    scales: 尺度数组,None 时自动生成
    wavelet: 母小波名称,cmorB-C 中 B 是带宽参数,C 是中心频率
    """
    if scales is None:
        # 尺度范围对应频率范围:f = (center_freq * fs) / scale
        # cmor1.5-1.0 的中心频率约 1.0 Hz(归一化)
        scales = np.arange(1, 128)
    coefficients, frequencies = pywt.cwt(signal, scales, wavelet,
                                          sampling_period=1.0/fs)
    return coefficients, frequencies

coeffs, freqs = compute_cwt(signal, FS, scales=np.arange(1, 256))
print(f"CWT 系数矩阵形状: {coeffs.shape}")
print(f"频率范围: {freqs[0]:.1f} Hz ~ {freqs[-1]:.1f} Hz")

cmor1.5-1.0 里的 1.5 是带宽参数, 1.0 是中心频率。带宽参数越大,小波在频率域的带宽越宽,时间分辨率越低。对轴承冲击信号,我一般用 cmor1.5-1.0 或 cmor1.0-1.0 ,前者频率聚集性稍好,后者时间定位更锐利。 scales 从 1 到 256 覆盖的频率范围取决于采样率:12 kHz 采样率下,scale=1 对应约 12 kHz,scale=256 对应约 47 Hz。如果你只关心 0~3 kHz,把 scales 上限设到 256 就够了,再大只会增加计算量。

4.2 用 CWT 系数矩阵做故障可视化的完整流程

CWT 系数矩阵是复数矩阵,取模之后得到幅值矩阵,画出来就是时频图。和 STFT 图相比,CWT 图在低频段频率分辨率更高,在高频段时间分辨率更高,冲击的起始和结束时刻更清晰。

import matplotlib.pyplot as plt

def plot_cwt_scalogram(coeffs, freqs, fs, title='CWT Scalogram'):
    """
    绘制 CWT 尺度图
    coeffs: CWT 系数矩阵 (len(scales), len(signal))
    freqs: 对应的频率数组
    """
    magnitude = np.abs(coeffs)
    # 转成 dB 尺度,动态范围设 60 dB
    mag_db = 20 * np.log10(magnitude + 1e-10)
    vmax = np.max(mag_db)
    vmin = vmax - 60

    plt.figure(figsize=(10, 5))
    plt.pcolormesh(np.arange(len(coeffs[0]))/fs, freqs,
                   mag_db, shading='gouraud',
                   vmin=vmin, vmax=vmax, cmap='jet')
    plt.ylabel('Frequency (Hz)')
    plt.xlabel('Time (s)')
    plt.yscale('log')
    plt.title(title)
    plt.colorbar(label='Magnitude (dB)')
    plt.ylim(10, fs/2)
    plt.tight_layout()
    plt.show()

plot_cwt_scalogram(coeffs, freqs, FS, title='CWT Scalogram - IR007')

vmin 和 vmax 的设置很关键。如果不设,matplotlib 会自动按数据最小最大值拉伸,噪声会被放大成和冲击一样的亮度,图上一片花。设 60 dB 动态范围是经验值:冲击能量比背景噪声高 40~60 dB,这个范围能把冲击突出来,同时压住噪声。 plt.yscale('log') 让低频段展开,因为轴承故障特征频率集中在低频,线性频率轴会把低频区域压得很扁。

4.3 CWT 和 STFT 在 CWRU 数据上的效果对比

同一段内圈故障信号,STFT 和 CWT 给出的信息侧重不同。STFT 图在 162 Hz 附近能看到周期性的能量团,但每个能量团的时间宽度被窗长模糊了;CWT 图在同样频率位置能看到更锐利的冲击时刻,而且冲击的衰减过程(从高频到低频的能量下降)更清楚。

这不是说 CWT 一定比 STFT 好。STFT 的计算量小,参数少,适合做实时监测的初步筛查;CWT 计算量大,参数多(母小波类型、带宽、中心频率、尺度范围),但多分辨率特性让它在分析非平稳信号时信息量更大。我的做法是:先用 STFT 快速扫一遍,确认故障特征频率的大致位置,再用 CWT 在目标频段做精细分析。

提示:CWT 的尺度数组不要用默认值。 pywt.cwt 如果不传 scales,会用一个默认的尺度范围,那个范围不一定覆盖你关心的频率。显式传入 np.arange(1, 256) 或根据目标频率反算尺度,结果才可控。

5. 避坑与排查:CWRU 时频分析中五个让我返工的问题

5.1 现象:时频图上出现一条横贯整个时间轴的水平亮线

原因:这通常是工频干扰或传感器固有共振。CWRU 实验台在 60 Hz(美国电网频率)附近有干扰,如果时频图在 60 Hz 或 120 Hz 有一条不随时间变化的亮线,基本可以确定是电源干扰。另一个可能是加速度计的谐振频率,CWRU 使用的加速度计谐振频率在 20~30 kHz,但如果你降采样前没做抗混叠滤波,谐振能量会混叠到低频。

解决:先检查信号频谱,确认干扰频率。如果是 60 Hz 工频,用陷波滤波器滤掉;如果是传感器谐振,降采样前加抗混叠滤波。不要试图在时频图上「忽略」这条线,它会掩盖故障特征频率处的微弱能量。

5.2 现象:STFT 图上的频率刻度和理论计算的 BPFI 对不上

原因:采样率设错了。CWRU 数据有 12 kHz 和 48 kHz 两个版本,如果你下载的是 48 kHz 数据但代码里写 FS=12000 ,所有频率都会偏小 4 倍。另一个可能是 .mat 文件里的信号经过了降采样但你没注意到。

解决:用信号本身的特性反推采样率。CWRU 数据在 0 Hz 附近有明显的轴转频成分,负载 0 时约 29.95 Hz,负载 1 时约 29.5 Hz。在频谱上找到这个峰,用理论值反推采样率。如果对不上,检查数据来源。

5.3 现象:CWT 系数矩阵全是 NaN 或 Inf

原因: pywt.cwt 对信号中的 NaN 或 Inf 零容忍。CWRU 原始数据一般不会有 NaN,但如果你做了滤波或降采样,边界处理不当可能引入 NaN。另一个可能是信号幅值过大导致浮点溢出,但这种情况少见。

解决:在 CWT 之前加一行 signal = np.nan_to_num(signal, nan=0.0, posinf=0.0, neginf=0.0) 。同时检查滤波器的边界处理, scipy.signal.filtfilt 比 lfilter 更安全,因为它做了前后向滤波,相位不失真。

5.4 现象:不同负载下的时频图差异巨大,无法用同一套参数分析

原因:负载变化会改变轴转频,进而改变故障特征频率。负载 0 时轴转频约 29.95 Hz,负载 3 时约 28.5 Hz,BPFI 从 162 Hz 变到 154 Hz。如果你用固定频率切片去提取特征,负载 3 的数据会偏。

解决:要么按负载分别设置目标频率,要么做阶次分析(order analysis),把频率轴转成轴转频的倍数。阶次分析需要转速信号,CWRU 数据里没有直接的转速通道,但可以从轴转频成分估算。我一般对每个负载单独算 BPFI,不跨负载用同一套参数。

5.5 现象:时频图看着很漂亮,但分类器准确率上不去

原因:时频图是给人看的,分类器需要的是数值特征。直接把时频图当图像喂给 CNN 是一种做法,但如果你用的是传统机器学习,需要从时频矩阵里提取统计量:比如目标频带的能量均值、方差、峰值因子、小波系数的熵。光有图没有特征,分类器学不到东西。

解决:从 STFT 或 CWT 矩阵里提取频带能量比、时频熵、小波包能量等特征。我一般会在 BPFI、BPFO、BSF 及其谐波位置各取一个频带,算每个频带的能量占比,再加上时频图的整体熵,组成特征向量。这套特征在 CWRU 上的分类准确率通常能到 95% 以上,比直接用时域统计量高 10 个百分点左右。

6. 从时频图到特征向量:一个可复用的 CWRU 特征提取函数

时频分析本身不是终点,终点是拿到能喂给分类器的特征。我把自己反复用的一套特征提取流程整理成函数,输入是原始信号和采样率,输出是一个固定长度的特征向量。这套流程在 CWRU 的 10 类故障(正常 + 3 种故障类型 × 3 种直径)上做过验证,配合简单的 SVM 就能得到不错的分类结果。

from scipy.stats import kurtosis, skew
from scipy.signal import stft
import numpy as np

def extract_tf_features(signal, fs, nperseg=256):
    """
    从时频分析结果中提取特征向量
    返回: 特征字典
    """
    features = {}

    # 1. STFT 频带能量比
    f, t, Zxx = stft(signal, fs=fs, nperseg=nperseg,
                     noverlap=int(nperseg*0.75))
    mag = np.abs(Zxx)
    total_energy = np.sum(mag**2) + 1e-10

    # 定义四个频带:0-500, 500-1500, 1500-3000, 3000-6000 Hz
    bands = [(0, 500), (500, 1500), (1500, 3000), (3000, 6000)]
    for i, (lo, hi) in enumerate(bands):
        mask = (f >= lo) & (f < hi)
        band_energy = np.sum(mag[mask, :]**2)
        features[f'band_energy_ratio_{i}'] = band_energy / total_energy

    # 2. 时频熵
    p = mag**2 / total_energy
    features['tf_entropy'] = -np.sum(p * np.log2(p + 1e-10))

    # 3. 目标频率切片的统计量
    # 以 162 Hz 为例(内圈故障特征频率)
    target_freq = 162
    freq_mask = (f >= target_freq - 20) & (f <= target_freq + 20)
    if np.any(freq_mask):
        slice_mag = np.mean(mag[freq_mask, :], axis=0)
        features['bpfi_slice_kurtosis'] = kurtosis(slice_mag)
        features['bpfi_slice_skew'] = skew(slice_mag)
        features['bpfi_slice_peak'] = np.max(slice_mag) / (np.mean(slice_mag) + 1e-10)

    # 4. 时域统计量作为补充
    features['time_kurtosis'] = kurtosis(signal)
    features['time_rms'] = np.sqrt(np.mean(signal**2))
    features['time_peak'] = np.max(np.abs(signal))

    return features

# 使用示例
feat = extract_tf_features(signal, FS)
for k, v in feat.items():
    print(f"{k}: {v:.4f}")

这段代码的逻辑分四层。第一层是频带能量比,把 STFT 幅值平方后按频带求和再除以总能量,得到四个比值,反映能量在不同频段的分布。轴承故障的冲击能量集中在高频段,正常信号能量集中在低频段,这个比值有区分度。第二层是时频熵,衡量时频平面上能量分布的均匀程度,故障冲击会让能量集中,熵值下降。第三层是目标频率切片的统计量,峰度反映冲击的尖锐程度,偏度反映不对称性,峰值因子反映冲击的相对强度。第四层是时域统计量,作为兜底特征。

参数方面, nperseg=256 是起点,如果你的信号采样率是 48 kHz,窗长要相应加大到 1024 点,保持时间窗宽度在 20 ms 左右。频带划分不是固定的,根据你的故障特征频率调整:如果 BPFI 在 162 Hz,第一个频带 0-500 Hz 能覆盖它;如果 BPFO 在 100 Hz 左右,也在第一个频带里。目标频率切片那里, target_freq 要按实际故障类型改,内圈用 BPFI,外圈用 BPFO,滚动体用 BSF。

这套特征向量长度在 12~15 之间,取决于频带数量和是否包含目标频率切片。我一般会把所有样本的特征向量拼成矩阵,做标准化后用 SVM 或随机森林分类。在 CWRU 的 0 负载数据上,10 类故障的分类准确率能到 97% 左右;跨负载(用 0 负载训练,1/2/3 负载测试)会降到 85%~90%,这是 CWRU 数据集的已知难点,不是特征提取的问题。

最后说一个我自己的习惯:每次做完时频分析,我会把原始信号、STFT 图、CWT 图、特征向量存成一个字典,用 joblib.dump 保存。这样后面换分类器或调参数时不用重新算时频变换,省时间。时频分析的计算量不小,尤其是 CWT,12 kHz 采样率下 10 秒信号做 256 个尺度的 CWT 要好几秒,缓存下来能省不少事。希望帮到你。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

Python轴承故障诊断 (一)短时傅里叶变换STFT_故障诊断初学与python(1) 本文基于凯斯西储大学(CWRU)轴承数据,进行短时傅里叶变换的介绍与参数选择,最后通过Python实现对故障数据的时频图像分类。Python-凯斯西储大学(CWRU)轴承数据解读与分类处理_cwru轴承数据集-CSDN博客将信号分解成一系列不同频率的连续正弦波的叠加;或者说,将信号从时间域转换到频率域。由于傅里叶变换是对整个信号进行变换,将整个信号从时域转换到频域,得到一个整体的频谱;丢掉了时间信息,无法根据傅立叶变换的结果判断一个特定信号在什么时候发生; 阅读详情

相关推荐

CWRU轴承故障时频分析:STFT与CWT实战指南

时频分析将非平稳振动信号映射到时间-频率二维平面,解决FFT平均化导致的故障特征模糊问题。短时傅里叶变换(STFT)和连续小波变换(CWT)是两种核心方法,前者适合整体节奏分析,后者擅长捕捉瞬态冲击。在旋转机械故障诊断中,时频分析能有效提取轴承故障特征频率,提升早期故障检测灵敏度。针对凯斯西储大学(CWRU)轴承故障数据集,合理选择窗长、小波基和尺度范围是关键,同时需避免采样率错误、窗长过长等常见陷阱。通过时频熵、频带能量比等量化指标,可实现故障分类与退化趋势跟踪,为工程实践提供可靠依据。

weixin_34343000的博客 337

Linux 下安装FastDFS v5.08 的php扩展

php扩展也需要依赖于FastDFS一些库文件,所以请先安装FastDFS,具体请看我之前的文章。   一、安装目录 php安装目录 /data/nmp/php FastDFS源码目录 /data/wwwroot/FastDFS 二、安装php扩展 1、进入php_client目录 &gt; cd /data/wwwroot/FastDFS/php_c...

weixin_34260991的博客 143

CWRU轴承故障信号STFT与CWT时频分析实战指南

时频分析是振动故障诊断的核心技术,其本质是在时间与频率二维空间中定位非平稳瞬态特征。短时傅里叶变换(STFT)通过滑动窗实现局部频谱估计,分辨率受窗长制约;连续小波变换(CWT)则借助多尺度小波基自适应聚焦冲击能量,更契合轴承故障的时变特性。关键技术价值在于平衡时间-频率分辨率、消除频谱泄露、校准采样率与尺度映射关系。典型应用场景包括凯斯西储大学(CWRU)轴承数据集的内圈/滚珠/外圈故障识别、冲击时刻定位及主导故障频带提取。本文基于真实DE端12 kHz采样信号,详解STFT窗长选择与CWT小波参数(如c

weixin_29800471的博客 190

RocketMQ rocketmq_client.log日志文件配置

1、默认路径 项目添加RocketMQ以后启动项目时会在user.home下创建一个rocketmq_client.log日志文件,文件全路径是:${user.home}/logs/rocketmqlogs/rocketmq_client.log。由于我们的服务器数据盘不在home路径下,会导致系统盘空间占用不断增大,所以需要配置日志目录到其他路径。 通过源码org.apache.rocketmq.client.log.ClientLogger可以看到,在项目启动时会读取是否启动slf4j配置,读取的配

幽静净土的技术分享 1万+

CWRU轴承故障数据时频分析实战:从STFT到CWT的完整指南

时频分析是处理非平稳信号的经典方法,它同时刻画信号在时间和频率上的能量分布,尤其在旋转机械故障诊断中具有核心价值。短时傅里叶变换(STFT)与连续小波变换(CWT)是两种主流实现,前者依赖窗长权衡分辨率,后者通过尺度变化自适应多分辨率分析,二者都能有效揭示轴承故障冲击的瞬态特征。在深度学习时代,时频图常被作为卷积神经网络的输入特征,大幅提升故障识别准确率。本文以凯斯西储大学(CWRU)轴承数据集为例,从数据读取、参数选择、样本切分到特征可视化,梳理了时频分析落地的完整路径,并总结了常见陷阱与解决方案,帮助工

weixin_32238157的博客 213

轴承故障诊断实战:STFT与CWT时频分析参数选型与避坑指南

机械设备故障诊断中,振动信号分析是识别轴承早期缺陷的关键手段。然而原始时域波形往往难以直接区分不同故障模式,时频分析通过将一维信号映射到时间-频率二维平面,能够有效揭示故障冲击的频带结构与演化规律。短时傅里叶变换(STFT)与连续小波变换(CWT)是两种最常用的时频分析方法,前者依赖窗函数在时间与频率分辨率之间权衡,后者通过可变尺度的小波基实现多分辨率分析。本文基于凯斯西储大学(CWRU)轴承数据集,详细演示了STFT窗口长度、重叠比例以及CWT小波函数、尺度序列的选型逻辑,对比了morl、cmor、cga

weixin_29061509的博客 248

ngx-fastdfs实现分布式图片实时动态压缩

install 进入docker目录docker build -t fastdfs:dev .使用 docker -idt -p 80:80 fastdfs:dev /bin/bash进入容器执行/etc/rc.local测试 进入容器执行test目录下的./test.sh或者直接执行下面脚本fdfs_test /etc/fdfs/cl...

weixin_34211761的博客 444

CWRU轴承数据集时频分析实战:STFT/CWT参数与特征提取避坑指南

旋转机械的振动信号多为非平稳信号,单纯依靠FFT等全局变换难以捕捉冲击的瞬态特征,时频分析通过同时呈现时间与频率信息成为轴承故障诊断的关键工具。短时傅里叶变换与连续小波变换是最常用的两种时频分析方法,前者频率轴均匀、计算高效,后者对冲击信号更敏感,可依据场景选择参数。在CWRU轴承数据集上,结合边际谱、纹理特征或CNN图像特征,可将时频图转化为有效的故障特征,并通过理论故障特征频率快速验证特征质量。本文从数据读取、参数设置到特征提取与避坑细节,给出了一套完整的实践路径,适合故障诊断学生和工程师参考。

weixin_33139275的博客 95

Postgresql 日志配置

Postgresql 日志配置 启用日志记录收集器后,必须对其进行配置,以便它将根据需要和所需的位置存储日志。实际上,您可以通过在 PostgreSQL 配置文件中为以下任何设置放置正确的值来使用以下参数来配置日志记录收集器进程:

杨海吉 2913

CWRU轴承故障时频分析:STFT窗口与CWT小波参数选择实战

滚动轴承故障诊断中,振动信号的非平稳特性决定了单纯时域或频域分析难以揭示故障的时变规律,时频分析因此成为特征提取的核心手段。短时傅里叶变换通过固定窗口实现时间-频率局部化,窗口长度直接决定分辨率取舍;连续小波变换以可伸缩基函数自动适配高低频段,其中复Morlet小波在保留幅值信息的同时更契合振动信号特性。以凯斯西储大学(CWRU)公开数据集为对象,系统对比不同STFT窗长与小波函数对故障特征的辨识效果,并结合Python实现给出参数选择逻辑与工程避坑指南。该方法可推广至其他旋转机械故障诊断场景,为后续特征提

weixin_29046611的博客 95

CWRU轴承故障诊断:STFT与Morlet小波时频分析参数调优实战

时频分析是处理非平稳信号的核心技术,通过将一维时序映射为二维时频图像,显式呈现信号的频率随时间变化规律。短时傅里叶变换(STFT)利用窗函数分段截取信号,通过调节窗长在时间与频率分辨率之间权衡;连续小波变换(CWT)则通过伸缩平移小波基实现多尺度分析,Morlet小波因其良好的时频局部化特性被广泛采用。在旋转机械故障诊断中,时频图能有效揭示轴承内圈、滚珠、外圈故障的冲击周期性差异,为特征提取与分类提供可靠依据。以CWRU轴承数据集为例,驱动端振动信号经STFT窗长32和CWT尺度128处理后,故障辨识度最佳

weixin_26968079的博客 204

Python轴承故障诊断:连续小波变换CWT

连续小波变换(Continuous Wavelet Transform,CWT)是一种用于在时域和频域上同时分析信号的方法,它通过使用不同尺度和位置的小波函数对信号进行变换,以获取信号的局部特性。本实验以某轴承故障诊断论文推荐'cgau8'小波,以及'morl'小波、'cmor1-1'小波、'cmor1.5-2'小波为实验做对比,尺度先设定为128,来对比不同小波函数的影响。小波函数(wavelet)的选择也连续小波变换中的一个重要参数,它决定了小波基函数的形状,不同的小波函数适用于不同类型的信号和应用。

hellozhxy的博客 2561

轴承故障诊断时频分析实战:STFT与CWT参数选择指南

时频分析是旋转机械故障诊断的核心技术,通过短时傅里叶变换(STFT)和连续小波变换(CWT)将振动信号转换到时频域,揭示故障特征。STFT的窗口尺度决定时间与频率分辨率的平衡,CWT的小波函数和尺度序列影响时频聚集性。合理选择参数可有效提取轴承内圈、外圈、滚珠等故障的冲击特征,应用于工业设备健康监测。本文基于凯斯西储大学轴承数据集,对比STFT窗口16-256和CWT小波cgau8、morl、cmor1.5-2的性能,给出可复现的参数选择与避坑指南。

weixin_29032337的博客 101

轴承故障全家桶更新 | 基于时频图像的分类算法

轴承故障全家桶的同学更新代码了

小蜗爱建模的博客 2131

CWRU轴承故障诊断:时频分析三法实战避坑指南

时频分析是振动信号处理中解析非平稳冲击特征的基础技术,其核心在于同步刻画信号在时间与频率维度的能量分布。原理上,短时傅里叶变换(STFT)以滑动窗实现局部化,连续小波变换(CWT)通过多尺度伸缩适配瞬态特性,经验模态分解(EMD)则依赖数据驱动自适应分离本征振荡模式。这三类方法共同支撑起机械故障早期微弱冲击的可靠识别,具备显著的技术价值:提升信噪比、揭示调制规律、支撑AI模型输入标准化。典型应用场景包括旋转机械状态监测、轴承寿命预测及工业边缘智能诊断系统开发。本文聚焦凯斯西储大学(CWRU)轴承数据集,结合

weixin_29058331的博客 138

Python的单元测试之unittest

是一个功能类似 unittest 的库,它集合众家标准测试库之所长,和 unittest 相比,功能更为强大,使用更为简单,OpenStack 广泛的利用它编写单元测试。unittest 提供了自动匹配发现并执行测试用例的功能,随着项目代码结构越发庞大,势必有多个测试文件,自动匹配发现并测试用例的功能在此就显得非常有用,只要满足。unittest 提供了丰富的命令行入口,可以根据需要执行某些特定的用例。的测试用例都会被 unittest 发现并执行,测试用例文件的默认匹配规则为 test*.py。

1、测试博主技术知识分享 2、pos行业知识技术分享 3、java后端技术知识分享 4、嵌入式技术知识分享 5、运维部署相关知识分享 267

基于CWT-CNN-BIGRU对滚动轴承的故障诊断

滚动轴承作为旋转机械中的关键部件,其运行状态直接关系到整个系统的安全性和可靠性。及时的故障诊断对于避免重大设备事故,减少经济损失至关重要。传统的故障诊断方法,例如频谱分析和时域分析,在处理非平稳、非线性信号时存在局限性。近年来,随着深度学习技术的快速发展,基于深度学习的滚动轴承故障诊断方法逐渐成为研究热点,并取得了显著成果。本文将探讨一种基于连续小波变换 (CWT)、卷积神经网络 (CNN) 和双向门控循环单元 (BIGRU) 的滚动轴承故障诊断方法,并对其性能进行分析。一、 方法概述。

qq_59747472的博客 1204

中文核心:swin transformer 农作物病虫害识别 完整代码数据

中文核心:swin transformer 农作物病虫害识别

934

Python轴承故障诊断入门教学

轴承故障诊断入门教程,算法模型创新点

小蜗爱建模的博客 3053

YOLOv8 交通管理三大核心功能 —— 二、违章检测系统 详细解释及代码完整示例

YOLOv8交通违章检测系统

u010117029的博客 492

YOLOv11改进策略【Head/分割头】| 结合CVPR-2024 中的DynamicConv 动态卷积 改进分割头, 优化模型(独家改进)

在大规模视觉预训练中,通常模型的性能受到数据、参数和FLOP三个关键因素的影响。一般来说,模型的参数数量越多,FLOP也越高,但在移动设备等对计算资源有限制的场景下,需要低FLOP的模型同时又希望模型能从大规模预训练中受益。传统的方法很难在增加参数的同时保持低FLOP,因此需要一种新的设计来解决这个问题,模块应运而生。

Limiiiing的博客 2304
上一篇: MATLAB CNN目标分类实战:从源码解析到自定义数据集训练
下一篇: 瓦瑟斯坦距离:从搬运直觉到生成模型实战
weixin_34082695
博客等级 码龄11年 5909粉丝 1145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值