Pseudolosowe generowanie szumu w kolorze różowym (


20

Jakie są algorytmy generowania dobrego pseudolosowego przybliżenia do szumu (różowego), ale odpowiednie do implementacji przy niskich kosztach obliczeniowych na całkowitym DSP?1/fa


Co powiesz na pamięć? Jeśli nie stanowi to problemu, ale obliczenia są, powiedzmy, że wykonaj losową fazę iDFT żądanej krzywej częstotliwości i zapisz ją jako stałą statyczną falowalną w twoim urządzeniu.
leftaroundabout

@leftaroundabout - A może pomnożenie DFT losowego białego szumu przez krzywą częstotliwości 1 / f, a następnie wykonanie IDFT ma lepszą charakterystykę losowości?
hotpaw2

1
Biały szum jest zasadniczo losową fazą iFT funkcji stałej, więc nie powinien mieć większego znaczenia.
leftaroundabout

Odpowiedzi:


11

6
Jeśli ta strona ulegnie awarii, twoja odpowiedź zniknie, jeśli przyniesiesz podstawy każdego rozwiązania, odpowiedź byłaby znacznie lepsza, wykorzystując stronę jako odniesienie.
Kortuk,

@Kortuk: Odpowiedzią jest wiki społeczności, więc możesz to zrobić samemu! Informacje tam powinny być wystarczające, aby wskazywać na inne odwołania do stron internetowych (takie jak odpowiedź datageist dla pierwszej opcji). Zgadzam się jednak, że więcej szczegółów byłoby dobrych.
Peter K.

20

Filtrowanie liniowe

Pierwsze podejście w odpowiedzi Piotra (tj. Filtrowanie białego szumu) jest bardzo proste. W Spectral Audio Signal Processing JOS daje filtr niskiego rzędu, którego można użyć do uzyskania przyzwoitego przybliżenia , wraz z analizą tego, jak dobrze uzyskana gęstość widmowa mocy pasuje do ideału. Filtrowanie liniowe zawsze da przybliżenie, ale w praktyce może to nie mieć znaczenia. Parafrazując JOS:

Nie ma dokładnego (racjonalnego, skończonego rzędu) filtra, który mógłby wytwarzać różowy szum z białego szumu. Jest tak, ponieważ idealna odpowiedź amplitudowa filtra musi być proporcjonalna do funkcji nieracjonalnej , gdziefoznacza częstotliwość w Hz. Jednak łatwo jest wygenerować różowy szum w dowolnym pożądanym stopniu przybliżenia, w tym percepcyjnie dokładnym.1/fafa

Współczynniki filtra, który podaje, są następujące:

B = [0.049922035, -0.095993537, 0.050612699, -0.004408786];
A = [1, -2.494956002, 2.017265875, -0.522189400];

Są one sformatowane jako parametry funkcji filtrującej MATLAB , więc dla zachowania przejrzystości odpowiadają one następującej funkcji przesyłania:

H.(z)=.041-.096z-1+.051z-2)-.004z-3)1-2,495z-1+2.017z-2)-.522z-3)

Oczywiście lepiej jest w praktyce wykorzystać pełną precyzję współczynników. Oto link do tego, jak brzmi różowy szum generowany przy użyciu tego filtra:

W przypadku implementacji w punkcie stałym, ponieważ zwykle wygodniej jest pracować ze współczynnikami z zakresu [-1,1), należy nieco przerobić funkcję przenoszenia. Zasadniczo zaleca się dzielenie rzeczy na sekcje drugiego rzędu , ale część tego powodu (w przeciwieństwie do korzystania z sekcji pierwszego rzędu) to wygoda pracy z rzeczywistymi współczynnikami, gdy korzenie są złożone. W przypadku tego konkretnego filtra wszystkie pierwiastki są prawdziwe, a połączenie ich w sekcje drugiego rzędu prawdopodobnie nadal dawałoby pewne współczynniki mianownika> 1, więc trzy sekcje pierwszego rzędu są rozsądnym wyborem, jak następuje:

H.(z)=1-b1z-11-za1z-1 1-b2)z-11-za2)z-1 1-b3)z-11-za3)z-1

gdzie

b1=0,98223157, b2)=0,83265661, b3)=0,10798089
za1=0,99516897, za2)=0,94384177, za3)=0,55594526

Konieczny będzie pewien rozsądny wybór sekwencjonowania dla tych sekcji, w połączeniu z pewnym wyborem współczynników wzmocnienia dla każdej sekcji, aby zapobiec przepełnieniu. Nie wypróbowałem żadnego z innych filtrów podanych w linku w odpowiedzi Piotra , ale prawdopodobnie miałyby zastosowanie podobne rozważania.

Biały szum

Oczywiście podejście filtrujące wymaga przede wszystkim źródła jednolitych liczb losowych. Jeśli procedura biblioteczna nie jest dostępna dla danej platformy, jednym z najprostszych podejść jest użycie liniowego generatora kongruencjalnego . Jeden przykład wydajnej implementacji w punkcie stałym jest podany przez TI w generowaniu liczb losowych na TMS320C5x (pdf) . Szczegółowe omówienie teoretyczne różnych innych metod można znaleźć w James Randle w Generowaniu liczb losowych i Metodach Monte Carlo .

Zasoby

