Сведения о программировании в системе инженерных и научных расчетов MATLAB

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

Операторы

В среде MATLAB используются операторы +, -, *, /, =, ^ (возведение в степень).

Переменные

Переменные объявляются следующим образом:

N = 1024;

Z = 28.2;

Имя переменной может содержать только символы A...Z, a...z, 0...9 и _, и не должно начинаться с цифры или подчеркивания. Точка с запятой в конце строки блокирует вывод значения переменной в командное окно.

Комментарий

Для задания комментария используется символ %. Например:

% Комментарий

Функции

clear all - очищает рабочее пространство – удаляет все переменные раннее запущенной программы.

сlc -очищает командное окно.

Функция digits(n) указывает количество значимых цифр после запятой для расчетов. По умолчанию – 32.

Функции cos(X) и sin(Y) возвращают косинус и синус угла X, заданного в радианах.

Функция sqrt(X) возвращает квадратный корень числа X.

Функция fix(A) возвращает число A, округленное в меньшую сторону. Например, fix(5.7) возвращает число 5.

Функция rand(n) возвращает массив размера n x n, заполненный случайными числами в диапазоне от 0 до 1. Например, rand(1) возвращает одно случайное число в диапазоне от 0 до 1.

Циклы

Цикл по переменной i от 1 до N реализуется следующим образом:

for i = 1:N,

end

Пример цикла по переменной iи вложенного в него цикла по переменной j:

for i = 1:N1,

for j = 1:N2,

end

end

Массивы

Для выделения массива в памяти используется функция zeros.

B = zeros(n) создает массив B размера n x n, заполненный нулями.

B = zeros(m,n)или B = zeros([m n]) создает массив B размера m x n, заполненный нулями.

B = zeros(m,n,p,...)илиB = zeros([m n p ...])создает массив B размера m x n x p x…, заполненный нулями.

Пример выделения и заполнения массива:

B = zeros(1,180);

for i = 1:180,

B(i) = sin(i/180*pi);

end

Условие

Условие реализуется следующим образом:

if (A < B),

C = A + B;

else

C = A - B;

end

Если выполняется условие A < B, то C = A + B, иначе C = A - B.

Если требуется объединить два или более условий, то используются оператор && для логической операции «И» или оператор || для логической операции «ИЛИ». Например:

if ((A < B) &&(A > 5)),

Задание интервала

Код i = 1:N заполняет массив i значениями от 1 до N.

Графики

Для вывода графиков используются следующие функции:

figure -Выводит график в отдельном окне.

Функция subplot(mnp) разбивает окно на m x n графиков и выбирает p-й график как текущий.

Функция plot(X,Y,'Color') строит график массивов X по оси абсцисс и Y по оси ординат цветом линии Color.



Значение параметра Color Цвет
r Красный
g Зеленый
b Синий
c Голубой
m Розовый
y Желтый
k Черный

title(' ')выводит название графика.

xlabel(' ') выводит текст по оси абсцисс.

ylabel(' ')выводит текст по оси ординат.

Функция xlim([xmin xmax]) указывает диапазон значений вывода по оси абсцисс от xmin до xmax.

Функция ylim([ymin ymax]) указывает диапазон значений вывода по оси ординат от ymin до ymax.

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

% Фильтрация зашумленного гармонического сигнала

clc; % очистить командное окно

clear all; % очистить рабочее пространство

digits(4); % точность расчетов 4 знака после запятой

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

N = 1024; % длина выборки - число элементов в массиве данных

% размером 2 в степени n - целое число

K = N/2; % число спектральных линий - должно быть N/2, N/4 и т.д.

% - определяет ширину спектра

Delta_t = 0.1 %sec интервал времени, в течение которого

% получаем исходный массив данных

Td = Delta_t/N; % период дискретизации входного сигнала -

% интервал через который происходит оцифровка

% сигнала в АЦП (в данном примере задана через длину выборки и длительность записи сигнала)

f_signal = 1000; %Hz частота полезного сигнала

f_p1 = 2000; %Hz частота первой помехи

f_p2 = 4000; %Hz частота второй помехи

T_signal = 1/f_signal; %sec период полезного сигнала

T_p1 = 1/f_p1; %sec период первой помехи

T_p2 = 1/f_p2; %sec период второй помехи

