ในเอกสารบางเล่มฉันได้อ่านว่าเสียงรบกวนเพิ่มเติมนั้น จำกัด อยู่ที่สีขาวแบบเกาส์เซียน
ฉันจะจำลองเสียงประเภทนี้ใช้ MATLAB ได้อย่างไร
ในเอกสารบางเล่มฉันได้อ่านว่าเสียงรบกวนเพิ่มเติมนั้น จำกัด อยู่ที่สีขาวแบบเกาส์เซียน
ฉันจะจำลองเสียงประเภทนี้ใช้ MATLAB ได้อย่างไร
คำตอบ:
คุณจะสร้างเสียงเกาส์แบนด์แบบเกาส์ จำกัด โดยการสร้างเสียงสีขาวก่อนจากนั้นกรองให้แบนด์วิดท์ที่คุณต้องการ ตัวอย่างเช่น:
% 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);
. You can add this code to the code given in Jason's answer:
var = 3.0; % just an example
scale = sqrt(var)/std(nb);
nb = scale*nb; % nb has variance 'var'
โปรดทราบว่าคุณต้องทำการปรับขนาดหลังจากกรองเนื่องจากโดยทั่วไปตัวกรองจะเปลี่ยนความแปรปรวนของเสียงรบกวน
Every time you generate discrete noise samples (Using MATLAB's randn
/ rand
for instance) you actually generate a band limited noise.
All you need to do is the adjustment of the variance of the discrete samples to the variance of the "Continuous" noise those samples are allegedly taken from.
Given a continuous White Noise (Wide Sense) with variance and you want sample it at rate of you should generate discrete noise samples with variance of .
This result is valid assuming before sampling the continuous noise you applied an ideal LPF filter with bandwidth of .
Full description is given here - How to Simulate AWGN (Additive White Gaussian Noise) in Communication Systems for Specific Bandwidth.
Why can one not use the approach mentioned in this post?
It starts with the desired frequencies and works backwards to build the signal, instead of filtering. It uses python code, but also links to the original Matlab code.
Are there any drawbacks to doing it that way?
i realize this question popped up in current view because @Drazick modified his/her 2013 answer.
if you generate a good uniform p.d.f. pseudo-random number (say using rand()
or frand()
, if it's a good version) that ranges from 0 to 1 (that is ), then if you do that 12 times, add up all 12 of the supposedly independent and uncorrelated values, and subtract 6.0 from that sum, you will have something that is very close to a unit-variance and zero-mean gaussian random number. if the uniform p.d.f. pseudo-random numbers are "good" (that is they exhibit independence from each other), this sum will be as "white" as you can get a discrete-time signal to be.
"white noise" is, of course a misnomer, even for analog signals. a "power signal" with flat spectrum all the way to infinity also has infinite power. the virtually-gaussian and "white" signal generated as described has a finite power (which is the variance and is 1) and finite bandwidth which, expressed as one-sided, is Nyquist. (so the 'power spectral density" or power per unit frequency is 1/Nyquist.) scale it and offset it however you please.
i s'pose i can edit this later and add some C-like pseudo-code to show this explicitly.
ผลิตเสียงคลื่นความถี่สีขาวเต็มรูปแบบแล้วกรองเหมือนว่าคุณต้องการทาสีผนังบ้านสีขาวคุณจึงตัดสินใจทาสีบ้านทั้งหลังสีขาวแล้วทาสีบ้านทั้งหมดยกเว้นผนัง เป็นคนงี่เง่า (แต่มีความรู้สึกในอุปกรณ์อิเล็กทรอนิกส์)
ฉันสร้างโปรแกรม C ขนาดเล็กที่สามารถสร้างสัญญาณรบกวนสีขาวที่ความถี่ใด ๆ และแบนด์วิดธ์ใด ๆ (สมมติว่าที่ความถี่กลาง 16kHz และกว้าง 2 kHz ")" ไม่มีการกรองที่เกี่ยวข้อง
สิ่งที่ฉันทำนั้นง่าย: ภายในลูปหลัก (ไม่มีที่สิ้นสุด) ฉันสร้างไซน์ที่ความถี่กลาง +/- จำนวนสุ่มระหว่าง -half แบนด์วิดท์และ + ครึ่งแบนด์วิดท์จากนั้นฉันจะเก็บความถี่นั้นสำหรับจำนวนตัวอย่างโดยสุ่ม (granularity) และนี่ คือผลลัพธ์:
เสียงสีขาวกว้าง 2kHz ที่ความถี่กลาง 16kHz
รหัสหลอก:
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
}
}