8

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

+0

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? –

+0

"Mam trochę kodu, aby napisać to sam" => czy możesz pokazać nam ten kod? To może być pomocne. –

Odpowiedz

5

Pytanie, w skrócie:
Jak convolve z jądrem niestacjonarnym, na przykład Gaussa, który zmienia szerokość dla różnych miejscach w danych, a robi Pythona istniejącego narzędzia do tego ?

Odpowiedź, sortowanie:
Trudno jest udowodnić negatyw, ale nie sądzę, że funkcja wykonywania splotu z niestacjonarnym jądrem istnieje w scipy lub numpy. W każdym razie, jak to opisujesz, nie można go wektoryzować, więc możesz równie dobrze zrobić pętlę lub napisać niestandardowy kod C.

Jedna sztuczka, która może ci pomóc, to zamiast zmieniać rozmiar jądra z pozycją, rozciąga dane z odwrotną skalą (tj. W miejscach, w których chciałbyś, aby Gaussian miał 0,5, baza szerokość, rozciągnij dane do 2x). W ten sposób można wykonać pojedynczą operację odkształcenia danych, standardowy splot o stałej szerokości Gaussa, a następnie oddzielić dane do oryginalnej skali.

Zaletą tego podejścia jest to, że jest bardzo łatwy do napisania i jest całkowicie wektoryzowany, a zatem prawdopodobnie dość szybki do uruchomienia.

Uszkodzenie danych (za pomocą, powiedzmy, metody interpolacji) spowoduje pewną utratę dokładności, ale jeśli wybierzesz rzeczy tak, aby dane były zawsze rozszerzane i nie zmniejszane podczas początkowej operacji odkształcenia, straty powinny być minimalne.

Powiązane problemy