Python处理单列时序采样信号求极值、绘图并导出xls的实现问题
依赖安装
先安装所需第三方库:pip install numpy matplotlib xlwt
完整实现代码
import numpy as np import matplotlib.pyplot as plt import xlwt # 局部极值检测函数 def find_local_peaks(x, y): max_x = [] max_y = [] min_x = [] min_y = [] # 首尾点不参与判断,遍历中间所有点 for i in range(1, len(y)-1): current = y[i] left = y[i-1] right = y[i+1] # 极大值判断 if current > left and current > right: max_x.append(x[i]) max_y.append(current) # 极小值判断 if current < left and current < right: min_x.append(x[i]) min_y.append(current) return np.array(max_x), np.array(max_y), np.array(min_x), np.array(min_y) if __name__ == '__main__': # 1. 读取数据文件,替换为实际文件路径即可 filename = 'location/file_name.txt' signal = np.loadtxt(filename, comments='#', delimiter='\n', dtype=np.float64) # 2. 生成时间轴:采样率200Hz,初始时间为0 t = np.arange(len(signal)) / 200.0 # 3. 调用极值检测函数 max_t, max_val, min_t, min_val = find_local_peaks(t, signal) # 4. 生成可视化图表 plt.figure(figsize=(12, 6), dpi=100) # 绘制原始信号 plt.plot(t, signal, label='原始时序信号', color='gray', linewidth=1) # 标记极大值峰 plt.scatter(max_t, max_val, color='red', s=30, label='极大值峰') # 标记极小值峰 plt.scatter(min_t, min_val, color='blue', s=30, label='极小值峰') plt.xlabel('时间(s)') plt.ylabel('信号幅值') plt.title('时序信号与极值峰检测结果') plt.legend() plt.grid(alpha=0.3) plt.savefig('peak_detection_result.png', bbox_inches='tight') plt.show() # 5. 生成xls文件,全程未使用Pandas库 workbook = xlwt.Workbook(encoding='utf-8') # 新建极大值峰工作表 max_sheet = workbook.add_sheet('极大值峰') # 写入表头 max_sheet.write(0, 0, '峰值出现时间(s)') max_sheet.write(0, 1, '对应幅值') # 写入极大值数据 for row in range(len(max_t)): max_sheet.write(row+1, 0, max_t[row]) max_sheet.write(row+1, 1, max_val[row]) # 新建极小值峰工作表 min_sheet = workbook.add_sheet('极小值峰') # 写入表头 min_sheet.write(0, 0, '峰值出现时间(s)') min_sheet.write(0, 1, '对应幅值') # 写入极小值数据 for row in range(len(min_t)): min_sheet.write(row+1, 0, min_t[row]) min_sheet.write(row+1, 1, min_val[row]) # 保存xls文件 workbook.save('peak_result.xls')
实现说明
- 极值检测函数完全符合需求规则:跳过首尾仅单侧有相邻点的数值,仅将同时大于/小于左右相邻点的位置判定为极值峰
- 时间轴直接通过采样率计算生成,适配2001点的输入数据,总时长10s
- 可视化结果会同时保存为png文件和支持弹窗预览,极值点用不同颜色区分标注
- xls文件通过xlwt直接生成,两个工作表分别存储极大、极小值数据,自带表头符合要求
内容的提问来源于stack exchange,提问作者ZVeguillaCotto
相关产品推荐
相关产品推荐

