Есть ли способ в python получить амплитуду подобранных данных, чтобы они соответствовали необработанным данным? - PullRequest
0 голосов
/ 20 марта 2020

это мой первый пост, поэтому я прошу прощения за любые ошибки нуб.

Я пытался вписать то, что по сути является функцией 1 + cos, в мои данные, используя код:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from numpy.polynomial import polynomial as p
from scipy.signal import find_peaks

def FP_cavity_ref(x, coeff, L):
    R1 = 0.035
    R2 = 0.003
    n = 1.0003
    Amp = p.polyval(x, coeff)
    phi = ((4*np.pi*L*n)/x)+np.pi

    func = Amp*(R1+R2+2*np.sqrt(R1*R2)*np.cos(phi))/(1+R1*R2+2*np.sqrt(R1*R2)*np.cos(phi))
    return func/np.max(func)

def cav_len_calc(raw_data):
    spec = np.asarray([raw_data])
    peaks, _ = find_peaks(raw_data)
    peak_intensity = raw_data[peaks]
    c, stats = p.polyfit(xval[peaks], peak_intensity, 8, full=True)
    coeffs = c

    param, pconv = curve_fit(lambda xval, L: FP_cavity_ref(xval, coeffs, L), xval, raw_data, p0=177000)

    y = FP_cavity_ref(xval, coeffs, param)

    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.plot(xval, raw_data, label='Raw data')
    ax.plot(xval, y, label='Fit')
    ax.set_xlabel('Wavelength (nm)', fontsize=14)
    ax.set_ylabel('Intensity (a.u.)', fontsize=14)
    handles, labels = ax.get_legend_handles_labels()
    ax.legend(fontsize=12)
    plt.show()

    return

xval = np.linspace(1280, 1330, 300)

cav_len_calc()

По сути, получается такой график:

Output plot

Мне удалось отсортировать амплитуду, зависящую от длины волны, с использованием полиномиальной аппроксимации, полученной из пикового определения, однако я не знаю, как получить долины подобранных данных для сопоставьте необработанные данные, сохраняя верность пиков.

Есть ли способ сделать это в python?

...