2012-12-27 9 views
36

Chcę dodać trochę losowego szumu do około 100 sygnału bin, który symuluję w Pythonie - aby uczynić go bardziej realistycznym.Dodawanie szumu do sygnału w pythonie

Na poziomie podstawowym moją pierwszą myślą było przejście do bin bin i wygenerowanie losowej liczby z pewnego zakresu i dodanie lub odjęcie tego sygnału.

Miałem nadzieję (jak to jest python), że może być bardziej inteligentny sposób to zrobić za pomocą numpy lub coś podobnego. (Przypuszczam, że najlepiej byłoby, gdyby liczba pobrana z rozkładu gaussowskiego i dodana do każdego pojemnika była również lepsza.)

Z góry dziękuję za wszelkie odpowiedzi.


Jestem właśnie na etapie planowania mojego kodu, więc nie mam nic do pokazania. Po prostu myślałem, że może istnieć bardziej wyrafinowany sposób generowania hałasu.

W warunkach Wyjścia, jeśli miał 10 pojemników z następujących wartości:

Pojemnik 1: 1 bin 2: 4 BIN 3: 9 bin 4 16 Bin 5: 25 Pojemnik 6 : 25 Bin 7: 16 Bin 8: 9 Bin 9: 4 Bin 10: 1

zastanawiałem się, czy nie było predefiniowanych funkcji, które mogłyby dodać szum dać mi coś takiego:

Pojemnik 1: 1,13 Pojemnik 2: 4,21 Pojemnik 3: 8,79 Pojemnik 4: 16,08 Pojemnik 5: 24,97 Pojemnik 6: 25.14 Pojemnik 7: 16,22 Pojemnik 8: 8,90 Pojemnik 9: 4,02 Pojemnik 10: 0.91

Jeśli nie, po prostu przejdę do bin-by-bin i dodasz do każdej z nich liczbę wybraną z rozkładu gaussowskiego.

Dziękuję.


To właściwie sygnał z radioteleskopu, który symuluję. Chciałbym móc ostatecznie wybrać stosunek sygnału do szumu mojej symulacji.

+2

proszę zademonstruj kod, który wypróbowałeś, lub konkretny problem, który napotykasz. Przykładowe dane wejściowe i pożądana wydajność również byłyby bardzo ważne. –

+1

Jaki to jest sygnał? Jaki hałas chcesz wprowadzić? "Realistyczny" zależy od rodzaju sygnału. Hałas dźwiękowy to nie to samo, co szum obrazu. –

Odpowiedz

51

Można wygenerować tablicę hałasu i dodać go do sygnału

import numpy as np 

noise = np.random.normal(0,1,100) 

# 0 is the mean of the normal distribution you are choosing from 
# 1 is the standard deviation of the normal distribution 
# 100 is the number of elements you get in array noise 
+5

W niektórych kontekstach może być bardziej sensowne pomnożenie sygnału przez szum (skupiony wokół 1), zamiast dodawania szumu, ale oczywiście zależy to od natury szumu, który próbujesz zasymulować. –

31

... A dla tych, którzy - jak ja - są bardzo wcześnie w ich krzywej uczenia numpy,

import numpy as np 
pure = np.linspace(-1, 1, 100) 
noise = np.random.normal(0, 1, pure.shape) 
signal = pure + noise 
3

dla tych, którzy chcą dodać szum do zbioru danych wielowymiarowych załadowanego w dataframe pandy lub nawet numpy ndarray, oto przykład:

import pandas as pd 
# create a sample dataset with dimension (2,2) 
# in your case you need to replace this with 
# clean_signal = pd.read_csv("your_data.csv") 
clean_signal = pd.DataFrame([[1,2],[3,4]], columns=list('AB'), dtype=float) 
print(clean_signal) 
""" 
print output: 
    A B 
0 1.0 2.0 
1 3.0 4.0 
""" 
import numpy as np 
mu, sigma = 0, 0.1 
# creating a noise with the same dimension as the dataset (2,2) 
noise = np.random.normal(mu, sigma, [2,2]) 
print(noise) 

""" 
print output: 
array([[-0.11114313, 0.25927152], 
     [ 0.06701506, -0.09364186]]) 
""" 
signal = clean_signal + noise 
print(signal) 
""" 
print output: 
      A   B 
0 0.888857 2.259272 
1 3.067015 3.906358 
""" 
Powiązane problemy