Перейти к содержанию
    

Трехмерная графика из матрицы в Matlab

Имеется код который формирует две двумерные матрицы работы 32_канального КИХ фильтра по 16 каналов каждая.

%% инициализация

clc; 
clear all;

f = 90000;					% центральная частота Гц
fs = 720000;        % удвоенная частота дискретизации Гц
A = 2047;           % амплитуда сигнала  
ts = 1/fs;          % период одного дискрета
tm = 50;            % количество проходов участка моделирования  
tm_test = tm*8;			% общее количество проходов моделирования
td = 5;             % коэффициент децимации
w=2*pi*f;						% круговая частота 
tmin = 0;           % начальное время (начальная фаза)
tmax = tm*ts;       % конечное время
tmax_test = tm_test*ts;       % конечное время

% матрица коэффициентов 51 коэффициент (Equiripple 75-85-95-105 кГц)
kf = [0,-834,0,283,0,-202,0,8,0,307,0,-738,0,1260,0,-1836,0,2417, ...
       0,-2947,0,3372,0,-3647,0,3742,0,-3647,0,3372,0,-2947,0, ...   
			2417,0,-1836,0,1260,0,-738,0,307,0,8,0,-202,0,283,0,-834,0];

% матрица времени 
t=linspace(tmin, tmax_test+tmin, fs*tmax_test+1);
% нечетные индексы матрицы времени t
t_odd = 1:2:length(t);
% четные индексы матрицы времени t
t_even = 2:2:length(t);

% матрица сигнала (канал 1 фаза 0) 
x1 = A*sin(w*t(t_odd));
x1(1:60) = 0;
x1(140:201) = 0;

% матрица сигнала (канал 2 фаза pi/4) 
x2 = A*sin(w*t(t_even));
x2(1:60) = 0;
x2(140:201) = 0;

%% моделирование

zr1=zeros(200,16);
zr2=zeros(200,16);
for tm_all = 1:16
 for tm_mod = 1:tm_test/2

   % поэлементное умножение
   if tm_mod < 150
     z1 = x1(tm_mod:(tm_mod+50)).*kf;
     z2 = x2(tm_mod:(tm_mod+50)).*kf;
   end	
   % матрица выходных данных КИХ канал 1
   zr1(tm_mod,tm_all) = round(sum(z1));
   % матрица выходных данных КИХ канал 2
   zr2(tm_mod,tm_all) = round(sum(z2));

 end
end

% максимальное значение
fprintf('Максимальное значение канал 1 %d\n', max(zr1(:,1)));
fprintf('Максимальное значение канал 2 %d\n', max(zr2(:,1)));
fprintf('\n');

%% графика

% выборки по сигналу x1
figure(1)
plot(x1, 'r');
hold on
stem(x1);

% выборки по сигналу x2
figure(2)
plot(x2, 'r');
hold on
stem(x2);

% графика элементов массива zr1
figure(3)
plot(zr1, 'r'), grid;
hold on
stem(zr1);

% графика элементов массива zr2
figure(4)
plot(zr2, 'r');
hold on
stem(zr2); 

Стоит задача нарисовать в трехмерном варианте значения двумерной матрицы zr1. При этом по оси х должны быть номера столбцов матрицы, по оси y номера строк. По оси z - значения данных в строках по каждому столбцу. Подскажите пожалуйста как это оформить в код для функции plot3?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

mesh или surf

Понятно. Значит Plot3 не подойдет.

Пытаюсь нарисовать значения массива zr1 (из программы), но не получается.

Массив zr1 - двумерный массив из 16 строк, каждая из которых имеет 200 элементов выходных данных цифровых фильтров.

Нужно нарисовать значения каждой из 16 строк по 200 элементов в трехмерном варианте

Делаю так:

u = 1:16;
v = lenght(zr1);
[X, Y] = meshgrid(u, v);
Z = zr1;

figure
surf(X,Y,Z)

Выскакивает ошибка

Error using surf...
Data dimensions must agree.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

[b,a]=size(zr1);
surf(1:a,1:b,zr1);

Спасибо. Работает.

Можно-ли как-то представить данные zr1 в 3D, в виде 16 плоских разноцветных графиков с пробелами между ними?

Похоже нужно использовать fill3.

В лоб не проходит

figure
[b, a] = size(zr1);
fill3(1:a,1:b,zr1);

Ошибка

Error using fill3
Not enough input arguments.

Изменено пользователем Acvarif

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Такое имеете в виду? Отдельными линиями 16 графиков построятся.

 

[xsize ysize] = size(zr1');
[X,Y] = meshgrid(1:xsize,1:ysize);
Z = zr1;
plot3(X,Y,Z)

 

Но это как-то не очень информативно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Такое имеете в виду? Отдельными линиями 16 графиков построятся.

 

[xsize ysize] = size(zr1');
[X,Y] = meshgrid(1:xsize,1:ysize);
Z = zr1;
plot3(X,Y,Z)

 

Но это как-то не очень информативно.

Спасибо. Попробую.

Пока остановился на этом:

%% инициализация

clc; 
clear all;

f = 90000;					% центральная частота Гц
fs = 720000;        % удвоенная частота дискретизации Гц
A = 2047;           % амплитуда сигнала  
ts = 1/fs;          % период одного дискрета
tm = 50;            % количество проходов участка моделирования  
tm_test = tm*8;			% общее количество проходов моделирования
td = 5;             % коэффициент децимации
w=2*pi*f;						% круговая частота 
tmin = 0;           % начальное время (начальная фаза)
tmax = tm*ts;       % конечное время
tmax_test = tm_test*ts;       % конечное время

% матрица коэффициентов 51 коэффициент (Equiripple 75-85-95-105 кГц)
kf = [0,-834,0,283,0,-202,0,8,0,307,0,-738,0,1260,0,-1836,0,2417, ...
       0,-2947,0,3372,0,-3647,0,3742,0,-3647,0,3372,0,-2947,0, ...   
			2417,0,-1836,0,1260,0,-738,0,307,0,8,0,-202,0,283,0,-834,0];

% матрица времени 
t=linspace(tmin, tmax_test+tmin, fs*tmax_test+1);
% нечетные индексы матрицы времени t
t_odd = 1:2:length(t);
% четные индексы матрицы времени t
t_even = 2:2:length(t);

% матрица сигнала (канал 1 фаза 0) 
x1 = A*sin(w*t(t_odd));
x1(1:60) = 0;
x1(140:201) = 0;

% матрица сигнала (канал 2 фаза pi/4) 
x2 = A*sin(w*t(t_even));
x2(1:60) = 0;
x2(140:201) = 0;

%% моделирование

zr1=zeros(200,16);
zr2=zeros(200,16);
for tm_all = 1:4
 for tm_mod = 1:tm_test/2

   % поэлементное умножение
   if tm_mod < 150
     z1 = x1(tm_mod:(tm_mod+50)).*kf;
     z2 = x2(tm_mod:(tm_mod+50)).*kf;
   end	
   % матрица выходных данных КИХ канал 1
   zr1(tm_mod,tm_all) = round(sum(z1));
   % матрица выходных данных КИХ канал 2
   zr2(tm_mod,tm_all) = round(sum(z2));

 end
end

% максимальное значение
fprintf('Максимальное значение канал 1 %d\n', max(zr1(:,1)));
fprintf('Максимальное значение канал 2 %d\n', max(zr2(:,1)));
fprintf('\n');

u = 1:16;
v = 1:200;
[X, Y] = meshgrid(u, v);
Z = zr1;
figure
plot3(X,Y,Z)
axis([1 16 1 200 -1e8 1e8])
shading flat
grid
hold on

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...