A_signal = 2; %V амплитуда сигнала

A_p1 = 1; %V амплитуда первой помехи

A_p2 = 0.5; %V амплитуда второй помехи

A_nois = 0.7; %V амплитуда белого шума

A_max = A_signal + A_p1 + A_p2 + A_nois; %V

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

for i = 1:N, % генерация дискретного сигнала

t(i) = Delta_t*i/1024; % массив моментов выборки сигнала

% заполнение массива данных полезного сигнала

Signal(i) = A_signal*sin(2*pi/T_signal*t(i));

% заполнение массива данных первой помехи

Pomeha_1(i) = A_p1*sin(2*pi/T_p1*t(i));

% заполнение массива данных второй помехи

Pomeha_2(i) = A_p2*sin(2*pi/T_p2*t(i));

Nois(i) = A_nois*rand(1); % заполнение массива данных белого шума

% заполнение массива данных результирующего сигнала

X(i) = Signal(i) + Pomeha_1(i) + Pomeha_2(i) + Nois(i);

end

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

for i = 1:N/4, % выделение небольшой части сигнала для вывода графика

t1(i) = t(i); % массив моментов времени

X1(i) = X(i); % массив значений части сигнала

end

figure; % вывод графиков в отдельном окне

% вывод первого из двух графиков: исходный сигнал

subplot(211), plot(t1,X1,'k');

% вывод текста по оси абсцисс

xlabel('Input signal: time, sec');

ylabel('X(t)'); % вывод текста по оси ординат

% диапазон значений вывода по оси ординат

ylim([-(fix(A_max)+0.5) (fix(A_max)+0.5)]);

%--- Прямое дискретное преобразование Фурье входного сигнала ------

% цикл по числу спектральных линий (для действительной части пектра)

for i = 1:K,

S1(i) = 0; % обнуление массива действительной части спектра

S2(i) = 0; % обнуление массива мнимой части спектра

for j = 1:N, % цикл по числу элементов массива выборки

% расчет действительной части спектра

S1(i) = S1(i) + X(j)*cos(-2*pi/N*i*j);

% расчет мнимой части спектра

S2(i) = S2(i) + X(j)*sin(-2*pi/N*i*j);

end

S1(i) = S1(i)/K; % нормировка спектра

S2(i) = S2(i)/K; % нормировка спектра

% расчет модуля спектральной плотности

S(i) = sqrt(S1(i)*S1(i) + S2(i)*S2(i));

f(i) = i/N/Td; % расчет частот спектра

end

%------- Расчет критического уровня для спектральной плотности ----------

% для размера выборки N = 1024 и величины ошибки q = 0.05 достоверность

% P = 1-q = 95% порог обнаружения сигнала по критерию Стьюдента

Z1 = 28.2;

% обнуляем сумму квадратов значений дискретного входного сигнала

Sum_X = 0;

for i = 1:N, % цикл по объему выборки

% расчет суммы квадратов входного дискретного сигнала

Sum_X = Sum_X + X(i)^2;

end

Sigma_02 = Sum_X/(N-1) % расчет дисперсии входного дискретного сигнала

% расчет критического уровня, выше которого спектральная плотность значима

Critical_Level_1 = Sigma_02*Z1/N

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

%вывод второго графика: спектральной плотности и линии критического уровня

subplot(212), plot(f,S,'r',f,Critical_Level_1,'b');

% вывод текста по оси абсцисс

xlabel('Spectrum of input signal: frequency, Hz');

% вывод текста по оси ординат

ylabel('S(f)');

% ограничение диапазона значений вывода данных по оси абсцисс

xlim([0 10*K]);

% ограничение диапазона значений вывода данных по оси ординат

ylim([0 fix(A_signal)]);

%-------------- Фильтрация сигнала полосовым фильтром ---------------

f_low = 500; %Hz нижняя частота среза фильтра

f_high = 1500; %Hz верхняя частота среза фильтра

for i = 1:K, % цикл по числу спектральных линий

% если частота спектра не попадает в полосу пропускания

if (f(i)<f_low)||(f(i)>f_high),

% то обнуляем действительную и мнимую части (i)- частоты спектра

S1(i) = 0;

S2(i) = 0;

S(i) = 0;

end

end

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

figure; % вывод графиков в отдельном окне

%вывод второго графика:спектральной плотности отфильтрованного сигнала

