Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Теоретическая часть. Дискретный сигнал представляет собой последовательность чисел, а потому в MATLAB он представляется в виде вектора




Дискретный сигнал представляет собой последовательность чисел, а потому в MATLAB он представляется в виде вектора. Если сигнал одномерный, то в большинстве случаев функции MATLAB правильно обрабатывают его при любой ориентации вектора - как в виде строки, так и в виде столбца. Если необходимо реализовать многоканальную обработку сигналов, для этого удобно использовать второе измерение, представив набор сигналов в виде матрицы. Столбцы матрицы, как правило, трактуются как сигналы разных каналов, а строки – как отдельные векторные отсчеты многоканального сигнала. Для избежания путаницы целесообразно и в одноканальном случае задавать сигналы в виде столбцов.

Отсчеты дискретного сигнала могут быть получены двумя путями. Первый вариант – расчет значений сигнала (моделирование сигнала), второй – получение сигнала извне путем считывания его записи.

Для расчета дискретизированного сигнала необходимо, прежде всего, сформировать вектор дискретных значений времени. Для этого удобно задать значение частоты дискретизации Fs и использовать обратную величину в качестве шага временного ряда:

>> Fs = 8e3; % частота дискретизации принята 8 кГц

>> t = 0:1/Fs:1; % задание ряда дискретных значений времени от 0 до 1с

>> t = t’; % преобразование строки значений времени в столбец

Сформировав вектор опорных значений времени, можно вычислять значения сигнала, используя этот вектор в соответствующих формулах. Следует помнить, что операции умножения, деления и возведения в степень в MATLAB имеют матричный смысл, поэтому при расчетах одномерных функций времени следует использовать поэлементные версии этих операций. То есть перед соответствующим знаком операции необходима точка: .*, ./, .^ .

Пример:

>> A = 2; % амплитуда сигнала

>> f0 = 1e3; % частота сигнала 1 кГц

>> phi = pi/4; % начальная фаза сигнала - 450

>> s1 = A*cos(2*pi*f0*t+phi); % гармонический сигнал

>> alpha = 1e3; % скорость затухания

>> s2 = exp(-alpha*t).*s1; % получаем затухающую синусоиду

Для построения графика сигнала следует использовать два параметра, передав в первом из них соответствующий временной вектор, например:

plot(t(1:100), s2(1:100))

Функции генерации одиночных импульсов В пакете MATLAB (Signal Processing) имеется ряд функций, генерирующих часто встречающиеся на практике периодические сигналы:

rectpuls - прямоугольный импульс;

trpuls – треугольный импульс;

sinc – импульс вида «синус икс деленный на икс»;

guaspuls – радиоимпульс с гауссовой огибающей;

pulstran – последовательность из конечного числа импульсов произвольной формы.

 

Прямоугольный импульс. Для формирования одиночного прямоугольного импульса с единичной амплитудой достаточно задать:

y=rectpuls(t,widtht);

Здесь t – вектор значений времени, width - ширина (длительность) импульса.

 

Гауссов радиоимпульс. Для формирования одиночного радиоимпульса с гауссовой огибающей и единичной амплитудой достаточно задать:

y=gauspuls(t,fc,bw,bwr)

Здесь t – вектор значений времени, fc – несущая частота в герцах, bw –относительная ширина спектра (ширина спектра, деленная на несущую частоту), bwr – уровень (в децибелах), по которому производится измерение ширины спектра. Возвращаемый результат у – вектор рассчитанных значений сигнала, определяемых по следующей формуле:

Коэффициент а управляет длительностью импульса и, соответственно, шириной его спектра. Сигнал имеет спектральную функцию, равную:

Если , то параметр a может быть определен:

Параметры bwr, bw и fc можно опустить, при этом будут использоваться их начения по умолчанию: bwr = - 6 дБ, bw = 0,5 и fc = 1000 Гц.

В качестве примера сформирован гауссов радиоимпульс с несущей частотой 4 кГц и относительной шириной спектра 10%, измеренной по уровню -20 дБ, а затем построен график его спектра, чтобы убедиться в правильности расчетов. Частота дискретизации принята равной 16 кГц. Фрагмент программы MATLAB имеет вид:

>>Fs = 16e3; % частота дискретизации

>> t = - 10e-3:1/Fs:10e-3; % дискретное время

>> Fc = 4e3; % несущая частота >> bw = 0.1; % относительная ширина спектра

