Jak generować pasmowy biały szum gaussowski w MATLAB?
16
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 systemach o ciągłym czasie koncepcja ograniczonego pasmowo białego szumu, niezależnie od tego, czy jest Gaussa, czy nie, jest dobrze zdefiniowana i dobrze zrozumiana. W przypadku systemów z czasem dyskretnym problem jest bardziej skomplikowany i należy zastanowić się, jakie jest ograniczenie pasma i jak porównuje się ono z częstotliwością Nyquista.
Dilip Sarwate
2
@DilipSarwate: Dla mnie „biały szum ograniczony przez pasmo” to oksymoron! :-)
Peter K.
@PeterK. Pojęcie ograniczonego pasma białego szumu jest stosowane przede wszystkim w systemach pasmowoprzepustowych, w których charakterystyka hałasu poza pasmem pasmowym jest nieistotna, podczas gdy w paśmie pasmowym szum jest nie do odróżnienia od szumu białego, który został przepuszczony przez idealny filtr pasmowoprzepustowy, który przechodzi dokładnie w paśmie częstotliwości, które jest pasmem pasmowym. To nie jest bardziej oksymoron niż biały szum (bez żadnych pejoratywnych komentarzy na temat ograniczeń pasma). Zobacz także komentarz DRazicka (który jest natychmiastowy) po odpowiedzi Jasona R (z którą się nie zgadzam).
Dilip Sarwate
1
@DilipSarwate: Dzięki za wyjaśnienie. Rozumiem, ale nadal uważam, że to bardzo zły wybór terminologii. Dla mnie „filtrowany biały szum pasmowo” jest dokładniejszy, ale przypuszczam, że kończy się w tym samym miejscu.
Peter K.
1
@PeterK. Niestety, „biały szum filtrowany w paśmie” ogólnie oznacza proces opisany w odpowiedzi JasonR. Zacznij od białego szumu i przefiltruj go przez filtr z funkcją transferu aby uzyskać proces z PSD proporcjonalnym do . Szum biały ograniczony przez pasmo jest taki sam, z tym wyjątkiem, że upieramy się, że musi być funkcją przenoszenia idealnego filtra pasmowoprzepustowego. Kluczową kwestią w przypadku białego szumu jest to, że nie możemy umieścić sygnału w miejscu, w którym szum ten dotyczy również szumu białego o ograniczonym paśmie, o ile jesteśmy zmuszeni do utrzymywania naszych sygnałów w paśmie. | H ( f ) | 2 H ( f )H(f)|H(f)|2H(f)
Dilip Sarwate
Odpowiedzi:
19
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);
Zawsze się nad tym zastanawiałem, ale jeśli coś takiego zostanie zrobione, to co w tym takiego Gaussa? Nie sądzę, żeby plik PDF był w tym momencie ...
Spacey,
8
Jedną ze szczególnych cech losowych zmiennych Gaussa jest to, że suma dwóch niezależnych RV Gaussa jest również rozkładem Gaussa. Ponieważ szum wejściowy jest biały, można spojrzeć na każdą próbkę na wyjściu filtra jako sumę wielu niezależnych losowych zmiennych Gaussa (gdzie wariancja każdego RV zależy od wariancji wejściowego szumu i wartości odpowiedniego odczepu filtra). Dlatego próbki na wyjściu filtra są również rozkładem Gaussa. Jednak hałas oczywiście nie jest już biały, ponieważ istnieje korelacja między kolejnymi próbkami na wyjściu filtra.
Jason R
Ta właściwość jest opisana bardziej szczegółowo na Wikipedii . Należy zauważyć, że właściwość nadal obowiązuje, nawet jeśli szum wejściowy jest kolorowy (patrz sekcja „Skorelowane zmienne losowe”).
Jason R
1
facepalm . Oczywiście.
Spacey,
3
Jednak ta metoda nie generuje białego szumu. Nie ma potrzeby stosowania filtra, każdy dyskretny próbkowany hałas jest ograniczony na początek pasmem.
Royi
9
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:σ2)
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.
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.
patrząc na oryginalny kod matlab, działa dla rozmiaru bloku n, twojej długości fft. Jeśli chcę próbek 2n, możesz podwoić długość fft, co jest więcej niż zrobienie 2 fft. jeśli zrobisz 2 oddzielne bloki, nastąpi nieciągłe przejście z pierwszego do drugiego bloku. możesz użyć okna, aby wygładzić przejście, ale musisz zrobić więcej niż 2 bloki, aby uniknąć przegięcia szeregów czasowych. Używając metody filtrowania, gdy filtr jest w stanie ustalonym, możesz podawać mu losowe liczby tak długo, jak chcesz. Wzrost przetwarzania dla metody filtrowania jest skalowany liniowo.
0
zdaję sobie sprawę, że to pytanie pojawiło się w bieżącym widoku, ponieważ @Drazick zmodyfikował swoją odpowiedź na 2013 rok.
xrand()frand()0 ≤ x < 1
„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
}
}
STFT nie jest płaski w całym paśmie. Nie pokazałeś, dlaczego twoja technika ma jakąkolwiek przewagę. Btw większość farby jest magazynowana jako szaro-biała, a następnie mieszana z pigmentem. Pomarańczowa farba nie powstaje z samych składników. Nie ma żadnej dodatkowej pracy w generowaniu białego szumu.
@StanleyPawlukiewicz W elektronice jesteś sztywny, ponieważ generator szumów i filtr to dwa bardzo proste „obiekty”. W programowaniu filtr ma złożoną liczbę instrukcji znacznie więcej niż tylko generowanie potrzebnych danych. Więc kiedy programowanie jest preferowane, moje podejście jest ważne, jeśli masz aplikacje krytyczne czasowo. Jeśli przegłosowałeś, sugeruję, abyś ponownie się nad tym zastanowił.
Zibri,
1
twój hałas nie jest lepszy. spektrum nie jest płaskie w całym paśmie. wywołanie funkcji transcendentalnej w locie nie jest szybsze niż filtrowanie. twoje argumenty są bezpodstawne
1
W rzeczywistości tętnienie w paśmie jest parametrem projektowym.
1
skoro twoja technika jest tak łatwa do modyfikacji, to dlaczego nie piszesz własnej procedury sinusoidalnej zamiast łączyć się z jedną i twierdzić, że twój kod jest mniej złożony i porównywać go do biquada. podczas dodawania, co powiesz na wersję z punktem stałym. możesz również pomyśleć o tym, jak Twoja technika skaluje się, gdy zwiększasz liczbę próbek
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:
źródło
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:σ2)
Pamiętaj, że skalowanie należy wykonać po filtrowaniu, ponieważ ogólnie filtr zmienia wariancję szumu.
źródło
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 .
źródło
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?
źródło
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ć.
źródło
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:
źródło