Модели генераторов сигналов и их обработка на VHDL
А.М. СЕРГИЕНКО
В этой статье предлагается рассмотреть простые модели генераторов цифровых сигналов, простые, но эффективные алгоритмы обработки сигналов, а также сделать с ними ряд исследований.
Разнообразные генераторы сигналов используются для диагностики, тестирования и настраивания алгоритмов и приспособлений цифровой обработки сигналов (ЦОС). Часто используется генератор синусоидальных сигналов из-за того, что такой сигнал проходит через линейную систему без изменений своей формы. Пример такого генератора предлагается здесь http://kanyevsky.kpi.ua/wp-content/uploads/2017/09/labexercise-1.pdf. Шумовой сигнал имеет широкий спектр и поэтому исследование его прохождения через линейную систему даёт возможность оценить её частотные характеристики. Также шум прибавляется к сигналу, чтобы выявить фильтрующие свойства системы. Пропуская через систему сигнал специальной формы, можно проверить её качество, так как система с достойной передаточной характеристикой сохраняет форму сигнала.
В статье рассматривается построение генератора сигналов специальной формы Gen и генератор гауссового шума Gauss_Gen, и выполняется с ними ряд исследований, включив его в схему на рис. 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.
На рис. 3. показаны график сигнала, сгенерированного модулем Gen, график сигнала с добавленным гауссовым шумом, амплитуда которого относится как 3:1 и сигнал после 100 циклов усреднения в модуле Averager. Анализ графиков показывает, что действительно, после 100 усреднений периодического сигнала уровень добавленного гауссового шума уменьшается приблизительно в 10 раз.
На рис. 4. показаны графики сигналов, полученных на виходе модуля S_Distribut для сигналов без шума, з добавленны шумом с уровнем 0,3 и уровнем 3. Графики показывают, что сигнал имеет позитивную постоянную составляющую. Первый график имеет форму, характерную для сигнала без шума, второй график показывает наявность в сигнале шумуа а третий – что в сигнале преобладает шум, причем именно шум с вероятно гауссовым распределением.
Возможности использования 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 имеет широкие возможости для решения задач моделирования в разнообразных отраслях.