python中是否有方法获得拟合数据的振幅以匹配原始数据

python中是否有方法获得拟合数据的振幅以匹配原始数据,python,signal-processing,physics,Python,Signal Processing,Physics,这是我的第一篇帖子,所以我为任何noob错误道歉 我一直在尝试使用以下代码将本质上是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(

这是我的第一篇帖子,所以我为任何noob错误道歉

我一直在尝试使用以下代码将本质上是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()
这基本上产生了这个图:

我已经设法使用从峰值查找获得的多项式拟合来获得与波长相关的振幅排序,但是我不知道如何获得拟合数据的谷值以匹配原始数据,同时仍然保持峰值正确


在python中有没有实现这一点的方法

欢迎来到StackOverflow,我认为您最好给出一些数据示例(可能是带噪声的正弦)来帮助提高误差再现性。您想做什么样的拟合?正弦拟合,傅里叶?对于正弦拟合,您可以使用以下内容:感谢您的回复。我试图拟合一个1+cos(phi),其中phi=4*pi*腔长*折射率/波长。这是我创建光纤法布里-珀罗干涉仪项目的数据。我的数据的问题是振幅随波长变化,这似乎导致曲线拟合函数出现一些问题。我无法浏览所有代码,但这个结果有点奇怪。你得到的是低频信号,它似乎对上半部分是正确的,但对下半部分不是。我不认为这只是振幅随波长变化的情况。所有波谷的误差似乎都是恒定的。