Bazı makalelerde, katkı gürültüsünün bantla sınırlı Gauss beyazı olduğunu okudum.
MATLAB bu tür gürültü kullanımını nasıl simüle edebilirim?
Bazı makalelerde, katkı gürültüsünün bantla sınırlı Gauss beyazı olduğunu okudum.
MATLAB bu tür gürültü kullanımını nasıl simüle edebilirim?
Yanıtlar:
Önce beyaz gürültü üretip sonra istediğiniz bant genişliğine göre filtreleyerek sınırsız Gauss gürültüsü elde edersiniz. Örnek olarak:
% 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);
Jason'ın cevabına küçük bir eklenti olarak: genellikle verilen bir varyans ile band sınırında gürültü üretmeniz gerekir . Bu kodu Jason'ın cevabında verilen koda ekleyebilirsiniz:
var = 3.0; % just an example
scale = sqrt(var)/std(nb);
nb = scale*nb; % nb has variance 'var'
Filtreleme işleminden sonra ölçeklendirmeyi yapmanız gerektiğini unutmayın, çünkü genel olarak filtre gürültü varyansını değiştirir.
Ayrık gürültü örnekleri (MATLAB'leri randn
/ rand
örneğin kullanarak ) her oluşturduğunuzda bant sınırlı gürültü üretirsiniz.
Tek yapmanız gereken, ayrı örneklerin varyansının, bu örneklerin alındığı iddia edilen "Sürekli" gürültünün varyansına ayarlanmasıdır.
Tam açıklama burada verilmiştir - Spesifik Bant Genişliği için İletişim Sistemlerinde AWGN (Katkı Beyaz Gauss Gürültüsü) Simülasyonu .
Neden kimse bahsedilen yaklaşım kullanamıyorum bu yazı ?
İstenen frekanslarla başlar ve filtreleme yerine sinyali oluşturmak için geriye doğru çalışır. Python kodu kullanır, ancak orijinal Matlab koduna da bağlanır.
Bu şekilde yapmanın herhangi bir dezavantajı var mı?
@Drazick 2013 cevabını değiştirdiği için bu sorunun şu anki görünümünde ortaya çıktığını anlıyorum.
rand()
frand()
"beyaz gürültü" elbette analog sinyaller için bile yanlış bir isimdir. sonsuzluğa kadar düz spektrumlu bir "güç sinyali" de sonsuz güce sahiptir. açıklandığı gibi üretilen neredeyse gauss ve "beyaz" sinyalin sonlu bir gücü (varyans ve 1'dir) ve tek taraflı olarak ifade edilen sonlu bant genişliği Nyquist'tir. (böylece 'güç spektral yoğunluğu' veya birim frekans başına güç 1 / Nyquist'tir.) ölçeklendirin ve istediğiniz gibi dengeleyin.
i daha sonra bu düzenlemek ve açıkça göstermek için bazı C benzeri sözde kod ekleyebilirsiniz.
Tam spektrumlu beyaz gürültü üretmek ve daha sonra filtrelemek, evinizin beyaz bir duvarını boyamak istediğiniz gibidir, böylece tüm evi beyaza boyamaya ve daha sonra duvar dışındaki tüm evleri boyamaya karar verirsiniz. Aptalca. (Ama elektronikte bir anlamı var).
Herhangi bir frekansta ve herhangi bir bant genişliğinde beyaz gürültü üretebilen küçük bir C programı yaptım (diyelim ki 16kHz merkezi frekans ve 2 kHz "geniş"). Filtreleme yok.
Yaptığım şey basit: ana (sonsuz) döngü içinde merkez frekansta bir sinüsoid üretiyorum +/- yarım bant genişliği ve + yarım bant genişliği arasında rastgele bir sayı, sonra bu frekansı rasgele sayıda örnek (taneciklik) için saklıyorum ve bu sonuç:
16kHz merkez frekansta 2kHz genişliğinde beyaz gürültü
Sahte 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
}
}