>> bwr = - 20; % уровень измерения ширины спектра

>> s = gauspuls(t,Fc,bw,bwr);

>> Nfft = 2^nextpow2(length(s));

>> sp = fft(s, Nfft); % спектр исходного импульса

>> sp_dB=20*log10(abs(sp)); % амплитудный спектр в дБ

>> f = (0:Nfft-1)/Nfft*Fs; % вектор частот спектра

>> plot(t, s); % график сигнала

>> figure

>>% график амплитудного спектра:

>> plot(f (1:Nfft/2), sp_dB(1:Nfft/2))

>>% максимальный уровень спектра в децибелах:

>> sp_max_dB=20*log10(max(abs(sp)));

>> edges = Fc*[1-bw/2 1+bw/2]; % граничные частоты

>>% отображение заданных при расчете границ спектра

>> hold on

>> plot(edges, sp_max_dB([1 1])+bwr, ‘o’)

>> hold on

 

Результат показан на рисунках:

 

 

Генерация последовательности импульсов

Функция pulstran служит для генерации конечной последовательности импульсов одинаковой формы с произвольно задаваемыми задержками и уровнями.

Сами импульсы могут задаваться одним из двух способов: именем функции, генерирующей импульс, либо уже рассчитанным вектором отсчетов.

Если импульсы задаются именем генерирующей функции, функция pulstran вызывается следующим образом:

y=pulstran(t,d,’func’,p1,p2,…),

здесь t – вектор значений времени, d – вектор задержек, ‘func’- имя функции, генерирующей одиночный импульс. В качестве этой функции могут использоваться приведенные выше функции генерации. Оставшиеся параметры р1, р2,… - дополнительные, они передаются функции func при ее вызове.

Если для генерации одиночного импульса нет готовой функции, можно рассчитать вектор отсчетов импульса, а затем использовать второй вариант вызова функции pulstran:

y=pulstran(t,d,p,fs,’method’),

Смысл входных параметров t и d тот же, что и раньше. Вектор p должен содержать отсчеты одиночного импульса, а параметр fs указывает частоту дискретизации, используемую при расчете этого вектора. Считается, что первый отсчет из вектора р соответствует нулевому моменту времени.

Поскольку частота fs может не совпадать с шагом значений вектора t (в принципе, они даже не обязаны представлять собой равномерную последовательность) и задержки из вектора d тоже не обязательно кратны этому шагу, для пересчета задержанных импульсов к сетке моментов времени t в общем случае необходимо использование интерполяции. Метод интерполяции может быть явно задан с помощью строкового параметра ‘method’. Возможны все методы, поддерживаемые функцией interp1. Параметры fs и ‘method’ при вызове могут опускаться, в этом случае используются их значения по умолчанию: fs=1 и ‘method’=’linear’.

В качестве примера сформирована последовательность из шести импульсов, имеющих форму одного периода функции sin2. Пусть длительность импульса равна 60мс, а частота его дискретизации – 400 Гц. Расстояние между центрами импульсов будет одинаковым и равным 64мс, а частота дискретизации входного сигнала – 1 кГц. Импульсы будут экспоненциально затухать с ростом номера.

>> % генерируем вектор отсчетов одиночного импульса.

>>% Для этого задаем

>> Fs0 = 400; % частоту дискретизации импульса

>> tau = 60e-3; % длительность импульса

>> t0 = 0:1/Fs0:tau; % дискретное время для импульса

>> s0 = sin(pi*t0/tau).^2; % вектор отсчетов импульса

>> % генерируем последовательность импульсов

>> Fs =1e3; % частота дискретизации последовательности

>> t = 0:1/Fs:0.5; % дискретное время для последовательности

>> d = (1:6)’*64e-3; % задержки импульсов

>> d(: , 2) = 0.6.^(0:5)’; % амплитуды импульсов

>> % последовательность импульсов

>> y = pulstran (t, d, s0, Fs0);

>> plot(t, y)

Последовательность импульсов, сформированная функцией pulstran из вектора отсчетов одиночного импульса

 

Последовательность прямоугольных импульсов

В простейшем случае эта функция принимает один входной параметр:

Генерируемая при этом последовательность импульсов имеет период 2π и скважность 2 (то есть длительность импульса равна половине периода). Последовательность является двуполярной – сигнал принимает значения -1 и 1.

Сформировать последовательность с периодом Т можно следующим образом:

.

С помощью второго входного параметра duty можно регулировать скважность получаемой последовательности. Однако этот параметр задает не саму скважность, а обратную ей величину – коэффициент заполнения (в процентах), то есть отношение длительности импульса к периоду:

.

По умолчанию значение параметра duty равно 50, то есть генерируется меандр.

В качестве параметра сформирована последовательность однополярных прямоугольных импульсов с амплитудой 3 В, частотой следования 50 Гц и длительностью 5 мс. Использована частота дискретизации 1 кГц и временной интервал – 10…50 мс:

>> Fs = 1e3;

>> t = -10e-3:1/Fs:50e-3;

>> F = 3;

>> f0 = 50;

>> tau = 5e-3;

>> s = (square(2*pi*t*f0, f0*tau*100) + 1)* A/2;

>> plot (t, s)

 

Последовательность прямоугольных импульсов, полученная с помощью функции square.

 

Реализация заданного закона распределения вероятности

Средства генерации случайных чисел с различными законами распределения вероятности имеются в пакете MATLAB.

Способ получения случайных чисел с заданной функцией распределения на основе равномерно распределенных чисел заключается в следующем:

Пусть Х – случайная величина, равномерно распределенная на интервале 0…1. Для получения случайной величины Y, имеющей функцию распределения , случайную величину Х необходимо подвергнуть следующему нелинейному преобразованию:

, (1)

где - функция, обратная по отношению к .

Действительно, при таком расчете вероятность того, что Y не превышает значения y, равна

Но Х имеет равномерное распределение, поэтому

Таким образом,

то есть Y действительно имеет требуемую функцию распределения.

Формулу (1) можно обобщить на случай произвольного преобразования функции распределения. Если случайная величина Х имеет функцию распределения , а нужно получить случайную величину Y с функцией распределения , искомое преобразование следует записать следующим образом:

.

Преобразование делает распределение случайной величины равномерным, а преобразование формирует случайную величину с заданным распределением вероятности.

B качестве примера сгенерируем по формуле (1) случайные числа с рэлеевским законом распределения

Функция распределения для закона Рэлея получается интегрированием его плотности вероятности:

(2)

В MATLAB генерируем равномерно распределенные случайные числа с помощью функции rand, производим их преобразование по формуле (2) и строим гистограмму с помощью функции hist:

>> N=10000; % количество чисел

>>sigma=1; % параметр рэлеевского распределения

>>x=rand(1, N) % равномерное распределение N чисел

>>Y=sigma*sqrt(-2*log(1-x)); % получаем закон Рэлея

>>hist(Y, 25) % гистограмма по 25 интервалам

Гистограмма случайных чисел с рэлеевским распределением

 

Корректный учет шумов при анализе систем формирования и обработки сигналов играет важную роль для создания помехоустойчивых систем связи и передачи данных. Различают два основных вида помех: мультипликативные и аддитивные. К первому виду относятся помехи, создающие шумовую модуляцию исходного сигнала. Ко второму виду относятся помехи, добавляемые к полезному сигналу при прохождении последнего через системы передачи и обработки сигналов. Аддитивные помехи, как правило, имеют широкий спектр и описываются нормальным (гауссовским) законом распределения. Мультипликативные помехи возникают, например, при облучении цели сигналом радиолокационной станции. Вследствие изменения ракурса цели и вибраций корпуса, а также вследствие возмущений в среде распространения радиоволн сигнал, отраженный от цели приобретает паразитную модуляцию, которая может существенным образом сказываться на качестве приема сигнала.

Для анализа возможностей по моделированию сигналов различного вида с учетом воздействия на них различного вида помех в данной лабораторной работе будем исследовать процесс создания таких зашумленных сигналов.

Генерация дискретного нормального белого шума

Дискретный белый шум с нормальным распределением можно сгенерировать с помощью функции rndn, имеющей следующий синтаксис:

y=randn(m,n),

В результате вызова функции генерируется массив Х, содержащий m строк и n столбцов псевдослучайных чисел, имеющих нормальное распределение с нулевым математическим ожиданием и единичной дисперсией.

Для генерации дискретного нормального белого ума удобнее использовать функцию wgn (white Gaussian noise), поскольку она позволяет задавать уровень генерируемого шума. Синтаксис вызова функции следующий:

y=wgn(m,n,imp,state,’powertype’,’outputtype’);