subplot(211), plot(f,S,'r');

% вывод текста по оси абсцисс

xlabel('Spectrum of filtered signal: frequency, Hz');

% вывод текста по оси ординат

ylabel('SF(f)');

% ограничение диапазона значений вывода данных по оси абсцисс

xlim([0 10*K]);

% ограничение диапазона значений вывода данных по оси ординат

ylim([0 fix(A_signal)]);

%--- Обратное дискретное преобразование Фурье отфильтрованного сигнала

for i = 1:N, % цикл по числу выборки

Y(i) = 0; % обнуление элементов массива отфильтрованного сигнала

t(i) = i*Td; % заполнение массива моментов времени

for j = 1:K, % цикл по числу спектральных линий

Y(i) = Y(i) + S1(j)*cos(2*pi*f(j)*t(i)) + S2(j)*sin(2*pi*f(j)*t(i));

end

end

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

% выделение небольшой части отфильтрованного сигнала для вывода графика

for i = 1:N/4,

t1(i) = t(i); % массив моментов времени

Y1(i) = Y(i); % массив значений части отфильтрованного сигнала

end

% вывод второго графика в окне: отфильтрованный сигнал

subplot(212), plot(t1,Y1,'b');

% вывод текста по оси абсцисс

xlabel('Filtered signal: time, sec');

% вывод текста по оси ординат

ylabel('Y(t)');

% ограничение диапазона значений вывода данных по оси ординат

ylim([-(fix(A_max)+0.5) (fix(A_max)+0.5)]);

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

% Расчет корреляционной функции отфильтрованного сигнала с полезным сигналом

C = zeros(1,N); % обнуление массива значений корреляционной функции

for i = 1:K, % цикл по фрагменту массива отфильтрованного сигнала

for j = 1:K, % цикл по массиву полезного сигнала

C(i) = C(i) + X(i+j)*Y(j);

end

C(i) = C(i)/N; % нормировка корреляционной функции

end

% цикл восстановления корреляционной функции до длины выборки

for i = K+1:N,

C(i) = C(i-K);

end

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

figure; % вывод следующего окна для графиков

% задание интервала изменения аргумента i при выводе коррелограммы

i = 1:N;

% вывод первого графика - корреляционной функции

subplot(211), plot(i,C,'r');

% вывод текста по оси абсцисс

xlabel('Correlation function: number of count');

% вывод текста по оси ординат

ylabel('C(i)');

% ограничение диапазона значений вывода данных по оси абсцисс

xlim([1 N/4]);

% ограничение диапазона значений вывода данных по оси ординат

ylim([-1.5 1.5]);

%--- Прямое дискретное преобразование Фурье корреляционной функции ----

% цикл по числу спектральных линий (для действительной части спектра)

for i = 1:K,

S1(i) = 0;% обнуление массива действительной части спектра

S2(i) = 0;% обнуление массива мнимой части спектра

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

for j = 1:N,

% расчет действительной части спектра

S1(i) = S1(i) + C(j)*cos(-2*pi/N*i*j);

% расчет мнимой части спектра

S2(i) = S2(i) + C(j)*sin(-2*pi/N*i*j);

end

S1(i) = S1(i)/K; % нормировка спектра

S2(i) = S2(i)/K; % нормировка спектра

% расчет модуля спектральной плотности коррелограммы

S(i) = sqrt(S1(i)*S1(i) + S2(i)*S2(i));

f(i) = i/N/Td; % расчет частот коррелограммы

end

%----- Расчет критического уровня для спектральной плотности

% корреляционной функции ------------------------------------------------

% для размера выборки N = 1024 и величины ошибки q = 0.05 достоверность

% P = 1-q = 95%

Z1 = 28.2; % порог обнаружения сигнала по критерию Стьюдента

Sum_Signal = 0; % обнуление переменной суммы значений полезного сигнала

Sum_Y = 0; % обнуление переменной суммы значений отфильтрованного сигнала

for i = 1:N, % цикл по объему выборки

% расчет суммы квадратов значений полезного сигнала

Sum_Signal = Sum_Signal + Signal(i)^2;

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

Sum_Y = Sum_Y + Y(i)^2;

end

Sigma_12 = Sum_Signal/(N-1) % расчет дисперсии полезного сигнала

