MATLAB에서 대역 제한 가우시안 화이트 노이즈를 생성하는 방법?


16

일부 논문에서는 가산 노이즈가 대역 제한 가우시안 화이트라는 것을 읽었습니다.
MATLAB을 사용하여 이러한 유형의 노이즈를 어떻게 시뮬레이트 할 수 있습니까?


연속 시간 시스템에서 가우시안 여부에 상관없이 대역 제한 화이트 노이즈의 개념은 잘 정의되어 있으며 잘 이해되어 있습니다. 이산 시간 시스템의 경우 문제가 더 복잡하므로 대역 제한의 정의와 나이 퀴 스트 주파수와 비교하는 방법을 고려해야합니다.
Dilip Sarwate 2016 년

2
@DilipSarwate : "밴드 제한 화이트 노이즈"는 옥시 모론입니다. :-)
Peter K.

@PeterK. 대역 제한 화이트 노이즈의 개념은 통과 대역 외부의 노이즈 특성이 통과 대역 내에 있는 동안 통과 대역 외부 노이즈 특성과 관련이없는 대역 통과 시스템에서 주로 사용됩니다. 통과 대역입니다. 그것은 백색 잡음보다 더 이상 옥시 모론이 아닙니다 (대역 제한에 대한 어떠한 언급도없이). Jason R의 답변 (따라 동의하지 않음)에 따른 DRazick의 의견 (제자리에 있음)도 참조하십시오.
Dilip Sarwate 2018 년

1
@DilipSarwate : 설명해 주셔서 감사합니다. 나는 그것을 얻었지만 여전히 용어의 선택이 매우 좋지 않다고 생각합니다. 나에게 "대역 통과 필터링 된 백색 잡음"이 더 정확하지만 같은 위치에 있다고 가정합니다.
Peter K.

1
@PeterK. 불행히도, "대역 통과 필터링 된 백색 잡음"은 일반적으로 JasonR의 답변에 설명 된 프로세스를 의미합니다. 백색 노이즈로 시작하고 전달 함수 가 있는 필터를 통해 필터를 필터링 하여 | H ( f ) | 2 . 대역 제한 화이트 노이즈는 H ( f )이상적인 대역 통과 필터 의 전달 함수 여야 한다는 점을 제외하고는 동일 합니다 . 백색 잡음의 요점은 신호가 대역에 머 무르도록 제한되어있는 한 대역 제한 백색 잡음에 적용되는 잡음이없는 곳에 신호를 넣을 수 없다는 것입니다.H(f)|H(f)|2H(f)
Dilip Sarwate

답변:


19

먼저 백색 잡음을 생성 한 다음 원하는 대역폭으로 필터링하여 대역 제한 가우시안 잡음을 생성합니다. 예로서:

% 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);

나는 항상 이것을 궁금해했지만, 이와 같은 일이 끝나면 더 이상 가우시안은 무엇입니까? 나는 PDF가이 시점에서 전혀 생각하지 않습니다 ...
Spacey

8
가우스 랜덤 변수의 특별한 기능 중 하나는 두 개의 독립적 가우스 RV의 합이 가우시안 분포라는 것입니다. 입력 노이즈가 흰색이므로 필터 출력에서 ​​각 샘플을 여러 독립 가우스 랜덤 변수의 합으로 볼 수 있습니다 (각 RV의 분산은 입력 노이즈 분산 및 해당 필터 탭의 값에 따라 달라짐). 따라서 필터 출력의 샘플도 가우시안 분포됩니다. 그러나 필터 출력에서 ​​연속적인 샘플간에 상관 관계가 있으므로 노이즈는 더 이상 흰색이 아닙니다.
Jason R

이 속성은 Wikipedia에 자세히 설명되어 있습니다 . 입력 노이즈에 색상이 지정되어 있어도 속성은 계속 유지됩니다 ( "상관 된 임의 변수"섹션 참조).
Jason R

1
facepalm . 물론이야.
Spacey

3
그러나이 방법은 화이트 노이즈를 생성하지 않습니다. 필터를 적용 할 필요가 없습니다. 모든 개별 샘플링 노이즈는 대역 제한으로 시작합니다.
Royi 2016 년

9

Jason의 대답에 작은 추가와 마찬가지로 일반적으로 주어진 분산 대역 제한 노이즈를 생성해야합니다 . Jason의 답변에 제공된 코드에이 코드를 추가 할 수 있습니다.σ2

var = 3.0;  % just an example  
scale = sqrt(var)/std(nb);
nb = scale*nb;  % nb has variance 'var'

일반적으로 필터는 노이즈 분산을 변경하므로 필터링 후 스케일링을 수행해야합니다.


2
n=0N|h[n]|2=1

@ 매트 니스 추가!
Spacey

4

때마다 당신이 (MATLAB의 사용 이산 노이즈 샘플 생성 randn/를 rand예를 들어)는 실제로 소음 제한 밴드를 생성합니다.

불연속 샘플의 분산을 해당 샘플에서 가져온 "연속적인"노이즈의 분산으로 조정하기 만하면됩니다.

σcn2δ(t)fsfsσcn2.

This result is valid assuming before sampling the continuous noise you applied an ideal LPF filter with bandwidth of fs/2.

Full description is given here - How to Simulate AWGN (Additive White Gaussian Noise) in Communication Systems for Specific Bandwidth.



2

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?


1
looking at the original matlab code, it works for a block size of n, your fft length. If I want 2n samples, you can double the fft length, which is more than doing 2 ffts. if you do 2 separate blocks, there will be a discontinuous transition from the first to the second block. you could use a window to smooth out the transition, but then you need to do more than 2 blocks to avoid scalloping your time series. Using the filter method, once the filter is in steady state, you can feed it random numbers as long as you want. The processing increase for the filter method scales linearly.

0

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 x (say using rand() or frand(), if it's a good version) that ranges from 0 to 1 (that is 0x<1), 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.


-1

Producing full spectrum white noise and then filtering it is like you want to paint a wall of your house white, so you decide to paint the whole house white and then paint back all house except the wall. Is idiotic. (But has sense in electronics).

I made a small C program that can generate white noise at any frequency and any bandwidth (let's say at 16kHz central frequency and 2 kHz "wide"). No filtering involved.

What I did is simple: inside the main (infinite) loop I generate a sinusoid at center frequency +/- a random number between -half bandwidth and +halfbandwidth, then I keep that frequency for an arbitrary number of samples (granularity) and this is the result:

White noise 2kHz wide at 16kHz center frequency

White noise 2kHz wide at 16kHz center frequency

Pseudo code:

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
    }


}

1
The STFT isn’t flat across the band. You have not shown why there is any advantage to your technique. Btw most paint is stocked as a grayish white and then mixed with pigment. Orange paint isn’t made by just using orange ingredients. There isn’t any extra work in generating white noise.

@StanleyPawlukiewicz In electronics you are righe because a noise generator and a filter are two very simple "objects". In programming, a filter is complex in number of instructions way more than just generating the needed data. So when programming is preferable my approach if you have time critical applications. If you downvoted I suggest you to think again about it.
Zibri

1
your noise isn’t preferable. the spectrum isn’t flat across the band. calling a transcendental function on the fly isn’t faster than filtering. your arguments are unsubstantiated

1
Actually the inband ripple is a design parameter. To say they peak at the center frequency is also false

1
since your technique so easy to modify, why don’t you write your own sine wave routine instead of linking to one and claiming that your code is less complex and compare that to a biquad. while you are add it, how about a fixed point version. you might also think about how your technique scales as you increase the number of samples
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.