Gauss noise generator VHDL-model and its use in DSP

A.Sergyienko
National Technical University of Ukraine “KPI”,
Email: aser@comsys.kpi.ua

In this article we propose to do a set of experiments with the simple signal generator models as well as with some algorithms of simple but effective processing of the derived signals.

Signal generators are widely used for the DSP unit testing. For this purpose the sine wave generator is widely used due to the fact that the sine wave is traversed the linear system without its form damage. Such a generator is proposed here
http://kanyevsky.kpi.ua/wp-content/uploads/2017/09/labexercise-1.pdf.
The noise signal has the wide spectrum. Therefore, its use helps to estimate the frequency response of the system. The noise is added to the testing signal to estimate the filtering property of the system. Consider we input the special form signal to the system. Then this system is valued as good one when the output signal follows the form of the input one.
Here we consider the description of the special form generator Gen and Gauss noise generator Gauss_Gen. We do here a set of experiments using the network in the Fig.1.

Fig. 1. Network for the signal generator probing

The other units in the Fig. 1 are statistical analysis unit S_Distribut, and averaging unit Averager.
The Gauss noise generator is based on the central limit theorem of the statistics. Due to the theorem, if the probable datum is the sum of a set of N independent probable data then this sum has the binomial distribution, which approaches to the Gauss, or normal distribution.

The Gauss noise generator described by VHDL looks like the following.

library IEEE;
 use IEEE.STD_LOGIC_1164.all;
 use IEEE.math_real.all;
 entity Gauss_Gen is
  generic(nn:natural:=1; --power of the binomial distribution <16
  m:REAL:=0.0	 -- mean output value
	);
   port(
	CLK : in STD_LOGIC;
	RST : in STD_LOGIC;
	DATA_OUT : out REAL:=0.0
	);
   end Gauss_Gen;
 architecture Model of Gauss_Gen is
     	type arri is array (0 to 15) of integer;
      	type arrr is array (0 to 15) of real;
 begin
 SFR:process(clk,rst)
  variable s1:arri:=(3,33,333,3,4,5,6,7,8,9,11,22,33,others=>55);
  variable s2:arri:=(5,55,555,50,6,7,8,9,5,6,7,21,33,others=>22);
  variable r:arrr:=(others=>0.0);
  variable s:real:=0.0;
      	begin
           if rst='1' then
              DATA_OUT<=0.0;
           elsif  clk='1' and clk'event then
 		s:=0.0;
       	for i in 0 to nn-1 loop    -- nn noise generators
                   UNIFORM (s1(i),s2(i),r(i));
                   s:=s+r(i);
       	end loop;
        	DATA_OUT <= 2.0*(s/real(nn)-0.5)+ m;
           end if;
      end process;
  end Model;

Unit Gauss_Gen has two parts. The first one has nn parallel uniform noise generators. The data uniformly distributed at the interval [0.0,1.0] are generated by the congruent algorithm, which is performed by the procedure UNIFORM. The second part is an adder, which adds nn generated random numbers. The sum is divided by nn and adjusted to the interval [-1.0,1.0].

The figure nn is the generic variable. By nn = 1 the generator generates the uniform noise, by nn = 2 it generates the triangle distribution noise, and by nn > 10 the output signal is practically the Gauss noise.

The signals from the generators Gen and Gauss_Gen are added in the adder SM after multiplication them to the scale factors mа, mb, respectively. As a result, we get the complex signal х(n), which we will test. The scaling adder model is the following.

      library IEEE;
      use IEEE.STD_LOGIC_1164.all;
      entity ADD2 is
      	generic(ma:real:=1.0;
      	mb:real:=1.0);
      	 port(	 A, B: in REAL;
      		 S : out REAL:=0.0 );
      end ADD2;
      architecture ADD2 of ADD2 is
      begin
      	S<=ma*A + mb*B;
      end ADD2;