Sigma_22 = Sum_Y/(N-1) % расчет дисперсии отфильтрованного сигнала

% расчет критического уровня выше которого

Critical_Level_2 = Sigma_12*Sigma_22*Z1/N^2

% спектральная плотность коррелограммы значима

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

%вывод второго графика в окне: спектр коррелограммы и критический уровнь

subplot(212), plot(f,S,'b',f,Critical_Level_2,'r');

% вывод текста по оси абсцисс

xlabel('Correlation spectrum: frequency, Hz');

% вывод текста по оси ординат

ylabel('SC(f)');

% ограничение диапазона значений вывода данных по оси абсцисс

xlim([0 10*K]);

% ограничение диапазона значений вывода данных по оси ординат

ylim([0 1.5]);

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

%----- расчет выборочного коэффициента корреляции исходного полезного

% сигнала с результирующим исходным сигналом-------------------------

% обнуление сумм массивов полезного и результирующего сигналов

Sum_Signal = 0;

Sum_X = 0;

for i = 1:N,

% сумма массива полезного сигнала

Sum_Signal = Sum_Signal + Signal(i);

% сумма массива отфильтрованого сигнала

Sum_X = Sum_X + X(i);

end

% расчет среднего значения полезного сигнала

m_Signal = Sum_Signal/N;

% расчет среднего значения отфильтрованного полезного сигнала

m_X = Sum_X/N;

% обнуление сумм массивов

Sum1 = 0;

Sum2 = 0;

for i = 1:N,

Sum1 = Sum1 + (Signal(i)-m_Signal)^2;

Sum2 = Sum2 + (X(i)-m_X)^2;

end

% расчет дисперсии полезного и отфильтрованного сигналов

D_Signal = Sum1/(N-1);

D_X = Sum2/(N-1);

% расчет второго смешанного центрального момента

% обнуление суммы

Sum3 = 0;

for i = 1:N,

Sum3 = Sum3 + (Signal(i)-m_Signal)*(X(i)-m_X);

end

M = Sum3/(N-1);

% расчет выборочного коеффициента корpеляции

R0 = M/sqrt(D_Signal*D_X)

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

%----------- расчет выборочного коэффициента корреляции полезного и

% отфильтрованного сигналов ------------------------------------------

% обнуление сумм массивов полезного и фильтрованного сигналов

Sum_Signal = 0;

Sum_Y = 0;

for i = 1:N,

% сумма массива полезного сигнала

Sum_Signal = Sum_Signal + Signal(i);

% сумма массива отфильтрованного сигнала

Sum_Y = Sum_Y + Y(i);

end

% расчет среднего значения полезного сигнала

m_Signal = Sum_Signal/N

% расчет среднего значения отфильтрованного полезного сигнала

m_Y = Sum_Y/N

% обнуление сумм массивов

Sum1 = 0;

Sum2 = 0;

for i = 1:N,

Sum1 = Sum1 + (Signal(i)-m_Signal)^2;

Sum2 = Sum2 + (Y(i)-m_Y)^2;

end

% расчет дисперсии полезного и отфильтрованного сигналов

D_Signal = Sum1/(N-1)

D_Y = Sum2/(N-1)

% расчет второго смешанного центрального момента

% обнуление суммы

Sum3 = 0;

for i = 1:N,

Sum3 = Sum3 + (Signal(i)-m_Signal)*(Y(i)-m_Y);

end

M = Sum3/(N-1)

% расчет выборочного коэффициента корреляции

R = M/sqrt(D_Signal*D_Y)

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

Фрагмент программы моделирования цифровой фильтрации зашумленного амплитудно-модулированного сигнала:

% Фильтрация амплитудно-модулированного сигнала

clc;% очистить командное окно

clear all;% очистить рабочее пространство

digits(4);% точность расчетов 4 знака после запятой

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

N = 1024;% длина выборки - число элементов в массиве данных

% размером 2 в степени n - целое число

K = N/2;% число спектральных линий - должно быть N/2, N/4 и т.д.

% - определяет ширину спектра

Delta_t = 0.1 %sec интервал времени, в течение которого

% получаем исходный массив данных

Td = Delta_t/N; % период дискретизации входного сигнала -

% интервал через который происходит оцифровка

% сигнала в АЦП (в данном примере задана через длину выборки и длительность

% записи сигнала)

