[XJTU-SY-BD]基础03 - 包络谱生成

1.分析结果

包络图是第三行。第一行水平时域信号,第二行垂直时域信号,第三行对第1行信号在故障频点包络计算后的结果。

上方是最终的视图。右下角我把光标对准了低频位置的那个故障峰,与理论值是一致的.

2.源码

2.1 测试例程源码

import gp_xjtu_data
import gp_calc_envelope
import gp_xjtu_toolsdef test_gp_calc_envelope():(x, sig_h, sig_v, fullpathOfFile) = gp_xjtu_data.get_demo_data();descToDraw = []descToDraw.append(x);descToDraw.append(sig_h);descToDraw.append("Time Domain Signal (XJTU-SY Bearing_Datasets 35Hz12KN 1-1)")descToDraw.append("Time(s) 256000sa/s, 32768pt.")descToDraw.append("g(acc)");descToDraw.append(fullpathOfFile + "  horizon");signals = []signals.append(descToDraw.copy());descToDraw = []descToDraw.append(x);descToDraw.append(sig_v);descToDraw.append("Time Domain Signal (XJTU-SY Bearing_Datasets 35Hz12KN 1-1)")descToDraw.append("Time(s) 256000sa/s, 32768pt.")descToDraw.append("g(acc)");descToDraw.append(fullpathOfFile + "  horizon");signals.append(descToDraw.copy());(signal_final, signal_demodulated, signal_filtered, signal_ac) = gp_calc_envelope.calc_envelope_of(x, sig_h, 180)descToDraw = []descToDraw.append(x);descToDraw.append(signal_final);descToDraw.append("Time Domain Signal - Envelope Wave")descToDraw.append("Time(s) 256000sa/s, 32768pt.")descToDraw.append("g(acc)");descToDraw.append(fullpathOfFile + "  horizon");signals.append(descToDraw.copy());gp_xjtu_tools.DrawSignals(signals,1000, fullpathOfFile)test_gp_calc_envelope()

2.2 包络计算单元

import csv
import numpy as np
import matplotlib.pyplot as plt
import gp_xjtu_toolsdef calc_envelope_with_band(x, signal, freq_low, freq_high):signal_ac = gp_xjtu_tools.dc2ac(signal)signal_filtered = gp_xjtu_tools.band_filter(x, signal_ac, freq_low, freq_high)signal_demodulated = gp_xjtu_tools.envelope(signal_filtered)signal_final = gp_xjtu_tools.dc2ac(signal_demodulated)return (signal_final, signal_demodulated, signal_filtered, signal_ac)def calc_envelope_of(x, signal, centerFreq):return calc_envelope_with_band(x, signal, centerFreq*0.8, centerFreq*5)

2.3 数据获取单元
 

import csv
import numpy as np
import matplotlib.pyplot as pltdef ReadOneChannelRecordFromXJBD(file_path):horizontal_signals = []vertical_signals = []with open(file_path, newline='') as csvfile:reader = csv.reader(csvfile)next(reader)  # 跳过标题行for row in reader:horizontal_signals.append(float(row[0]))vertical_signals.append(float(row[1]))return (horizontal_signals, vertical_signals)#将[+-50g的信号归一化为0点在32768处的u16信号]
def double2u16(data_in_array):data = np.array(data_in_array);normalized_data = np.clip(np.array(((data - (-50.0)) / 100.0 * 65535), dtype=np.uint16), 0, 65535)return normalized_data;def resampleData(data_in_array, target_point):# 确定抽样点位置的索引值idx = np.linspace(0, len(data_in_array)-1, target_point, dtype=np.int32)# 使用interp函数进行抽样resampled_data = np.interp(idx, np.arange(len(data_in_array)), data_in_array)return resampled_data;def getSampledataIn2048U16(file_path, dataType):(hdata, vdata) = ReadOneChannelRecordFromXJBD(file_path);if(dataType == "h"):data = resampleData(hdata, 2048)else:data = resampleData(vdata, 2048)return double2u16(data);def get_demo_data():file_path=".\\data\\1-1\\"file_name="123.csv"full_path=file_path + file_name#full_path = r"D:\git2024\20240304_PushVibrationData\XJTU-SY_Bearing_Datasets\35Hz12kN\Bearing1_1\1.csv"(hSig, vSig) = ReadOneChannelRecordFromXJBD(full_path);#hSig = xjtu_file.double2u16(hSig);#vSig = xjtu_file.double2u16(vSig);x = np.arange(0,len(hSig));saps=25.6e3;x_axis = x*1.0/saps;return (x_axis, hSig, vSig, full_path)

