Генерация гауссовского шума бывает необходима для задач моделирования и генерации случайных чисел в различных приложениях. И для этих целей полезно иметь универсальную и удобную функцию.
Представленная функция, написанная на языке C, генерирует сэмпл аддитивного белого гауссовского шума при каждом вызове. Ее красота заключается в простоте. Созданный сэмпл будет иметь нулевое среднее и стандартное отклонение, равное 1. Тем не менее, программист может масштабировать выходные сэмплы, изменяя стандартное отклонение для генерации различных профилей шума. Для того, чтобы осуществить такое масштабирование достаточно просто умножить сэмпл на выбранное стандартное отклонение.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.1415926536
double AWGN_generator()
{/* Генерация аддитивного белого гауссовского шума с нулевым средним и стандартным отклонением, равным 1. */
double temp1;
double temp2;
double result;
int p;
p = 1;
while( p > 0 )
{
temp2 = ( rand() / ( (double)RAND_MAX ) ); /* функция rand() генерирует
целое число между 0 и RAND_MAX,
которое определено в stdlib.h.
*/
if ( temp2 == 0 )
{// temp2 >= (RAND_MAX / 2)
p = 1;
}// конец if
else
{// temp2 < (RAND_MAX / 2)
p = -1;
}// конец else
}// конец while()
temp1 = cos( ( 2.0 * (double)PI ) * rand() / ( (double)RAND_MAX ) );
result = sqrt( -2.0 * log( temp2 ) ) * temp1;
return result; // возвращаем сгенерированный сэмпл
}// конец AWGN_generator()
Перевод © digitrode.ru