振动信号频域图绘制函数(python版)

在实际应用中,不免会看时域图和频域图,封装了绘制时域图和频域图程序,方便调用

## 导入包
from matplotlib import pyplot as plt
from matplotlib import rcParams
import numpy as np
import pandas as pd

config = {
    "font.family": 'serif', # 衬线字体
    "font.size": 14, # 相当于小四大小
    "font.serif": ['SimSun'], # 宋体
    "mathtext.fontset": 'stix', # matplotlib渲染数学字体时使用的字体,和Times New Roman差别不大
    'axes.unicode_minus': False # 处理负号,即-号
}
rcParams.update(config)
##========绘制时域信号图========##
def plt_time_domain(arr, fs=1600, ylabel='Amp(mg)', title='原始数据时域图', img_save_path=None, x_vline=None, y_hline=None):
    """
    :fun: 绘制时域图模板
    :param arr: 输入一维数组数据
    :param fs: 采样频率
    :param ylabel: y轴标签
    :param title: 图标题
    :return: None
    """
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
    plt.rcParams['axes.unicode_minus'] = False  # 显示负号
    font = {'family': 'Times New Roman', 'size': '20', 'color': '0.5', 'weight': 'bold'}
    
    plt.figure(figsize=(12,4))
    length = len(arr)
    t = np.linspace(0, length/fs, length)
    plt.plot(t, arr, c='g')
    plt.xlabel('t(s)')
    plt.ylabel(ylabel)
    plt.title(title)
    if x_vline:
        plt.vlines(x=x_vline, ymin=np.min(arr), ymax=np.max(arr), linestyle='--', colors='r')
    if y_hline:
        plt.hlines(y=0.2, xmin=np.min(t), xmax=np.max(t), linestyle=':', colors='y')
    #===保存图片====#
    if img_save_path:
        plt.savefig(img_save_path, dpi=500, bbox_inches = 'tight')
    plt.show()

##========绘制频域信号图========##
def plt_fft_img(arr, fs, ylabel='Amp(mg)', title='频域图', img_save_path=None, vline=None, hline=None, xlim=None):
    """
    :fun: 绘制频域图模板
    :param arr: 输入一维时域数组数据
    :param fs: 采样频率
    :param ylabel: y轴标签
    :param title: 图标题
    :return: None
    """
    # 计算频域幅值
    length = len(arr)
    t = np.linspace(0, length/fs, length)
    fft_result = np.fft.fft(arr)
    fft_freq= np.fft.fftfreq(len(arr), d=t[1]-t[0])  # FFT频率
    fft_amp= 2*np.abs(fft_result)/len(t)                     # FFT幅值

    # 绘制频域图
    plt.figure(figsize=(12,4))
    plt.title(title)
    plt.plot(fft_freq[0: int(len(t)/2)], fft_amp[0: int(len(t)/2)], label='Frequency Spectrum', color='b')
    plt.xlabel('频率 (Hz)')
    plt.ylabel('幅值')
    plt.legend()
    if vline:
        plt.vlines(x=vline, ymin=np.min(fft_amp), ymax=np.max(fft_amp), linestyle='--', colors='r')
    if hline:
        plt.hlines(y=hline, xmin=np.min(fft_freq), xmax=np.max(fft_freq), linestyle=':', colors='y')
    #===保存图片====#
    if img_save_path:
        plt.savefig(img_save_path, dpi=500, bbox_inches = 'tight')
    if xlim: # 图片横坐标是否设置xlim
        plt.xlim(0, xlim)  
    plt.tight_layout()
    plt.show()
    
    return fft_freq, fft_amp

示例代码

fs = 100  # 采样频率
f = 20    # 模拟正弦信号频率
time = 5  # 采样时长
t = np.linspace(0, time, time*fs)
data = 1*np.sin(2*np.pi*f*t) + np.random.normal(0, 1, time*fs)
plt_time_domain(data, fs)
plt_fft_img(data, fs)

在这里插入图片描述

在这里插入图片描述

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python振动信号处理中有着广泛的应用。振动信号处理是指对于振动信号进行采集、预处理、分析和诊断的过程。 首先,Python提供了许多用于数据采集和预处理的库和工具。例如,NumPy库提供了高效的数组操作和数值计算功能,可以用于对振动信号进行处理和分析。Pandas库则提供了用于数据的读取、清洗和转换的工具,可以方便地处理振动信号数据。此外,Python还可以通过串口通信或者传感器接口与硬件设备进行通信,实时采集振动信号。 其次,Python拥有丰富的信号分析和处理库。例如,SciPy库提供了多种信号处理函数和工具,可以进行频域分析、时域分析、傅里叶变换等操作。另外,Python还有诸如matplotlib和seaborn等可视化库,可以用于绘制振动信号的时域频域、波形等以及进行数据可视化。 此外,Python还有一些特定领域的库和工具,用于振动信号的特定应用。例如,scikit-learn库提供了机器学习算法,可以用于振动信号的故障诊断和预测。还有一些针对振动信号分析和诊断的专用库,如pyvib, scipy.signal, PyFFT等,可以进行频谱分析、滤波处理、特征提取等。 总结起来,Python振动信号处理中的应用非常广泛,可以用于数据采集和预处理、信号分析和处理、故障诊断和预测等方面。其丰富的库和工具以及易用性使得Python成为振动信号处理的常用工具之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故障诊断与python学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值