Potrzebuję wykonać splot za pomocą Gaussa, jednak szerokość Gaussa musi się zmienić. Nie zajmuję się tradycyjnym przetwarzaniem sygnału, ale zamiast tego muszę wziąć moją idealną funkcję gęstości prawdopodobieństwa (PDF) i "wymazać" ją, w oparciu o rozdzielczość mojego sprzętu.Na przykład:Jak wykonać splot w pythonie z Gaussian o zmiennej szerokości?
Załóżmy na przykład, że mój plik PDF zaczyna się jako funkcja spike/delta.) Modeluję to jako bardzo wąski Gaussian.Po przejściu przez mój sprzęt, będzie rozmazany zgodnie z pewną rozdzielczością Gaussa.Może 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 mój oryginalny PDF nie jest kolec, ale trochę szersze funkcje. Na przykład Gaussa z sigma = 1,0. A teraz załóżmy mój rozdzielczość rzeczywiście varys przez x: przy x = 0,5, funkcja rozmazywania jest Gaussiana z sigma_conv = 0,5, ale przy x = 1,5, funkcja rozmazywania jest Gaussiana z sigma_conv = 1.5. I przypuśćmy, że znam funkcjonalną formę zależności x od mażącego gaussa. Naiwnie myślałem, że chciałbym zmienić linię wyżej
convolving_term = stats.norm(mu_conv,lambda x: 0.2*x + 0.1)
Ale to nie działa, ponieważ funkcja norma przewiduje wartość szerokości, a nie funkcji. W pewnym sensie potrzebuję mojej funkcji convolving, aby była to tablica 2D, w której mam różne rozmycie Gaussian dla każdego punktu w moim oryginalnym pliku PDF, który pozostaje tablicą 1D.
Czy istnieje sposób, aby to zrobić z funkcjami już zdefiniowanymi w Pythonie? Mam do tego kod, który sam napisałem ... ale chcę się upewnić, że nie wymyśliłem ponownie koła.
Z góry dzięki!
Matt
Twój xconv "krok" '(ostatni - pierwszy)/(długość - 1)' będący różny od x "krok" powoduje, że szerokość jest skalowana (tzn. Sigma nie znajdują się w tej samej "jednostce"), naprawdę chce to? –
"Mam trochę kodu, aby napisać to sam" => czy możesz pokazać nam ten kod? To może być pomocne. –