f_mod = 50; %Hz частота амплитудной модуляции

f_signal = 1000; %Hz частота полезного сигнала

f_p1 = 2000; %Hz частота первой помехи

f_p2 = 4000; %Hz частота второй помехи

T_mod = 1/f_mod; %sec период амплитудной модуляции

T_signal = 1/f_signal; %sec период полезного сигнала

T_p1 = 1/f_p1; %sec период первой помехи

T_p2 = 1/f_p2; %sec период второй помехи

A_signal = 2; %V максимальная амплитуда полезного сигнала

A_p1 = 1; %V амплитуда первой помехи

A_p2 = 0.5; %V амплитуда второй помехи

A_nois = 0.5; %V амплитуда белого шума

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

A_max = A_signal + A_p1 + A_p2 + A_nois; %V

for i = 1:N, % генерация дискретного сигнала

t(i) = Delta_t*i/1024; % заполнение массива моментов выборки сигнала

% заполнение массива данных полезного сигнала

Signal(i) = A_signal*cos(2*pi/T_mod*t(i))*sin(2*pi/T_signal*t(i));

% заполнение массива данных первой помехи

Pomeha_1(i) = A_p1*sin(2*pi/T_p1*t(i));

% заполнение массива данных второй помехи

Pomeha_2(i) = A_p2*sin(2*pi/T_p2*t(i));

Nois(i) = A_nois*rand(1);% заполнение массива данных белого шума

% заполнение массива данных результирующего сигнала

X(i) = Signal(i) + Pomeha_1(i) + Pomeha_2(i) + Nois(i);

end

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

Фрагмент программы моделирования цифровой фильтрации зашумленного частотно-модулированного сигнала:

% Фильтрация частотно-модулированного сигнала

clc;% очистить командное окно

clear all;% очистить рабочее пространство

digits(4);% точность расчетов 4 знака после запятой

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

N = 1024; % длина выборки - число элементов в массиве данных

% размером 2 в степени n - целое число

K = N/2; % число спектральных линий - должно быть N/2, N/4 и т.д.

% - определяет ширину спектра

Delta_t = 0.1 %sec интервал времени, в течение которого

% получаем исходный массив данных

Td = Delta_t/N;% период дискретизации входного сигнала -

% интервал через который происходит оцифровка

% сигнала в АЦП (в данном примере задана через длину выборки и длительность

% записи сигнала)

f_mod = 100; %Hz частота модулирующего сигнала

f_signal = 1000; %Hz несущая частота сигнала (немодулированного сигнала)

f_p1 = 2000; %Hz частота первой помехи

f_p2 = 4000; %Hz частота второй помехи

T_mod = 1/f_mod; %sec период модулирующего сигнала

% амплитуда изменения периода колебаний несущего сигнала

Delta_T_mod = 0.0003*T_mod; %sec

T_signal_0 = 1/f_signal; %sec период немодулированного полезного сигнала

T_p1 = 1/f_p1; %sec период первой помехи

T_p2 = 1/f_p2; %sec период второй помехи

A_signal = 2; %V амплитуда полезного сигнала

A_p1 = 0.5; %V амплитуда первой помехи

A_p2 = 0.25; %V амплитуда второй помехи

A_nois = 0.25; %V амплитуда белого шума

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

A_max = A_signal + A_p1 + A_p2 + A_nois; %V

for i = 1:N, % генерация дискретного сигнала

t(i) = Delta_t*i/1024; % заполнение массива моментов выборки сигнала

% заполнение массива периода модулированного полезного сигнала

T_signal(i) = T_signal_0 + Delta_T_mod*sin(2*pi/T_mod*t(i));

% заполнение массива данных полезного сигнала

Signal(i) = A_signal*sin(2*pi/T_signal(i)*t(i));

% заполнение массива данных первой помехи

Pomeha_1(i) = A_p1*sin(2*pi/T_p1*t(i));

% заполнение массива данных второй помехи

Pomeha_2(i) = A_p2*sin(2*pi/T_p2*t(i));

% заполнение массива данных белого шума

Nois(i) = A_nois*rand(1);

% заполнение массива данных результирующего сигнала

X(i) = Signal(i) + Pomeha_1(i) + Pomeha_2(i) + Nois(i);

end

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

Наши рекомендации