赞
踩
连续小波变换网上很多,不多说,上代码,此部分代码可以单次也可以批量将一维振动信号生成时频图像。
(1)如果是单次保存的话将img_TimeFreq函数中的total参数设置为1即可。
(2)如果是多次保存的话将img_TimeFreq函数中的total参数设置为多少就保存多少张图片。
img_TimeFreq函数具体参数代码注释中很详细,使用者只需要传递函数所需的参数并且修改代码中的path和image_name即可,path是csv文件路径,image_name是保存文件的路径及其文件名
import numpy as np import matplotlib.pyplot as plt import pywt import pandas as pd ''' num: 图片保存时防止名字重复,通过末尾数字区分 total: 保存的图片总量 start_num: 从csv表格的第几行开始读取(一般从第二行读取,0代表第二行) space: 读取间隔(我这里是每1024个采样点作为一个样本) sampling_period: 采样率(根据数据集实际情况设置,比如数据集采样率为12kHz,则sampling_period = 1.0 / 12000) totalscal: 小波变换尺度(我这里是256) wavename: 小波基函数(morl用的比较多,还有很多如:cagu8,cmor1-1等等) ''' def img_TimeFreq(num, total, start_num, end_num, space, sampling_period, totalscal, wavename): for i in range(0, total): # 加载数据集 path = "/root/Seimese/SeimeseOmniglot/code2/cwt/data/轴承内圈.csv" data = pd.read_csv(path, encoding='gbk') start_num += space end_num += space data = data.loc[start_num:end_num, 'data'] # 计算小波基函数的中心频率fc,然后根据totalscal 计算参数cparam # 通过除以np.arange(totalscal, 0, -1) 来生成一系列尺度值,并存储在scales中 fc = pywt.central_frequency(wavename) cparam = 2 * fc * totalscal scales = cparam / np.arange(totalscal, 0, -1) # 连续小波变换函数 coefficients, frequencies = pywt.cwt(data, scales, wavename, sampling_period) # 计算变换系数的幅度 amp = abs(coefficients) frequ_max = frequencies.max() # 根据采样周期生成时间轴 t = np.linspace(1, sampling_period, 1024, endpoint=False) # 绘制时频图 num += 1 image_name = "/root/Seimese/SeimeseOmniglot/code2/cwt/img/轴承内圈/轴承内圈" + str(num) plt.contourf(t, frequencies, amp, cmap='jet') plt.axis('off') # 去坐标轴 plt.xticks([]) # 去x轴刻度 plt.yticks([]) # 去y轴刻度 # 去白边 plt.savefig("{}_resized.jpg".format(image_name.split(".jpg")[0]), bbox_inches='tight', pad_inches=0) # plt.show() if __name__ == '__main__': img_TimeFreq(num=0, total=100, start_num=1, end_num=1024, space=1023, sampling_period=1.0/12000, totalscal=256, wavename='morl')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。