Additive White Gaussian Noise
White gaussian noise란? Gaussian noise is noise that has a probability density function (abbreviated pdf) of the normal distribution (also known as Gaussian distribution). In other words, the values that the noise can take on are Gaussian-distributed. It is most commonly used as additive white noise to yield additive white Gaussian noise (AWGN). White noise란 말은 전 주파수 대역에 고르게 분포된 잡음을 말하며, gaussian 확률함수로 모델링되어 주로 AWGN에 적용된다.
White gaussian noise 잡음은 원하지 않는 신호이지만, 신호처리 알고리즘을 실험하는 과정에서 실제 잡음 상황을 만들기 위하여 잡음 신호를 생성할 필요가 있다. Random process {Xn}이 다음과 같은 조건을 만족할 때 white process라 부른다 White process는 시간적으로 다른 시점에서 발생한 샘플 값들이 통계적으로 uncorrelate되어 있다. 평균이 0인 white process의 경우 autocorrelation sequence는 다음과 같이 주어진다.
White gaussian noise White process의 probability density function(PDF)이 다음과 같은 가우시안 PDF를 가질 경우, 이를 백색 가우시안 프로세스(white gaussian process) 또는 백색 가우시안 잡음(white gaussian noise, WGN)이라고 부른다. 가우시안 프로세스는 다음의 Central limit theorem을 이용하여 생성할 수 있다.
White gaussian noise 위의 정리를 이용하여 WGN를 생성할 수 있다. 위의 정리에서 독립 random variable은 비교적 생성하기 쉬운 uniform PDF을 가지는 process를 생성해서 사용한다. 위의 uniform PDF을 가지는 random process의 분산은 1/12임을 적분을 통하여 얻을 수 있다. 만약 uniform PDF를 가지는 random process가 white process라면 이를 이용하여 생성되는 가우시안 프로세스도 white process가 된다. uniform PDF을 가지는 white process는 다음의 난수 생성을 통하여 얻을 수 있다. 아래 식에서 %은 modular 연산을 뜻하며 아래의 방식은 linear congruential sequence를 얻는 remainder 알고리즘의 일종이다. 여기서 생성된 난수는 0과 M 사이에 있기 때문에 이를 M으로 나누면 0과 1 사이의 uniform PDF을 가지는 sequence를 얻을 수 있다
C언어에서의 AWGN함수 구현 알고리즘을 순서 1) remainder 알고리즘을 이용하여0과 1사이의 난수를 생성한다(C언어의 stdlib.h 안 에 있는 rand()함수도 사용 가능) 2) 생성된 난수 12개를 더한다 3) 이렇게 더해진 sequence의 평균은 6이므로 평균을 0으로 만들기 위해 6을 뺀다 최종적으로 얻어진 sequence의 평균은 0, 분산이 1인 WGN가 된다.
C언어 소스 코드 #include <math.h> #include <stdio.h> #define J 2045L #define SHIFT 20 // 생략가능 #define MM 1048576 /*(0x01L<<SHIFT)= 1048576*/ #define SEED 78923 static void WGN(float *x,float s_deviation,int len); void main() { int i; float sum=0; float mean=0; // 평균값 float variance=0; // 분산값 int b; float a[9999]; // 10000개의샘플을받음 WGN(a,1,10000); // 10000개의Gaussian noise sample 생성 for(i=0;i<9999;i++) sum=sum+a[i]; // 10000개샘플의총합(=sum) }
C언어 소스 코드 mean=sum/10000; // mean=> sum의평균값 for(i=0;i<9999;i++) { variance=variance+(a[i]-mean)*(a[i]-mean); } variance=variance/10000; // 분산을구하는식 printf("mean = %f \n variance = %f",mean,variance); // 평균과분산을출력 static void WGN(float *x,float s_deviation,int len) short i,j; static long seed=SEED; float sum;
C언어 소스 코드 for(j=0;j<len;j++) { sum=0; for(i=0;i<12;i++) //분산이 1/12인 process를 12번 더해서 분산을 1로 만듬 { seed=(seed*J+1L)%MM; //seed 대신0에서1까지의 rand() 함수사용가능 sum=sum+(float)seed; } sum/=(float)MM; sum=sum-6; sum*=s_deviation; x[j]=sum;
실행 결과 Visual studio 2008에서의 실행결과
C언어 소스 코드 또 다른 알고리즘으로는 box-muller 방식이 있으며, 이 방식을 사용해도 동일한 결과를 얻을 수 있다. double gaussian() { static int ready = 0; static double gstore; double v1, v2, r, fac, gaus; double uniform(); if(ready == 0) do { v1 = 2.*uniform(); v2 = 2.*uniform(); r= v1*v1 + v2*v2; } while(r > 1.0); fac = sqrt (-2.*log(r)/r); gstore = v1*fac; gaus = v2*fac; ready = 1; } else
C언어 소스 코드 return(gaus); } double uniform() { return( (double)(rand() & RAND_MAX) / RAND_MAX - 0.5);
MATLAB에서의 AWGN MATLAB에서는 기본적으로 AWGN 함수들을 제공한다. 사용 예는 다음과 같다
MATLAB에서의 AWGN 실행 결과(randn 함수)
wdn 함수의 사용(평균과 분산)
randn 함수의 사용(평균과 분산)