Применение MATLAB для моделирования радиотехнических сигналов и устройств. Учебно-методическое пособие
.pdf
Фактически количество итераций цикла определяется количеством элементов массива, а значение index – значениями перебираемых элементов. При этом возможно даже символьное значение:
for i='nstu' |
n |
disp(i); |
s |
end |
t |
|
u |
5.4.Циклы типа «while»
Вобщем виде цикл «while» записывается как
while условие операторы;
end
В этом случае задается условие, которое каждую итерацию проверяется на истинность. Цикл выполняется пока условие истинно. Выражение считается истинным, когда его результат является непустым4 и ненулевым (логическим или вещественным числовым) [10]:
|
|
|
v=0; |
v = 1 |
|
while v<5 |
v = 2 |
|
v=v+1 |
v = 3 |
|
end |
v = |
4 |
|
v = |
5 |
Пример бесконечного цикла:
|
|
|
>> tic |
… |
|
while 1 |
Elapsed time is 2.227198 seconds. |
|
toc |
Elapsed time is 2.227221 |
seconds. |
end |
Elapsed time is 2.227245 |
seconds. |
|
>> |
|
4 Пустым (англ. empty) в среде MATLAB называется массив, у которого хотя бы одна размерность равна 0 [11]. Например, пустой массив A=[] имеет размерность 0 на 0.
21
Для остановки выполнения такого цикла или любой другой программы MATLAB необходимо нажатьнаклавиатуреCtrl+C илиCtrl+Break.
Примечание. Здесь tic – команда запуска секундомера, toc – команда чтения времени, истекшего с момента ввода tic.
5.5. Операторы «break», «continue», «return»
Оператор break предназначен для досрочного прерывания циклов типа for или while. Стоящие в теле цикла после break выражения не выполняются. Во вложенных циклах break осуществляет выход только из цикла, в котором он находится.
Пример. Поиск в массиве элемента со значением равным 1:
|
|
A=zeros(1,10); |
i = |
A(6)=1; |
6 |
for i=1:10 |
|
if A(i)==1 |
|
break; |
|
end |
|
end |
|
Оператор continue позволяет досрочно перейти к следующей итерации цикла, оставив невыполненными все выражения, стоящие в теле цикла после него. Данный оператор работает с циклами for или while. Во вложенных циклах оператор пропускает стоящие после него выражения только в цикле, в котором он находится.
Пример. Поиск значений в массиве больше среднего:
|
|
|
|
|
clc; |
|
A = |
0.0811 |
0.4868 |
clear; |
|
0.3685 |
||
A=rand(3,3) |
|
0.6256 |
0.9294 |
0.4359 |
|
0.7802 |
0.7757 |
0.4468 |
|
disp('Больше среднего:'); |
|
Больше среднего: |
|
|
for i=1:numel(A) |
|
|
||
if A(i)-mean(mean(A))<=0 |
|
0.6256 |
|
|
continue; |
|
0.7802 |
|
|
end; |
|
0.9294 |
|
|
disp(A(i)); |
|
0.7757 |
|
|
end |
|
|
|
|
|
22 |
|
|
|
Оператор return осуществляет возврат в вызывающую функцию или в режим работы с клавиатуры прежде достижения конца функции, в которой он стоит. Под вызывающей функцией подразумевается функция, которая вызывает функцию или код программы, содержащие return.
Пример. Функция, осуществляющая чтение файла с изображением и вывод последнего на экран. При отсутствии файла выдает соответствующее сообщение.
Текст функции:
function read_image(file_full_name)
check=exist(file_full_name); if check==0
errordlg('Файл не найден','Ошибка'); return
end
I=imread(file_full_name); imshow(I);
end
Вызов созданной функции:
read_image('D:\Lighthouse.jpg')
23
5.6.Конструкция «switch … case … otherwise»
Вобщем виде конструкция записывается как
switch switch_выражение case case_выражение операторы;
case case_выражение операторы;
...
otherwise end операторы;
Конструкция данного типа обеспечивает ветвление и работает следующим образом. Последовательно проверяются case_выражения, в случае, если значение одного из них соответствует switch_выражению, выполняется группа операторов, стоящих в его
блоке case. После выполнения программа выходит из блока switch. К блоку otherwise программа переходит, если ни одно из
case_выражений не соответствует switch_выражению.
Для числовых переменных условием является истинность выраже-
ния case_выражение==switch_выражение.
Для символьных переменных переход осуществляется при условии strcmp(case_expression,switch_expression)==1, т. е.
когда векторы символов switch_expression и case_ expression полностью идентичны.
Пример:
a=2; switch a
case 1
disp('a равно 1'); case 2
disp('a равно 2'); otherwise
end
disp('ни одно из значений не совпадает с a');
Результат:
a равно 2
24
5.7. Создание функций
Функции, сохраняемые в m-файлах, находят широкое применение в языке программирования MATLAB. В отличие от скриптов, также сохраняемых в m-файлах, функции могут иметь входные и выходные параметры. Для операций над входными переменными внутри функций записывается набор команд, при этом могут создаваться локальные переменные, которые сохраняются в области памяти, выделенной специально для этой функции, отдельно от рабочего пространства. То есть обратиться к ним из внешней для функции программы невозможно.
В общем виде текст функции записывается как
function [y1, y2, … yN] = имя_функции(x1,x2, … xN)
…
end
Здесь x1,x2, … xN – входные переменные; y1, y2, … yN –
выходные переменные. Число обеих может варьироваться от нескольких до полного отсутствия. Возможно создание функций без входных и выходных переменных.
Каждая функция сохраняется в отдельном m-файле, название которого должно совпадать с названием функции – для того, чтобы MATLAB мог их ассоциировать друг с другом. Оба названия должны записываться буквами английского алфавита.
Совет. Поскольку разные операционные системы по-разному воспринимают регистр в именах файлов, рекомендуем называть m-файлы именами из строчных букв.
Для того чтобы использовать созданный m-файл-функцию, он должен находиться или в текущей папке (Current Folder), или путь к нему должен быть добавлен к пути поиска MATLAB (англ. MATLAB search path) (см. п. 6. «Установка пути поиска MATLAB»).
Пример. Функция расчета отсчетов амплитудно-модулированного сигнала:
function s=AM_signal(T,Fd,w0,M,wm) t=0:1/Fd:T; s=(1+M*cos(wm*t)).*cos(w0*t); s=s/max(s);
end
25
Обращение к функции из командного окна:
s=AM_signal(2,4*10^3,10^3,0.5,10); figure;
plot(s);
В теле функции можно вызывать другие созданные m-функции. Кроме того, в одном m-файле можно последовательно записывать несколько функций, при этом первая из них является главной, с которой MATLAB ассоциирует m-файл, а последующие называются локальными: они доступны для использования только внутри данного файла.
|
|
function test_func |
>> test_func |
t=t_form(2,1*10^3); |
2001 |
disp(length(t)); |
|
end |
|
function t=t_form(T,Fd) |
|
t=0:1/Fd:T; |
|
end |
|
Начиная с версии MATLAB 2016b [12], появилась возможность добавлять текст функций в конец m-файла с текстом программы, в котором они используются.
26
Например. Использование функций расчета отсчетов АМ-сигнала и ограничения сигнала:
s=AM_signal(2,4*10^3,10^3,0.5,10); s_lim=limitation(s,0.8);
figure; plot(s_lim);
function s=AM_signal(T,Fd,w0,M,wm) t=0:1/Fd:T; s=(1+M*cos(wm*t)).*cos(w0*t); s=s/max(s);
end
function s_lim=limitation(s,threshold) s_lim(1:length(s))=0;
for i=1:length(s)
if abs(s(i))>threshold s_lim(i)=threshold*sign(s(i));
else s_lim(i)=s(i);
end end
end
Результат:
27
5.8. Глобальные переменные
Для того чтобы переменная была доступна не только в теле одной функции, а в рабочем пространстве и внутри других функций, ее необходимо объявить как глобальную во всех функциях и скриптах, в которых подразумевается ее использование. Для этого применяется команда global, при этом MATLAB рекомендует объявлять переменные глобальными до того как они будут использоваться в тексте програм-
мы. Например:
|
|
function |
>> global a; |
f_declare_global(x) |
f_declare_global(2); |
global a; |
a |
a=x*2; |
a = |
end |
|
|
4 |
Для удаления всех глобальных переменных используется команда clear global.
6. УСТАНОВКА ПУТИ ПОИСКА MATLAB
Если производится обращение к созданной (а не встроенной) функции, MATLAB начинает поиск m-файла с введенным названием. Первоначально поиск производится в текущей папке (Current Folder), если там файл не находится, его поиск продолжается в папках, указан-
ных в пути поиска (Search Path) [13].
Выбор и указание текущей папки производятся с помощью кнопки
«Browse for folder» (рис. 3).
Установка путей поиска может производиться в окне, вызываемом нажатием на кнопку «Set Path» (рис. 4). Второй вариант – использование команд.
Для добавления папок к пути поиска используется команда
аddpath(имя_папки1,имя_папки2, … имя_папкиN)
Здесь в качестве имени папки используется полное имя (англ. full path name) вместе с путем, например, addpath('G:\work').
28
Для того чтобы убрать папки из пути поиска, используется команда rmpath, например, rmpath('G:\work').
Рис. 3. Кнопка «Browse for folder»
Рис. 4. Кнопка «Set Path»
7. ГРАФИЧЕСКИЕ ОБЪЕКТЫ
Графические объекты (англ. graphics objects) MATLAB – это компоненты, предназначенные для вывода графической информации [14]. Ярким примером графических объектов является график, отображаемый в графическом окне (англ. figure window), содержащий в своем составе линию или поверхность, оси, текст и пр. Каждый объект имеет свой уникальный идентификатор – указатель (англ. handle) и характеризуется рядом свойств (англ. properties). Например, линия имеет такие свойства, как цвет (Color), толщина (LineWidth) и др. Свойства можно задавать как при создании объекта, так и менять их у уже существующих.
29
Примерами функций, создающих графические объекты, являются plot, contour, plot3, mesh, surface и др. Каждая из перечис-
ленных создает сразу несколько объектов.
Рассмотрим пример. В данном случае команда plot создает графическое окно, в нем – оси, и только в осях уже строит линию графика. При этом каждому из этих объектов задаются свойства по умолчанию, если они не указаны специально.
t=0:0.0001:0.2; % вектор отсчетов времени [c] f=10; % частота сигнала, Гц
w=2*pi*f; % угловая частота, рад/с
% расчет отсчетов сигнала в комплексной форме: s=exp(1i*w*t);
plot(t,imag(s),t,real(s)); title('Квадратурные составляющие сигнала');
legend('мнимая часть','действительная часть'); xlabel('Время, с');
Результат выполнения этой программы представлен на рис. 5.
Рис. 5. График, созданный командой plot
30
