寻找固定位置三个峰的峰值和峰值波长以及半高宽

阅读: 评论:0

寻找固定位置三个峰的峰值和峰值波长以及半高宽

寻找固定位置三个峰的峰值和峰值波长以及半高宽

由于三个峰固定,就分三部分分别寻找,先使去除过于离谱的脉冲噪声,再利用中值滤波去除剩下的脉冲噪声。利用借鉴的寻找最近的值的函数来寻找半高宽横坐标。代码还是过于冗余。

本来想对各个部分进行洛伦兹拟合,对我来说还是有点困难,没有成功。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy import signal
import osdef moving(interval, dsize):retwo = []sublist = [interval[i:i+dsize] for i in range(0, len(interval)-dsize,1)]re = np.median(sublist,axis=1,keepdims=True).tolist()for i in range(0, len(re) , 1):retwo += re[i]passretwo += interval[-dsize:]return retwopassdef find_closest_index(lst, target):diff = np.abs(np.array(lst) - target)return np.argmin(diff)def calnum():num = 0while(num == 0):fileName = input("文件名(绝对路径):")if ists(fileName):data = pd.read_excel(fileName)x = lumns[0]].tolist()y = lumns[1]].tolist()i = 0lenth = len(x)while i < lenth:if y[i] > 290 or y[i] < 0:del x[i]del y[i]lenth -= 1else:i += 1passdsize = int(input("选取多少位取中位数(建议5,越小毛刺越多,但数据更真实):"))x_av = xy_av = moving(y, dsize)sublistx1 = []sublisty1 = []sublistx2 = []sublisty2 = []sublistx3 = []sublisty3 = []for i in range(0, 800, 1):sublistx1.append(x_av[i])sublisty1.append(y_av[i])passfor i in range(0, 600, 1):sublistx2.append(x_av[600 + i])sublisty2.append(y_av[600 + i])passfor i in range(0, 1000, 1):sublistx3.append(x_av[1500 + i])sublisty3.append(y_av[1500 + i])passmax_val1 = max(sublisty1)max_idx1 = sublisty1.index(max_val1)max_val2 = max(sublisty2)max_idx2 = sublisty2.index(max_val2)max_val3 = max(sublisty3)max_idx3 = sublisty3.index(max_val3)max_idy1l = sublisty1[:max_idx1]max_idy1r = sublisty1[max_idx1:]fwmn1l = find_closest_index(max_idy1l, max_val1 / 2)fwmn1r = find_closest_index(max_idy1r, max_val1 / 2)fwmn1 = sublistx1[max_idx1 + fwmn1r] - sublistx1[fwmn1l]max_idy2l = sublisty2[:max_idx2]max_idy2r = sublisty2[max_idx2:]fwmn2l = find_closest_index(max_idy2l, max_val2 / 2)fwmn2r = find_closest_index(max_idy2r, max_val2 / 2)fwmn2 = sublistx2[max_idx2 + fwmn2r] - sublistx2[fwmn2l]max_idy3l = sublisty3[:max_idx3]max_idy3r = sublisty3[max_idx3:]fwmn3l = find_closest_index(max_idy3l, max_val3 / 2)fwmn3r = find_closest_index(max_idy3r, max_val3 / 2)fwmn3 = sublistx3[max_idx3 + fwmn3r] - sublistx3[fwmn3l]plt.plot(x_av, y_av, 'b')plt.plot(sublistx1[max_idx1], max_val1, 'bo')plt.plot(sublistx2[max_idx2], max_val2, 'bo')plt.plot(sublistx3[max_idx3], max_val3, 'bo')  # 标注峰的位置plt.plot([sublistx1[max_idx1], sublistx1[max_idx1]], [0, max_val1], color='gray', linestyle='--')plt.plot([sublistx2[max_idx2], sublistx2[max_idx2]], [0, max_val2], color='gray', linestyle='--')plt.plot([sublistx3[max_idx3], sublistx3[max_idx3]], [0, max_val3], color='gray', linestyle='--')  # 绘制垂直虚线(sublistx1[max_idx1], max_val1, f'({sublistx1[max_idx1]:.1f}, {max_val1:.1f})', fontsize=9,color='blue')(sublistx2[max_idx2], max_val2, f'({sublistx2[max_idx2]:.1f}, {max_val2:.1f})', fontsize=9,color='blue')(sublistx3[max_idx3], max_val3, f'({sublistx3[max_idx3]:.1f}, {max_val3:.1f})', fontsize=9,color='blue')# 添加标签plt.hlines(max_val1 / 2, sublistx1[fwmn1l], sublistx1[max_idx1 + fwmn1r], colors='red')plt.hlines(max_val2 / 2, sublistx2[fwmn2l], sublistx2[max_idx2 + fwmn2r], colors='red')plt.hlines(max_val3 / 2, sublistx3[fwmn3l], sublistx3[max_idx3 + fwmn3r], colors='red')(sublistx1[max_idx1 + fwmn1r], max_val1 / 2, f'FWMN:{fwmn1:.1f}nm', fontsize=9, color='blue')(sublistx2[max_idx2 + fwmn2r], max_val2 / 2, f'FWMN:{fwmn2:.1f}nm', fontsize=9, color='blue')(sublistx3[max_idx3 + fwmn3r], max_val3 / 2, f'FWMN:{fwmn3:.1f}nm', fontsize=9, color='blue')plt.xlabel('wavelenth(nm)')plt.ylabel('tensity')id(True)plt.show()# a = input("是否退出?Y/N")# if(a == 'Y' or 'y'):#     breakprint("--------------------------------------------------------------------------")passelse:print('文件不存在,请确认输入文件名是否正确')print("--------------------------------------------------------------------------")passpassif __name__ == '__main__':calnum()pass
def moving(interval, dsize):retwo = []count = dsize // 2retwo += interval[:count]sublist = [interval[i:i+dsize] for i in range(0, len(interval)-dsize+1,1)]re = np.median(sublist,axis=1,keepdims=True).tolist()for i in range(0, len(re) , 1):retwo += re[i]passif dsize % 2 == 0 :retwo += interval[-count + 1:]passelse:retwo += interval[-count :]return retwopass

修改了 中值滤波

本文发布于:2024-01-28 03:56:39,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17063854064603.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:峰值   波长   位置   半高宽
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23