Модели генераторов сигналов и их обработка на VHDL

А.М. СЕРГИЕНКО

В этой статье предлагается рассмотреть простые модели генераторов цифровых сигналов, простые, но эффективные алгоритмы обработки сигналов, а также сделать с ними ряд исследований.

Разнообразные генераторы сигналов используются для диагностики, тестирования и настраивания алгоритмов и приспособлений цифровой обработки сигналов (ЦОС). Часто используется генератор синусоидальных сигналов из-за того, что такой сигнал проходит через линейную систему без изменений своей формы. Пример такого генератора предлагается здесь http://kanyevsky.kpi.ua/wp-content/uploads/2017/09/labexercise-1.pdf. Шумовой сигнал имеет широкий спектр и поэтому исследование его прохождения через линейную систему даёт возможность оценить её частотные характеристики. Также шум прибавляется к сигналу, чтобы выявить фильтрующие свойства системы. Пропуская через систему сигнал специальной формы, можно проверить её качество, так как система с достойной передаточной характеристикой сохраняет форму сигнала.
В статье рассматривается построение генератора сигналов специальной формы Gen и генератор гауссового шума Gauss_Gen, и выполняется с ними ряд исследований, включив его в схему на рис. 1.

Рис. 1. Схема испытания генератора сигналов специальной формы.

Другие блоки схемы на рис. 1. — это блок анализа статистического распределения сигнала S_Distribut и блок усреднения сигнала Averager.
В основу генератора гауссового шума положено выполнение центральной граничной теоремы. В соответствие с ней, если случайная величина является суммой достаточно большого числа независимых между собой слагаемых, каждое из которых является незначительным по величине, то эта сумма имеет распределение, приближающееся к нормальному.
На VHDL он выглядит следующим образом.

  library IEEE;
  use IEEE.STD_LOGIC_1164.all;
  use IEEE.math_real.all;
  entity Gauss_Gen is	
   generic(nn:natural:=1; --степень биномиального распределения <16
   m:REAL:=0.0	 -- усреднённое выходное данное
	);
     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 генераторов шума
	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;

Блок Gauss_Gen состоит из двух частей: nn параллельных генераторов чисел с равномерным распределением и сумматор, который складывает nn згенерованих чисел. Генерация чисел с равномерным распределением в интервале [0.0,1.0] выполняется по конгруэнтному алгоритму с использованием процедуры UNIFORM. Полученная сумма делится на nn и выдаётся как отсчёт шума, который распределён в интервале [-1.0,1.0]. Здесь nn – это настоечная константа. При nn = 1 генератор видаёт шум с равномерным распределением, при nn = 2 –с треугольным трикутним распределением, а при nn > 10 – практически с гауссовым распределением.
Сигналы от генераторов Gen и Gauss_Gen складываются в сумматоре SM после умножения на коеффициенты масштабирования mа, mb, соответственно. В результате, получаем сигнал х(n), который исследывается. Модель сумматора следующая.

      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;

Статистические свойства сигнала х(n) можно оценить с помощью построения гистограммы распределения его вереятности. Вычисление гистограммы выполняют следующим образом. Интервал изменения величины х(n), например, а < х(n) < b, делят на k подинтервалов равной длины. і-му интервалу, включая 0-й подинтервал х(n) < а и k+1 –й подинтервал b < х(n), ставится в соответствие натуральное число Мі, которое равно количеству отсчетов х(n), которые попадают в соответствующий подинтервал. Подинтервал часто називают интервалом группирования или карманом.

Пусть ширина подинтервала равна с = (b – а)/k , а граница і-го интервала – di = a + i*c. Тогда после анализа всей последовательности х(n) в і-м кармане получем число таких х(n), чтобы di-1 < х(n) < di. Исключением является 0-ой карман с количеством отсчетов х(n) < а и k+1 -ый карман с числом таких х(n), чтобы b < х(n).
При обработке х(n) на компьютере организовывають масив целих чисел М размером k+2. Если а < х(n) < b , то вычисляют номер кармана

     (1)

 

Здесь скобки [] обоначают целую часть числа. Получив индекс по формуле(1) в і-тую ячейку, то есть карман М(і) прибавляют 1.
Такие вычисления повторяют для всех х(n).

На основе полученных результатов можно для последовательности х(n) длиной N вычислить выборочную функцию плотности вероятности по формуле

     (2)

 

Вибор параметров а, b, k зависит главным образом от представления о распределении сигнала х(n), способа сбора данных и их количества. Вероятно, количество карманов нецелесообразно выбирать больше, чем о√N или чем количество уровней квантования сигнала. Параметры а, b, k уточняются после циклов пробного построения гистограммы.
Построение гистограммы выполняется блоком 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;

Он имеет настроечные константы channels, то есть k, dmin, то есть а и drange, который равен b – а.
Если сигнал х(n) – периодический, то х(n+То) = х(n), где То – его период. Реальный сигнал х'(n) имеет дополнительную составляющую в виде шумового сигнала q(n), то есть х'(n) = х(n) + q(n). Блок усреднения сигнала Averager описан в следующей модели.

  
      library IEEE;
      use IEEE.STD_LOGIC_1164.all;
      entity Averager is 
      	generic(N:integer:=300); -- Период усреднения
      	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;

Он выполняет сложение периодов сигнала х'(n). Если шум q(n) является последовательностью случайных чисел с нормальным законом распределения, то после сложений N периодов сигнала х'(n) его составляющая q(n) увеличится меньше, чем в N раз. Значит, после N сложений периодов сигнала х'(n) и нормализации результата делением на N для n = 0,…,То–1 и k = 0,…,NTo–1 получим результат

 

    (3)

 

где m(q(k)) – математическое ожидание шума q(k), q’(k) – усредненный шумовой сигнал. Значит, видим, что усреднением сигнала можно снизить уовень шума доN раз. Поэтому усреднение периодического сигнала часто используется для его фильтрации от шума. При этом важными условиями являются стремление к нулю математического ожидания шума и строгое равенство длины массива y(n), где накапливается усредненный сигнал, и периода To сигнала х(n).

Пусть задана функция

То = N1 + N2 . Тогда модуль, который её генерирует, описывается как следующий:

 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;

Построенная схема стенда для испытаний показана на рис.2.

Рис. 2. Схема стенда для испытаний

На рис. 3. показаны график сигнала, сгенерированного модулем Gen, график сигнала с добавленным гауссовым шумом, амплитуда которого относится как 3:1 и сигнал после 100 циклов усреднения в модуле Averager. Анализ графиков показывает, что действительно, после 100 усреднений периодического сигнала уровень добавленного гауссового шума уменьшается приблизительно в 10 раз.

Рис. 3. Графики сгенерированного сигнала (а), сигнала с обавленным гауссовым шумом (б), и сигнала после усреднения (в)

На рис. 4. показаны графики сигналов, полученных на виходе модуля S_Distribut для сигналов без шума, з добавленны шумом с уровнем 0,3 и уровнем 3. Графики показывают, что сигнал имеет позитивную постоянную составляющую. Первый график имеет форму, характерную для сигнала без шума, второй график показывает наявность в сигнале шумуа а третий – что в сигнале преобладает шум, причем именно шум с вероятно гауссовым распределением.

Рис. 4. Графики распределения сигнала без шума (а) и сигнала с добавленным гауссовым шумом (б), (в)

Возможности использования VHDL для обработки сигналов показаны в статье 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/ . В данной статье продолжено изложение этого опыта и в очередной раз показано, что язык VHDL имеет широкие возможости для решения задач моделирования в разнообразных отраслях.