2.4 基础工具集 - 计算 - 绘图

import csv
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import butter, filtfilt, hilbertdef dc2ac(signal):y = signalfft_signal = np.fft.fft(y)fft_signal[0] = 0; #dc=>acfft_signal_no_phase_correction = np.fft.ifft(fft_signal)return fft_signal_no_phase_correction;def band_filter(x, signal, freq_low, freq_high):saps=1.0/x[1]print('saps=', saps)# 定义一个二阶巴特沃斯滤波器b, a = butter(2, [2*freq_low/saps, 2*freq_high/saps], btype='band')# 应用滤波器filtered_signal = filtfilt(b, a, signal)signal_abs = [np.abs(z.real) for z in filtered_signal]return signal_absdef envelope(signal):complex_signal = hilbert(signal);signal_abs = [np.abs(z.real) for z in complex_signal]return signal_abs;def GetFFTOfSignal(x_axis, sig):#calc_fftfft_signal = np.fft.fft(y)fft_signal[0] = 0; #dc=>acfreq = np.arange(len(fft_signal)//2)freq = freq *(1.0/(len(fft_signal)*x[1]));print(freq[-1], len(freq))fft_signal_abs = fft_signal[0:len(fft_signal)//2]fft_signal_abs = [np.abs(z.real*x[1]) for z in fft_signal_abs]fft_x = freq;fft_y = np.abs(fft_signal_abs);ffty_toshow = fft_yffty_raw_ac = fft_signalreturn (fft_x, ffty_toshow, ffty_raw_ac);def GetFFTOfSignal_withShutdownFreq(x_axis, sig, freq_shutdown):#calc_fftfft_signal = np.fft.fft(y)fft_signal[0] = 0; #dc=>acfreq = np.arange(len(fft_signal)//2)freq = freq *(1.0/(len(fft_signal)*x[1]));print(freq[-1], len(freq))fft_signal_abs = fft_signal[0:len(fft_signal)//2]fft_signal_abs = [np.abs(z.real*x[1]) for z in fft_signal_abs]max_freq_index =next((i for i, num in enumerate(freq) if num > freq_shutdown), len(freq))print("max_freq_index = ", max_freq_index, ",values=", freq[max_freq_index])fft_x = freq[:max_freq_index];fft_y = np.abs(fft_signal_abs[:max_freq_index]);ffty_toshow = fft_yffty_raw_ac = fft_signalreturn (fft_x, ffty_toshow, ffty_raw_ac);def DrawSignals(signals, freq_shutdown, signal_memo):cnt = len(signals)# 绘制频谱图plt.figure(figsize=(12, 6))row = cnt;col = 2;sn = 1;for item in signals:x = item[0];y = item[1];sTitle = item[2];sX = item[3];sY = item[4];# 绘制时间域波形plt.subplot(row, 2, sn)sn = sn +1;plt.plot(x, y, color="green")plt.xlabel(sX)plt.ylabel(sY)plt.title(sTitle)#calc_fftfft_signal = np.fft.fft(y)fft_signal[0] = 0; #dc=>acfreq = np.arange(len(fft_signal)//2)freq = freq *(1.0/(len(fft_signal)*x[1]));print(freq[-1], len(freq))fft_signal_abs = fft_signal[0:len(fft_signal)//2]fft_signal_abs = [np.abs(z.real*x[1]) for z in fft_signal_abs]max_freq_index =next((i for i, num in enumerate(freq) if num > freq_shutdown), len(freq))print("max_freq_index = ", max_freq_index, ",values=", freq[max_freq_index])fft_x = freq[:max_freq_index];fft_y = np.abs(fft_signal_abs[:max_freq_index]);#绘制频谱plt.subplot(row, 2, sn)sn = sn +1plt.plot(fft_x, fft_y, color='blue')str_fft = 'Freq Spectrum of Left Figure(datafile=%s)' %(signal_memo)plt.title(str_fft)plt.xlabel('Frequency[cut to %5.1fHz], totalPt=%d'  %(freq_shutdown, len(fft_signal_abs)))plt.ylabel('Amplitude')plt.axis('auto')  # 启用自动调整大小和缩放功能plt.grid(True)plt.tight_layout()plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/269901.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nature 研究亮点(Volume 626 Issue 8001, 29 February 2024)