Здесь m и n – как ранее, размеры генерируемой матрицы, а р – мощность генерируемого шума в единицах, задаваемых параметром ‘powertype’ (по умолчанию – в децибелах). Остальные параметры являются необязательными и имеют значения по умолчанию.

Параметр imp задает импеданс нагрузки в Омах (предполагается, что генерируются отсчеты случайного напряжения на этой нагрузке). По умолчанию используется импеданс нагрузки, равный 1 Ом.

Целочисленный параметр state позволяет принудительно задавать начальное состояние генератора гауссовских случайных чисел. По умолчанию используется текущее состояние.

Строковый параметр ‘powertype’ задает измерения мощности, использованные при указании параметра р. Возможны следующие значения:

‘dB’ – мощность р задается в децибелах относительно 1 Вт, значению 0 дБ соответствует дисперсия imp^2;

‘dBm’ – мощность р задается в децибелах относительно 1 мВт, значению 0 дБ соответствует дисперсия imp^2/1000;

‘linear’ – мощность р задается в ваттах, дисперсия генерируемого шума равна p*imp.

Строковый параметр ‘outputtype’ позволяет задавать генерацию вещественного или комплексного шума. Возможны значения ‘real’ (вещественный шум; генерируется по умолчанию) и ‘complex’ (комплексный шум). Если генерируется комплексный шум, его вещественная и мнимая части имеют мощности р/2.

Добавление белого шума к сигналу

В пакете приложений Communications имеется функция, работающая с нормальным белым шумом. Эта функция awgn, реализующая канал связи с аддитивным белым гауссовым шумом, то есть добавляющая к сигналу белый шум с заданным уровнем. Синтаксис вызова функции следующий:

y=awgn(x,snr,sigpower,state,’powertype’);

Здесь х – вектор отсчетов сигнала. Скаляр snr задает отношение сигнал/шум в единицах, задаваемых параметром ‘powertype’ (по умолчанию – в децибелах). Остальные параметры являются необязательными и имеют значения по умолчанию. Параметр sigpower указывает мощность сигнала х в единицах, задаваемых параметром ‘powertype‘ (по умолчанию в децибелах). По умолчанию предполагается, что мощность сигнала равно 0 дБ, то есть средний квадрат модуля значений из вектора х равен единице. Параметр sigpower может также принимать строковое значение ‘measured’, при этом мощность сигнала автоматически измеряется.

Целочисленный параметр state позволяет принудительно задавать начальное состояние генератора гауссовских случайных чисел MATLAB (функция randr). По умолчанию используется текущее состояние.

Строковый параметр ‘powertype’ задает единицы измерения мощности, использованные при указании параметров snr и sigpower: ‘dB’ – мощность сигнала и отношение сигнал/шум задаются в децибелах, ‘linear’ – мощность сигнала и отношение сигнал/шум задаются в разах. При расчете мощности сигнала предполагается, что значения вектора х представляют собой отсчеты напряжения а нагрузке с импедансом 1 Ом.

Результатом работы является вектор «зашумленных» отсчетов у. Если значения х являются вещественными, функция awgn добавляет вещественный шум, если комплексный – комплексный.

Сведения о возможностях MATLAB, необходимые для использования в работе при создании графического интерфейса

Фрагменты кодов для создания пользовательского интерфейса MATLAB представлены ниже.

В новом окне задать функцию (Пример: function LABA2).

Далее – объявление переменных, которые должны быть «видимыми» всеми подпрограммами (m-файлами):

Для нормальной работы создаваемой модели, как правило, создается несколько m-файлов: главная программа, запуск которой обеспечивает создание графического окна и элементов управления. В главной программе создаются управляющие кнопки, активация которых обеспечивает передачу управления другому (другим) m-файлу (файлам), который осуществляет непосредственное моделирование исследуемых процессов, используя значения введенных с помощью интерфейса параметров. Результаты вычислений передаются в главное окно программы в виде графиков и численных данных. В графическом интерфейсе, как правило, используют специальную кнопку «очистить», активация которой обеспечивает стирание предыдущей информации и подготовку для новых расчетов.

Ниже кратко изложены основные компоненты управляющей (основной) программы – m-файла.

Во второй строке объявлено главное окно (hF1), и график (hAxes), помещенный внутри окна, в котором будут отображаться результаты моделирования.

function LABA2

global hFig1 hAxes

global hEd1 hEd2 hEd3 hEd4

global hList