When we build the histogram of the signal х(n) probability distribution then its statistical properties can be estimated. The histogram calculation is implemented as the following. The value (n) representation interval, say, а < х(n) < b, is divided to k subintervals of equal length. і-th subinterval as well as 0-th subinterval х(n) < а and k+1 –th one b < х(n), responses to the natural number Мі,. This number is equal to the number of samples х(n), which enter the respective i-th subinterval. The i-th subinterval is called as i-th bin.

Consider the subinterval length is с = (b – а)/k, and the limit of the і-th bin is di = a + i*c. Then after the analysis of the whole signal sequence x(n) in the і-th bin we derive the number of j samples х(n), so that di-1 < х(n) < di. The 0-th bin for samples х(n) < а, and k+1-th bin for samples i>b < х(n) are exclusions.
By processing the signal х(n) the array M of k+2 integers. If а < х(n) < b , then the number of bin is calcula
    (1)

Here the brackets [] means the rounded value. Deriving the index by the formula (1) a one is added to the i-th bin, i.e. to the array element М(і). Such a calculation is repeated for all data х(n).
If the length of the sequence х(n) is equal to N then the probability distribution function is calculated by the formula
    (2)

The selection of parameters а, b, k, in general, depends on hypothesis of the signal х(n) distribution, method of data sampling and N . Surely, the number of bins must be less than о√N , or than the number quantization levels of х(n). The parameters а, b, k are corrected after some estimating cycles of histogram deriving.

The probability density histogram is derived in the unit S_Distribut:

 
   library IEEE;
   use IEEE.STD_LOGIC_1164.all;
   entity S_Distribut is 
   generic(channels:natural:=100;
      		drange:real:=2.0;
     		dmin:real:=-1.0);
      	port(	CLK, RST: in STD_LOGIC;		
      		DATA : in REAL:=0.0;
      		ADDR : out INTEGER;
      		DISTRIB : out INTEGER);
   end S_Distribut;
   architecture MODEL of S_Distribut is  
      	type Tarr is array (0 to channels+1) of natural;	
      	signal Distr_arr:Tarr:=(others=>0);
      	signal addri,aa:natural;
      	signal even: STD_LOGIC;  
   begin
     process(CLK)  
        variable addrw:integer;	
     begin
     addrw:=integer(real(channels)*(DATA - dmin)/drange - 0.5)+1;
          if 	DATA> (dmin+drange) then
		addrw:=channels+1;
          elsif 	DATA<=dmin	then
		addrw:=0;
          end if;	
      			
      		aa<=addrw;
      		if RST='1' then
      			Distr_arr<=(others=>0);
      		elsif CLK='1' and CLK'event then
      			Distr_arr(addrw)<=Distr_arr(addrw)+1;
      		end if;
      	end process;

      	process(CLK)
      	begin
      		if RST='1' then
      			addri<=0;
      			even<='0';
      		elsif CLK='1' and CLK'event then
      			if addri=channels+1 then
      				addri<=0;
      				even<=not even;
      			else
      				addri<=addri+1;
      			end if;
      		end if;
      	end process;

      	ADDR<=addri when even='1' else -1;
      	DISTRIB<=Distr_arr(ADDRi) when even='1' else -1;
end MODEL;

