Jakie są algorytmy generowania dobrego pseudolosowego przybliżenia do szumu (różowego), ale odpowiednie do implementacji przy niskich kosztach obliczeniowych na całkowitym DSP?
Jakie są algorytmy generowania dobrego pseudolosowego przybliżenia do szumu (różowego), ale odpowiednie do implementacji przy niskich kosztach obliczeniowych na całkowitym DSP?
Odpowiedzi:
Istnieje kilka. Ta strona ma rozsądną (ale prawdopodobnie starą) listę:
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.
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:
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:
gdzie
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.
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.
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.