Jak wykonać splot w Pythonie ze zmienną szerokością Gaussa?

Muszę wykonać splot używając Gaussa, jednak szerokość Gaussa musi się zmienić. Nie wykonuję tradycyjnego przetwarzania sygnału, ale zamiast tego muszę przyjąć idealną funkcję gęstości prawdopodobieństwa (PDF) i „rozmazać” ją, w oparciu o rozdzielczość mojego sprzętu.

Załóżmy na przykład, że mój plik PDF zaczyna się jako funkcja spike / delta. Modeluję to jako bardzo wąski Gaussa. Po przejściu przez mój sprzęt zostanie on rozmazany zgodnie z pewną rozdzielczością Gaussa. Mogę to obliczyć za pomocą funkcji splotu scipy.signal.

    import numpy as np
    import matplotlib.pylab as plt

    import scipy.signal as signal
    import scipy.stats as stats

    # Create the initial function. I model a spike
    # as an arbitrarily narrow Gaussian
    mu = 1.0 # Centroid
    sig=0.001 # Width
    original_pdf = stats.norm(mu,sig)

    x = np.linspace(0.0,2.0,1000) 
    y = original_pdf.pdf(x)
    plt.plot(x,y,label='original')


    # Create the ``smearing" function to convolve with the
    # original function.
    # I use a Gaussian, centered at 0.0 (no bias) and
    # width of 0.5
    mu_conv = 0.0 # Centroid
    sigma_conv = 0.5 # Width
    convolving_term = stats.norm(mu_conv,sigma_conv)

    xconv = np.linspace(-5,5,1000)
    yconv = convolving_term.pdf(xconv)

    convolved_pdf = signal.convolve(y/y.sum(),yconv,mode='same')

    plt.plot(x,convolved_pdf,label='convolved')
    plt.ylim(0,1.2*max(convolved_pdf))
    plt.legend()
    plt.show()

To wszystko działa bez problemu. Ale teraz załóżmy, że mój oryginalny plik PDF nie jest kolcem, ale szerszą funkcją. Na przykład Gaussian z sigma = 1,0. A teraz załóżmy, że moja rezolucja rzeczywiście istniejevarys ponad x: przy x = 0,5, funkcja rozmazywania jest Gaussa z sigma_conv = 0,5, ale przy x = 1,5, funkcja rozmazywania jest Gaussa z sigma_conv = 1,5. Przypuśćmy, że znam funkcjonalną formę zależności X od mojego rozmazującego się Gaussa. Naiwnie pomyślałem, że zmienię powyższą linię na

    convolving_term = stats.norm(mu_conv,lambda x: 0.2*x + 0.1)

Ale to nie działa, ponieważ funkcja norm oczekuje wartości szerokości, a nie funkcji. W pewnym sensie potrzebuję mojej zwinnej funkcji, aby była tablicą 2D, gdzie mam inny rozmazany Gaussian dla każdego punktu w moim oryginalnym pliku PDF, który pozostaje tablicą 1D.

Czy istnieje sposób, aby to zrobić za pomocą funkcjijuż zdefiniowane w Pythonie? Mam jakiś kod do zrobienia, który sam napisałem ... ale chcę się upewnić, że nie wymyśliłem koła.

Z góry dziękuję!

Matt

questionAnswers(1)

yourAnswerToTheQuestion