文章目录 激光雕刻肥皂膜卵细胞的回收系统巴斯克语的起源产后抑郁症的治疗 激光雕刻肥皂膜 研究者:Haitao Xu 和 Yu Zhao,清华大学,北京。 发现:在特定条件下,可以使用激光在肥皂膜上进行雕刻。肥皂膜由洗涤剂分子&am…

护眼灯哪个牌子好?热门护眼台灯测评对比:明基/书客/柏曼,速度戳进来了解!

近年来,市场上出现了大量新型护眼台灯,让消费者在面对众多选择时感到困惑。在选购护眼台灯的时候,我们需要谨慎考虑,有些护眼台灯因为不合格,在使用过程中发热可能会产生有毒物质,对健康造成不良影响。那么…

Nginx使用—http基础知识

web访问流程 当我们在客户端通过浏览器输入网址的时候,这时候是访问不到服务器的, 先会去找到DNS解析服务器,DNS解析服务器返回IP地址, 客户端通过http协议向服务端发送请求,服务器响应请求并返回对应的资源给客户端&a…

TruEra

文章目录 关于 TruEra关于 TruLens 关于 TruEra TruEra Gen AI Observability and LLM Evaluation​ Monitor, evaluate, and debug your LLM and Gen AI apps. All part of Full Lifecycle AI Observability from TruEra. 官网:https://truera.comgithub : https…

旺泓_光感WH3620_数字RGBW-IR色彩传感器

由工采网代理的WH3620是一种基于颜色的光到数字转换器;它集光电二极管、电流放大器、模拟电路和数字信号处理器于一体;提供红、绿、蓝、白和红外光传感;能调节屏幕或灯光白平衡;各通道同时并行输出,因此在白光LED、CWF、TL84、D65…

本机虚拟机centos7设置固定ip

一、配置虚拟机网络 1、点击编辑 2、点击更改设置 记住子网地址:192.168.121.0 点击确定 二、配置虚拟机网络配置文件 首先进去root中,然后进入vim编辑器中 (1)su - root (2) vim /etc/sysconfig/network-scripts/ifcfg-ens33 在VIM编辑器中修改并添加…

约课小程序有哪些功能

​约课小程序为教育机构、教师和学生提供了便捷的预约和管理服务,有效提升了教学效率和用户体验。在这篇文章中,我们将介绍约课小程序常见的功能,帮助教育机构更好地了解如何利用小程序来提升服务质量和管理效率。 1. **课程预约功能**&…

【粉丝福利】一本书讲透ChatGPT,实现从理论到实践的跨越!大模型技术工程师必读

🌼一、前言 OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景,在多项专业和学术基准测试中表现出的智力水平,不仅接近甚至有时超越了人类的平均水平。这使得 ChatGPT 在推出之初就受到广大用户的欢迎&#xf…