Warto wyróżnić kilka źródeł opartych na poniższych linkach w odpowiedzi Piotra.

  • Pierwszy oparty na filtrze fragment odniesień do kodu Wprowadzenie do przetwarzania sygnałów przez Orfanidis. Pełny tekst jest dostępny pod tym linkiem i [w załączniku B] obejmuje zarówno generowanie szumu różowego, jak i białego. Jak wspomniano w komentarzu, Orfanidis obejmuje głównie algorytm Vossa.

  • Spektrum wytwarzane przez generator szumów Voss-McCartney Pink . W dolnej części strony, po obszernej dyskusji na temat wariantów algorytmu Vossa, ten link jest oznaczony wielkimi różowymi literami . Jest o wiele łatwiejszy do odczytania niż niektóre poprzednie diagramy ASCII.

  • Bibliograf o hałasie 1 / f autorstwa Wentiana Li. Odnosi się to zarówno do źródła Petera, jak i do JOS. Ma oszałamiającą liczbę odniesień do szumu 1 / f w ogóle, sięgających aż do 1918 roku.


Masz pojęcie, jak wymyślił te współczynniki filtra? Myślę, że to po prostu nieliniowe dopasowanie do pożądanego nachylenia, ale byłbym bardzo zainteresowany, aby wiedzieć, czy istnieje bardziej szczegółowy algorytm.
nibot

Moim najlepszym przypuszczeniem będzie jedna z technik aproksymacyjnych wymienionych w jego pracy magisterskiej . Tak czy inaczej, jest to świetna lektura.
Datageist

Wow, to niezły dokument! Dzięki za link.
nibot

1
Problem z metodą filtrowania białego szumu polega na tym, że nie uzyskuje się takich samych zależności fazowych wielkości jak w przypadku autokorelowanych szeregów czasowych. Dlatego jeśli próbujesz naśladować naturalne procesy, nie powinieneś generować białego szumu i go filtrować. Powinieneś stworzyć szum automatycznie skorelowany jako szereg czasowy, tj. Aktualna wartość zależy od poprzedniej wartości + szum. Zobacz w statystykach procesy „AR”. Możesz to przetestować, generując hałas przy użyciu obu metod, a następnie FFT i wykreślając rzeczywiste kontra urojone (płaszczyzna złożona dziedziny częstotliwości). Zauważysz dużą różnicę we wzorze
Paul S

Cześć Paul, witamy w DSP.SE. Jeśli zależy ci tylko na tym, jak hałas brzmi (na przykład w dźwięku), spektrum wielkości jest najważniejsze. Byłoby wspaniale, gdybyś mógł szczegółowo opisać swoje myśli w nowej odpowiedzi. Nie sądzę, abyśmy mieli jeszcze na stronie coś opisującego tę technikę.
Datageist

1

Używam algorytmu Corsiniego i Salettiego od 1990 roku: G. Corsini, R. Saletti, „Generator sekwencji szumów spektrum mocy 1 / f ^ gamma”, IEEE Transactions on Instrumentation and Measurement, 37 (4), grudzień 1988, 615 -619. Wykładnik gamma wynosi od -2 do +2. Działa dobrze dla moich celów. Ed

Jeśli ta próba dodania zrzutu ekranu działa, poniższy rysunek pokazuje przykład, jak dobrze działa algorytm Corsini i Saletti (przynajmniej tak, jak zaprogramowałem go w 1990 roku). Częstotliwość próbkowania wynosiła 1 kHz, gamma = 1, a 1000 PSD FFT 32k uśredniono.

PSD dla szumu 1 / f za pomocą algorytmu Corsini i Saletti


Jest to kontynuacja mojego poprzedniego postu na temat generatora hałasu Corsini i Saletti (C&S). Następne dwie liczby pokazują, jak dobrze generuje się generator C&S pod względem generowania szumów o niskiej częstotliwości (gamma> 0) i wysokiej częstotliwości (gamma <0). Trzecia rycina porównuje PSD szumu 1 / f generatora C&S (tak samo jak mój pierwszy post) i przykładowy generator B.9 1 / f podany w doskonałej książce prof. Orfanidisa (równ. B.29, s. 736). Wszystkie te PSD to średnio 1000 32k PSD FFT. Wszystkie są jednostronne i odejmowane od średniej. Dla PSD C&S zastosowałem 3 bieguny / dekadę i określiłem 4 dekady (od 0,05 do 500 Hz) jako pożądany zakres użytkowy. Tak więc generator C&S miał pary n = 12 biegunów i zero. Częstotliwość próbkowania wynosiła 1 kHz, Nyquist wynosiła 500 Hz, a element rozdzielczości wynosił nieco ponad 0,0305 Hz. Ed V. PSD niskiej częstotliwości PSD o wysokiej częstotliwości Porównanie 2 generatorów hałasu 1 / f

fado10faM.fadofaM.

zaja=mixp[-2)π10(ja-N.)/h-γ/2)h-do]
bja=mixp[-2)π10(ja-N.)/h-do]
faM.=0,5fado


1
Corsini i Saletti stwierdzają: „Ten filtr składa się z N kaskadowych sekcji pierwszego rzędu, każda z prawdziwą parą biegun-zero”, a N biegunów jest „równomiernie rozmieszczonych w odniesieniu do logarytmu częstotliwości z gęstością h biegunów na dekadę częstotliwości (p / d), a N zer następuje odpowiednio. ” Sekcja dyskusji tego artykułu została wyjątkowo ładnie wykonana, więc nie było problemu z zaprogramowaniem tego, co powiedzieli. Wszystko, co mam, to moja stara papierowa kopia i zeskanowana jej kopia. Dla PSD powyżej użyłem 3 biegunów / dekadę, a PSD jest odejmowane od średniej i jednostronne. Ed V
Ed V
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.