W niektórych artykułach czytałem, że hałas addytywny jest ograniczony przez pasmo bieli Gaussa.
Jak mogę zasymulować ten rodzaj hałasu za pomocą MATLAB?
W niektórych artykułach czytałem, że hałas addytywny jest ograniczony przez pasmo bieli Gaussa.
Jak mogę zasymulować ten rodzaj hałasu za pomocą MATLAB?
Odpowiedzi:
Generowałbyś ograniczony pasmo szum Gaussa, najpierw generując biały szum, a następnie filtrując go do żądanej przepustowości. Jako przykład:
% design FIR filter to filter noise to half of Nyquist rate
b = fir1(64, 0.5);
% generate Gaussian (normally-distributed) white noise
n = randn(1e4, 1);
% apply to filter to yield bandlimited noise
nb = filter(b,1,n);
Jest to tylko niewielki dodatek do odpowiedzi Jasona: zwykle musisz generować szum o ograniczonym paśmie przy danej wariancji . Możesz dodać ten kod do kodu podanego w odpowiedzi Jasona:
var = 3.0; % just an example
scale = sqrt(var)/std(nb);
nb = scale*nb; % nb has variance 'var'
Pamiętaj, że skalowanie należy wykonać po filtrowaniu, ponieważ ogólnie filtr zmienia wariancję szumu.
Za każdym razem, gdy generujesz dyskretne próbki hałasu ( na przykład za pomocą MATLAB randn
/ rand
), faktycznie generujesz szum o ograniczonym paśmie.
Wszystko, co musisz zrobić, to dostosować wariancję dyskretnych próbek do wariancji szumu „ciągłego”, z którego rzekomo pobierane są próbki.
Pełny opis znajduje się tutaj - Jak symulować AWGN (Additive White Gaussian Noise) w systemach komunikacyjnych dla określonej przepustowości .
Dlaczego nie można zastosować podejścia wymienionego w tym poście ?
Zaczyna się od pożądanych częstotliwości i działa wstecz, aby zbudować sygnał, zamiast filtrować. Używa kodu python, ale również łączy do oryginalnego kodu Matlab.
Czy są jakieś wady robienia tego w ten sposób?
zdaję sobie sprawę, że to pytanie pojawiło się w bieżącym widoku, ponieważ @Drazick zmodyfikował swoją odpowiedź na 2013 rok.
rand()
frand()
„biały szum” jest oczywiście mylący, nawet w przypadku sygnałów analogowych. „sygnał mocy” o płaskim spektrum aż do nieskończoności ma również nieskończoną moc. generowany zgodnie z opisem praktycznie gaussowski i „biały” sygnał ma skończoną moc (która jest wariancją i wynosi 1) oraz skończoną szerokość pasma, która, wyrażona jako jednostronna, jest metodą Nyquista. (więc „gęstość widmowa mocy” lub moc na częstotliwość jednostkową wynosi 1 / Nyquist). przeskaluj ją i wyrównaj w dowolny sposób.
sądzę, że mogę to później edytować i dodać pseudo-kod podobny do C, aby to wyraźnie pokazać.
Wytwarzanie białego szumu o pełnym spektrum, a następnie filtrowanie go to tak, jakbyś chciał pomalować ścianę swojego domu na biało, więc decydujesz się pomalować cały dom na biało, a następnie pomalować cały dom z wyjątkiem ściany. Jest idiotyczny. (Ale ma sens w elektronice).
Zrobiłem mały program C, który może generować biały szum przy dowolnej częstotliwości i dowolnej szerokości pasma (powiedzmy przy częstotliwości środkowej 16 kHz i „szerokości” 2 kHz). Nie wymaga filtrowania.
To, co zrobiłem, jest proste: w głównej (nieskończonej) pętli generuję sinusoidę o częstotliwości środkowej +/- losową liczbę między -półną przepustowością a + połową szerokości pasma, następnie utrzymuję tę częstotliwość dla dowolnej liczby próbek (ziarnistość) i tego jest wynikiem:
Biały szum o szerokości 2 kHz przy częstotliwości środkowej 16 kHz
Pseudo kod:
while (true)
{
f = center frequency
r = random number between -half of bandwidth and + half of bandwidth
<secondary loop (for managing "granularity")>
for x = 0 to 8 (or 16 or 32....)
{
[generate sine Nth value at frequency f+r]
output = generated Nth value
}
}