(pembe) gürültüye iyi bir sözde rastgele yaklaşım oluşturmak için , ancak bir tamsayı DSP'de düşük hesaplama maliyetiyle uygulama için uygun olan bazı algoritmalar nelerdir ?
(pembe) gürültüye iyi bir sözde rastgele yaklaşım oluşturmak için , ancak bir tamsayı DSP'de düşük hesaplama maliyetiyle uygulama için uygun olan bazı algoritmalar nelerdir ?
Yanıtlar:
Bir kaç tane var. Bu sitenin makul (ancak muhtemelen eski) bir listesi var:
Doğrusal Filtreleme
Peter'ın cevabındaki ilk yaklaşım (yani beyaz gürültüyü filtrelemek) çok basit bir yaklaşımdır. Gelen Spektral ses Sinyal İşleme , JOS üretmek için kullanılabilecek bir düşük dereceden filtre veren iyi bir yaklaşım , bir birlikte, analiz elde edilen güç spektrumu yoğunluk ideal bir eşleşen ne kadar iyi. Doğrusal filtreleme her zaman yaklaşık bir değer verir, ancak bu pratikte önemli olmayabilir. JOS'u yorumlamak için:
Beyaz gürültüden pembe gürültü üretebilecek kesin (rasyonel, sonlu sipariş) filtre yoktur. Bunun nedeni filtrenin ideal genlik yanıtının irrasyonel fonksiyon ile orantılı olması gerektiğidir , burada Hz cinsinden frekansı gösterir. Bununla birlikte, algısal olarak kesin de dahil olmak üzere, istenen herhangi bir yaklaşık dereceye kadar pembe gürültü üretmek yeterince kolaydır. f
Verdiği filtrenin katsayıları aşağıdaki gibidir:
B = [0.049922035, -0.095993537, 0.050612699, -0.004408786];
A = [1, -2.494956002, 2.017265875, -0.522189400];
MATLAB filtre işlevine parametre olarak biçimlendirildiklerinden , netlik sağlamak için aşağıdaki aktarım işlevine karşılık gelirler:
Açıkçası, katsayıların tam hassasiyetini pratikte kullanmak daha iyidir. Bu filtreyi kullanarak üretilen pembe gürültünün nasıl göründüğüne bir bağlantı:
Sabit nokta uygulaması için, [-1,1) aralığındaki katsayılarla çalışmak genellikle daha uygun olduğu için, transfer fonksiyonunun bir miktar yeniden işlenmesi uygun olacaktır. Genel olarak, öneri işleri ikinci dereceden bölümlere ayırmaktır , ancak bunun nedeninin bir kısmı (birinci dereceden bölümleri kullanmanın aksine), kökler karmaşık olduğunda gerçek katsayılarla çalışmanın rahatlığı içindir. Bu özel filtre için, tüm kökler gerçektir ve daha sonra ikinci dereceden bölümlere birleştirmek muhtemelen hala bazı payda katsayıları> 1 verir, bu nedenle aşağıdaki gibi üç birinci dereceden bölüm makul bir seçimdir:
nerede
bir 1 = 0,99516897 , bir 2 = 0.94384177 , bir 3 = 0.55594526
Taşmalarını önlemek için bu bölümler için bazı makul sıralama seçenekleri ve her bölüm için bazı kazanç faktörleri seçimi gerekecektir. Peter'ın cevabındaki bağlantıda verilen diğer filtreleri denemedim , ancak benzer düşünceler muhtemelen geçerli olacaktır.
Beyaz Gürültü
Açıkça görülüyor ki, filtreleme yaklaşımı ilk etapta birörnek rasgele sayılar kaynağı gerektirir. Belirli bir platform için bir kütüphane rutini mevcut değilse, en basit yaklaşımlardan biri doğrusal bir uyumlu jeneratör kullanmaktır . Etkin bir sabit nokta uygulamasına bir örnek TI tarafından TMS320C5x (pdf) üzerinde Rastgele Sayı Üretimi'nde verilmiştir . Diğer çeşitli yöntemlerin detaylı teorik tartışması, James Gentle tarafından Random Number Generation ve Monte Carlo Method'larında bulunabilir.
kaynaklar
Peter'ın cevabındaki aşağıdaki bağlantılara dayanan çeşitli kaynaklar vurgulamaya değer.
Filtre temelli ilk kod grubu Orfanidis tarafından Sinyal İşlemeye Giriş . Tam metin bu linkte mevcuttur ve [Ek B'de] hem pembe hem de beyaz gürültü oluşumunu kapsamaktadır. Yorumda belirtildiği gibi, Orfanidis çoğunlukla Voss algoritmasını kapsar.
Voss-McCartney Pembe Gürültü Üreticisi Tarafından Üretilen Spektrum . Sayfanın altına doğru, Voss algoritmasının varyantları hakkında kapsamlı bir tartışmadan sonra, bu bağlantıya dev pembe harflerle referans verilir . Önceki ASCII diyagramlarından bazılarından daha kolay okuma.
Wentian Li tarafından hazırlanan 1 / f Gürültü hakkında bir Kaynakça . Buna hem Peter'ın kaynağında hem de JOS tarafından atıfta bulunulur. Genel olarak 1 / f gürültüsü üzerinde 1918'e kadar uzanan baş döndürücü bir referansa sahiptir.
1990'dan beri Corsini ve Saletti'nin algoritmasını kullanıyorum: G. Corsini, R. Saletti, "A 1 / f ^ gama Güç Spektrumu Gürültü Dizisi Üreteci", IEEE Enstrümantasyon ve Ölçüm İşlemleri, 37 (4), Aralık, 1988, 615 -619. Gama üssü -2 ile +2 arasındadır. Benim amacım için iyi çalışıyor. Ed
Bu ekran görüntüsü ekleme girişimi işe yararsa, aşağıdaki şekil Corsini ve Saletti algoritmasının ne kadar iyi performans gösterdiğine dair bir örnek göstermektedir (en azından 1990'da programladığım gibi). Örnekleme frekansı 1 kHz, gama = 1 ve 1000 32k FFT PSD'lerin ortalaması alınmıştır.
Bu Corsini ve Saletti (C&S) gürültü jeneratörü önceki yazı kadar takip eder. Sonraki iki şekil, C&S jeneratörünün düşük frekanslı (gama> 0) ve yüksek frekanslı (gama <0) gürültüleri açısından ne kadar iyi performans gösterdiğini göstermektedir. Üçüncü şekil, C&S jeneratörünün 1 / f gürültü PSD'lerini (ilk gönderimle aynı) ve Prof. Orfanidis'in mükemmel kitabında verilen Örnek B.9 1 / f jeneratörünü karşılaştırır (eqn B.29, s. 736). Bu PSD'lerin tümü ortalama 1000 32k FFT PSD'dir. Hepsi tek taraflı ve kötü niyetli. C&S PSD'ler için 3 kutup / on yıl kullandım ve 4 yıl (0,05 ila 500 Hz) istenen kullanılabilir aralık olarak belirledim. Böylece C&S jeneratörü n = 12 kutuplu ve sıfır çiftine sahipti. Örnekleme frekansı 1 kHz, Nyquist 500 Hz ve çözünürlük elemanı 0.0305 Hz'in biraz üzerindeydi. Ed V