The unit has the generic variables channels, dmin, which mean k, and а, drange, which is equal to b – а.
If the signal х(n) is periodical one, then х(n+То) = х(n), where То is its period. The real signal х'(n) has the additional noise part q(n),, i.e. х'(n) = х(n) + q(n). The averaging unit Averager is described in the following model.

  
      library IEEE;
      use IEEE.STD_LOGIC_1164.all;
      entity Averager is 
      	generic(N:integer:=300); -- Averaging period
      	port(	CLK, RST: in STD_LOGIC;
      		DATA : in real;
      		DATA_OUT : out real;	 
      		NN:out integer 	);
      end Averager;
      architecture beh of Averager is
      	type Tarr is array(0 to N-1) of real;
      	signal arr : Tarr:=(others=>0.0);	   
      	signal addr:natural; 
      	signal NNi:natural:=1;
      begin
      	process(CLK,RST) begin
      		if RST='1' then
      			arr<= (others=>0.0); 
      			addr<=0;
     			NNi<=1;
      		elsif CLK='1' and CLK'event then
      			arr(addr)<= arr(addr)+DATA;	
      			if addr = N-1 then
      				addr<=0;
      				NNi<=NNi+1;
      			else
      				addr<=(addr+1) ;
      			end if;
      		end if;
      	end process;

      	DATA_OUT<=arr(addr)/real(NNi);
      	NN<=NNi;
      end beh;

The unit implements the accumulation of the periods of the signal х'(n). If the noise q(n) is the sequence of the probable data with the normal distribution then after N additions of the signal х'(n) its part q(n) increases less than in N times. As a result, after N additions of periods of х'(n) and normalization of the result by division to Nfor n = 0,…,То-1 and k = 0,…,NTo-1we derive the output signal

    (3)

where m(q(k)) is the mean value of the noise q(k), q'(k) is the averaged noise signal without its mean value. We see obviously that the averaging can decrease the noise level in the signal up to N times.

Due to this fact the averaging of the periodical signal is often used for the noise filtration. The serious conditions of this process are approaching to nil of the noise mean value and that the length of the accumulating array y(n), is equal to the х(n) signal period To .

Consider the periodical signal with the period То = N1 + N2 :

Then the unit which generates this signal is described as the following:

entity Gen is generic(n1:natural:=100;
n2:natural:=200);
port(CLK : in STD_LOGIC;
	RST : in STD_LOGIC;
	DATA_OUT : out REAL:=0.0;
	START : out BIT);
end Gen;
architecture MODEL of Gen is	
signal ct2:natural;
begin
process(CLK,RST)	begin

if RST='1' then
		ct2<=0;
		START<='1';
	elsif CLK='1' and CLK'event then 
		START<='0';
		if ct2=n1+n2-1 then
			ct2<=0;
		else
			ct2<=ct2+1;
		end if;
		if ct2<=n1 and ct2>0 then
	           DATA_OUT<= arctan(real(ct2)/real(n1));
		else
		   DATA_OUT<= cos(MATH_PI*real(ct2-n1)/real(n2));
		end if;
	end if;
end process;
end MODEL;

The network in the Fig.1 can be implemented as the test bench diagram in the Fig.2. This diagram is built using the Aldec ActiveHDL package.

Fig. 2. Test bench diagram

Fig. 3 illustrates signal, which is generated by the unit Gen, signal with added noise, and signal after 100 averaging cycles in the unit Averager. The analysis of the Fig.3 shows that after 100 averagings of the periodical signal the level of the added Gauss noise is really decreased in ca. 10 times.

Fig. 3. Diagrams of generated signal (а), of signal with the noise (b), of signal after averaging (c)

Fig.4 shows the diagrams of the output of the unit S_Distribut for the noise-free signal (Fig 3,a), signal with the added noise with the level 0.3, and level 3. The diagrams show that the signal has the positive mean value. The diagram Fig.4,a has the form, which characterizes the noise free signal, the diagram Fig.4,b shows that the noise is present in the signal. The diagram Fig.4,c shows that the noise level supersedes the signal level, and moreover, the noise has probably the Gauss distribution.

Fig. 4. Probability distribution of noiseless signal (a) and signal with noise (b), (c)

Conclusions. It is shown here http://kanyevsky.kpi.ua/ru/%D1%81%D1%82%D0%B0%D1%82%D1%8C%D0%B8/vhdl-%D0%BF%D1%80%D0%BE%D1%82%D0%B8%D0%B2-matlab/ that VHDL language has the wide opportunities to solve the different modeling problems especially at the field of DSP.