轴承数据频域信号的生成与效果测试

刚开始学习的时候,不确定很多处理方式的效果,自己试了很多,印象里频域数据是要比时域的更好一些的,现在回过头来再测试一下。

将时域信号变换到频域算是一个很成熟的方法,在数字信息处理领域是基操,使用快速傅里叶变换(FFT)可以方便的将一维时域信号变换到一维频域,建议大家还是简单熟悉一下它的原理。经过处理以后,进行可视化如下:

轴承数据频域信号的生成与效果测试_第1张图片

轴承数据频域信号的生成与效果测试_第2张图片

 从图中可以看出,频域的数据确实比时域的要直观一些,而且长度从2048变成了1024,这是由傅里叶变换的对称特性决定的,同时傅里叶变换也消除了时序数据的时间特性,不过在故障分类问题中,时间信息应该是没那么重要的,毕竟我只需要判断某个样本的类型,而不是时间相关的长短期的特征。

让我们按照上一篇文章的方法比较一下的效果

轴承数据频域信号的生成与效果测试_第3张图片

从结果看,准确率出现了反转,原来的CNN_1D模型反而轻松超越了WDCNN,后者反而表现很差,主要是因为WDCNN针对的是时域调的参数,换成了频域数据,尤其是输入大小变化以后效果受影响最大,如果稍微调一调参数的话,相信效果也不会差多少。这个实验至少说明频域的方法也是一个不错的思路。

在频域变换的时候还有一个容易忽略的细节就是样本截断处的跳变,相信大家也注意到了,这个肯定是不正常的,这也是FFT变换的特点。

轴承数据频域信号的生成与效果测试_第4张图片

 所以,我们还需要使用窗函数来抑制这种跳变,窗函数有很多,大概长这样。

轴承数据频域信号的生成与效果测试_第5张图片

 各种窗函数我基本都测试过,效果几乎没有区别,在傅里叶变换前把数据处理一下就行

def hamming_fft(data_np):
    data_np = data_np - np.mean(data_np)
    N = len(data_np)
    windows = signal.hamming(N)
    data_np = 2 * windows * data_np

    fft_data = np.fft.fft(data_np)
    len_data = len(fft_data)
    # (4)获取一半数据即可,然后计算幅值-纵坐标
    fft_data = fft_data[range(int(len_data / 2))]
    fft_data = np.abs(fft_data) / len_data * 2
    # (5)通过pandas索引,然后计算频率-横坐标
    fft_data = pd.Series(fft_data)

    y = list(fft_data.values)
    return y

处理以后再看一下图,跳变被压制了:

轴承数据频域信号的生成与效果测试_第6张图片

 最后再看看效果如何,再进行测试,最终的准确率有明显改善,可见加窗是非常必要的

轴承数据频域信号的生成与效果测试_第7张图片

你可能感兴趣的:(故障诊断,西储大学,python,pandas)