global hBut1 hBut2

global hTxt1 hTxt2 hTxt3

hF1=figure;

%---Создание управляющей кнопки hBut1 и запуск на исполнение

%----программы с именем ‘progr0’:---------

hBut1=uicontrol(hF1,'Style','pushbutton','String','Выполнить',…

'Position',[420 10 120 30], 'Callback','progr0' );

% ----Создание редактируемого текстового поля, вводимое

%-значение ----присваивается переменной hEd1:

hEd1=uicontrol(hF1,'Style','edit','Position',[620 10 120 30], …

'BackgroundColor','white', ...

'HorizontalAlignment','left');

%------- Создание нередактируемого текстового поля(надписи):

hTxt1=uicontrol(hF1,'Style','text','Position',[620 50 120 30],…

'BackgroundColor','white', ...

'String', 'Содержание надписи','HorizontalAlignment','center');

%---------------- Создание элемента "список"------------

hList=uicontrol(hF1,'Style','listbox','Position',[200 10 120 80],…

'String',{'первое','второе','третье','четвертое'}, ...

'HorizontalAlignment','left');

% ---------------Создание рамки на панели-------------------

hFr=uicontrol(hF1,'Style','frame','Position',[5 190 130 200]);

% ---------------Создание "ползунка"--------------------------

hSld=uicontrol(hF1,'Style','slider','Position',[5 400 110 30]);

% --------------- Задание окна и поля графики --------------

hAxes1 = axes('Parent', hFig1, 'Color', [1 1 1],...

'Units','points',...

'Position', [30 100 560 440],...

'FontSize', 8,'Visibl','off');

Во всех перечисленных операторах используется параметр ‘Position’, который задает расположение в главном окне заданного объекта (кнопки, текстового поля, поля графики и т.п.). За именем указанного параметра следует строка значений: [x y ∆x ∆y], которые соответствуют координатам расположения левого нижнего угла объекта в окне в пикселах относительно левого нижнего угла главного окна. Рекомендуется при проведении лабораторной работы вначале создать главную программу и разместить управляющие и информационные элементы окна, потренироваться в создании каждого из элементов интерфейса.

Как показано выше, создание управляющей кнопки hBut1 и запуск на исполнение программы с именем ‘progr0’ осуществляется с помощью оператора:

hBut1=uicontrol(hF1,'Style','pushbutton','String','Выполнить',

'Position',[420 10 120 30], 'Callback','progr0' );

Очевидно, что для выполнения указанной программы с именем ‘progr0’ она должна быть создана в виде самостоятельного m-файла и храниться в той же папке, что и главная программа LABA2.

Исполняемый m-файл должен начинаться с имени вызываемой функции:

function [h] = progr0;

Для создания программы очистки, вызываемой управляющей кнопкой «очистить» должен быть создан соответствующий m-файл:

function CLEAR

%----------------

global hAxes1

axes (hAxes1);

grid off;

cla;

Создание управляющей кнопки hBut2 и запуск на исполнение программы с именем ‘CLEAR’ из главной программы осуществляется с помощью оператора:

hBut2=uicontrol(hF1,'Style','pushbutton','String','Очистить',…

'Position',[320 10 120 30], 'Callback','CLEAR');

При считывании данных из главного окна в исполняемой программе (progr0) следует поместить операторы:

str1=get(hEd1, 'String');

a1=str2num(str1);

Первый оператор присваивает переменной str1 значения параметра, введенного в поле hEd1 в главном окне в виде строковой переменной, а второй оператор – преобразует строковую переменную, считанную из главного окна, в число. Это число передается параметру а1.

Для построения рисунка в окне необходимо ввести операторы:

%-------Построение поля рисунка:---------

% вызов объекта hAxes1

axes(hAxes1);

% установка шрифта в объекте

set(hAxes1,'FontSize', 8);

%------Построение графика на рисунке:-----

% построение графика в активном поле

handl2=plot(…);

% установка толщины линии графика

set(handl2,'LineWidth',2);

% следующий далее оператор позволяет накладывать новый

%график на уже существующий в созданном поле рисунка

hold on

В функции plot используются соответствующие параметры Х, У, как в указанных выше примерах.







Дата добавления: 2014-11-10; просмотров: 2883. Нарушение авторских прав


Рекомендуемые страницы:


Studopedia.info - Студопедия - 2014-2019 год . (0.023 сек.) русская версия | украинская версия