addnoise

Capsim Block Documentation

Short Description

Adds gaussian noise to the input buffer.

Top
Input Connections
Port Type Name
0 float inp
Top
Output Connections
Port Type Name
0 float out
Top
Parameters
Num Description Type Name Default Value
0 Noise power float power 1.0
1 Seed for random number generator int seed 333
Top
States
Num Type Name Initial Value Description
0 char rand_state[256]
1 double max
2 float dev sqrt(fabs(power))
Top

Declarations


 

	int i,j,ok;
	int numin;
	int count = 0;
	int trouble;
	double s,t,u,v,k,w,x,sqrt(),log();
	float y1,y2;



Top

Initialization Code



 

	if (power < 0.0) {
		fprintf(stderr,"addnoise: improper parameter\n");
		return(2);
	}
	srandom(seed);
	max = m;




Top

Main Code



 

	if ((numin = AVAIL(0)) > 0) {
		while(count < numin) {

/****************************************************************/
/* 		gauss						*/
/* code written by Prayson Pate					*/
/* This code generates two random variables that are normally 	*/
/* distributed with mean 0 and variance 1 i.e N(0,1).	 	*/
/* The polar method is used to generate normally distributed    */
/* samples from a sequence that is uniform on (-1,1).  The      */
/* resulting distribution is described exactly by N(0,1).       */
/* This method is based	on the inverse distribution function.   */
/****************************************************************/
	trouble = 0;
	do {
		if(++trouble > 100) {
			fprintf(stderr,"addnoise: problem with random number generator\n");
			return(2);
		}
		/* get two random numbers in the interval (-1,1) */
		s = random();
		u = -1.0 + 2.0*(s/max);
		t = random();
		v = -1.0 + 2.0*(t/max);
		w = u*u + v*v;
		/* is point (u,v) in the unit circle? */
	} while (w >= 1.0 || w == 0.0);

	x = sqrt((-2.0 * log(w))/w);
	/* find two independent values of y	*/
	y1 = dev * u * x;
	y2 = dev * v * x;
	
/****************** End of Gauss Code ****************************/

		IT_IN(0);
		if(IT_OUT(0)) {
			fprintf(stderr,"addnoise buffer 0 overflow\n");
			return(99);
		}
		out(0) = inp(0) + y1;
		++count;
		if(count < numin) {
			IT_IN(0);
			if(IT_OUT(0)){
				fprintf(stderr,"addnoise buffer 0 overflow\n");
				return(99);
			}
			out(0) = inp(0) + y2;
			++count;
		}
	}
	}

	return(0);




Top

Wrapup Code



 





Top

License



/*  Capsim (r) Text Mode Kernel (TMK) Star Library (Blocks)
    Copyright (C) 1989-2017  Silicon DSP Corporation

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

    http://www.silicondsp.com
    Silicon DSP  Corporation
    Las Vegas, Nevada
*/


Top

Description


 

/**********************************************************************
		addnoise.s 	
************************************************************************

addnoise


This star adds white gaussian noise to the input data stream.
Param. 1 (float) sets the power of the added noise and should be >= 0. 
Param. 2 (int) sets a seed for the random number generator.  Random
sequences can be unique and repeatable for each instance of this star.


Programmer: 	L. James Faber
Date:		November, 1987
Modified:	November 3, 1987
Mods:		ljfaber, 12/87

*/