【Linux C | 网络编程】广播概念、UDP实现广播的C语言例子

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

dolphinscheduler试用(一)(边用边修bug。。。。create tenant error)

(作者:陈玓玏) 前提:部署好了dolphinscheduler,部署篇见https://blog.csdn.net/weixin_39750084/article/details/136306890?spm1001.2014.3001.5501 官方文档见:https://dolphinscheduler.apache.org/zh…

常用“树”数据结构

哈夫曼树 在许多应用中,树中结点常常被赋予一个表示某种意义的数值,称为该结点的权。从树的根到任意结点的路径长度(经过的边数)与该结点上权值的乘积,称为该结点的带权路径长度。树中所有叶结点的带权路径长度之和称为该树的带权路径长度&am…

App原生开发:iOS和Android平台的比较(看这一篇就够了)

引言 移动应用的发展在过去几年里取得了巨大的突破,而原生开发作为构建高性能、富有交互性的应用程序的首选方法,一直占据着重要的地位。在这篇文章中,我们将探讨原生开发在两个主流移动平台——iOS和Android上的关键概念和技术。 概念和重…

关于制作Python游戏全过程(汇总1)

目录 前言: 1.plane_sprites模块: 1.1导入模块: 1.1.1pygame:一个用于创建游戏的Python库。 1.1.2random:Python标准库中的一个模块,用于生成随机数。 1.2定义事件代号: 1.2.1ENEMY_EVENT:自定义的敌机出场事件代号&#xf…

芯科科技为全球首批原生支持Matter-over-Thread的智能锁提供强大助力,推动Matter加速成为主流技术

智能锁领域的先锋企业U-tec和Nuki选择芯科科技解决方案,成为Matter-over-Thread应用的领先者 致力于以安全、智能无线连接技术,建立更互联世界的全球领导厂商Silicon Labs(亦称“芯科科技”,NASDAQ:SLAB)今…

使用Fabric创建的canvas画布背景图片,自适应画布宽高

之前的文章写过vue2使用fabric实现简单画图demo,完成批阅功能;但是功能不完善,对于很大的图片就只能显示一部分出来,不符合我们的需求。这就需要改进,对我们设置的背景图进行自适应。 有问题的canvas画布背景 修改后的…

【排序】详解冒泡排序

一、思想 冒泡排序的基本思想是利用两两比较相邻记录的方式,通过一系列的比较和交换操作,使得较大或较小的元素逐渐移动到数列的一端。在每一轮的排序过程中,都会从数列的起始位置开始,对相邻的元素进行比较,如果它们…

基于SSM的洋洋线上服装商城系统的设计与实现

第1章 绪论 1.1 研究背景和意义 在如今这个信息时代,“网上购物”这种购物方式已经为越多的人认可。在此背景下,开发出稳定并且功能齐全的网络购物平台不可或缺,在这些需求的支持下,在先进的信息技术的支持下,产品销…

华为HQoS配置案例

HQoS基于层次化调度,cpe上支持三级队列: level3流队列:每个用户的同类业务是一个业务流,针对每个用户不同的业务流进行队列调度,流队列一般与业务类型对应(EF、AF、BE等)。 level2用户队列&…

Node.js 最佳实践:改善你的应用程序设计 | 开源日报 No.191

goldbergyoni/nodebestpractices Stars: 92.4k License: CC-BY-SA-4.0 Node.js Best Practices 是一个关于 Node.js 最佳实践的开源项目。该项目汇总了许多顶级内容,包括 80 多个最佳实践、样式指南和架构技巧。以下是该项目的核心优势和主要功能: 提供…

go并发模式之----使用时顺序模式

常见模式之二:使用时顺序模式 定义 顾名思义,起初goroutine不管是怎么个先后顺序,等到要使用的时候,需要按照一定的顺序来,也被称为未来使用模式 使用场景 每个goroutine函数都比较独立,不可通过参数循环…