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

Как объединить матрицы по чет не чет в Matlab

Имеются две матрицы

A = [1,3,5,7];

B = [2,4,6,8];

Как в Матлаб объединить эти матрицы в С так чтобы элементы А стояли на нечетных местах в строке, а B на четных - С = [1,2,3,4,5,6,7,8]?

 

Спасибо.

 

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


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

C = reshape([A;B], 1, [])

Спасибо. Это помогло объединить две матрицы не вдаваясь в циклы.

По поводу головоломок...

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

clc; 
clear all;

f1 = 90000;		 % центральная частота Гц
fs = 360000;		% частота дискретизации Гц
A = 2047;		   % амплитуда сигнала  
ts = 1/fs;		  % период одного дискрета
tm = 200;		   % количество проходов участка моделирования  
td = 5;			 % коэффициент децимации
w1=2*pi*f1;		 % круговая частота 1
tmin = 0;		   % начальное время (начальная фаза)
tmax = tm*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];

%lkf =length(kf);	% количество коэффициентов
% матрица времени 
t=linspace(tmin, tmax+tmin, fs*tmax+1);
% матрица выборок сигнала 90 кГц нач. сдвиг 0
x0 = A*sin(w1*t);
x0(1:60) = 0;
x0(140:201) = 0;
% матрица выборок сигнала 90 кГц нач. сдвиг pi/4
x45 = A*sin(w1*t + pi/4);
x45(1:60) = 0;
x45(140:201) = 0;

%% моделирование
z0 = zeros(1,51);
z45 = zeros(1,51);
zr0 = zeros(16,200);
zr45 = zeros(16,200);
zr0f = zeros(16,200);

for tm_mod = 1:tm

 % поэлементное умножение
if tm_mod < 150
z0 = x0(tm_mod:(tm_mod+50)).*kf;
z45 = x45(tm_mod:(tm_mod+50)).*kf;
 end	
 % матрица выходных данных КИХ 90 кГц смещение 0 и 45 
 for tm_nb = 1:16
zr0(tm_nb, tm_mod) = round(sum(z0));
zr45(tm_nb, tm_mod) = round(sum(z45));
% фазировка
if tm_mod > 1
  zr0f(tm_nb, tm_mod - 1) = (zr0(tm_nb, tm_mod - 1) + zr0(tm_nb, tm_mod))*0.707;
end
 end

end

zr0fn = reshape(zr0f, 200, 16);
zr45n = reshape(zr45, 200, 16);
% матрица выходных данных 32 канала
zrf = reshape([zr0fn;zr45n], 200, 32);
...

Имеется матрица zrf - выходные данные цифровых фильтров (32 канала-столбца) Всего 200 элементов-строк.

Элементы-столбцы четных строк - входные данные для real входа БПФ на 32 точки. Элементы-столбцы нечетных строк - входные данные для image входа БПФ32 точки.

Как в Матлаб выглядит запись функции fft если имются данные для real и image входов БПФ?

Записал так

tf = 2:200;
zrfn(tf - 1,:) = 1i*zrf(tf - 1,:) + zrf(tf,:);
Xf = fft(zrfn, 32);

Правильна-ли такая запись?

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

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


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

Правильна-ли такая запись?

 

А делает ли она то, что вы хотите?

 

out = complex(zrf(1:2:200,:),zrf(2:2:200,:))

 

Но я бы лучше поискал возможность сделать так, чтобы матрица для БПФ-32 сразу формировалась в нужном виде. Эти поэлементные умножения и конкатенации матриц выглядят не по-матлабовски.

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

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


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

А делает ли она то, что вы хотите?

 

out = complex(zrf(1:2:200,:),zrf(2:2:200,:))

 

Но я бы лучше поискал возможность сделать так, чтобы матрица для БПФ-32 сразу формировалась в нужном виде. Эти поэлементные умножения и конкатенации матриц выглядят не по-матлабовски.

Да. Нужно подумать. Может в данном случае можно вообще обойтись без циклов...

Чтобы узнать получилось-ли то, что ожидалось нужно прорисовать 200 точек по каждому из 32_ух выходов БПФ. Для наглядности желательно в трехмерном виде.

Если не сложно, подскажите пожалуйста как это сделать.

 

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


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

Да. Спасибо. Думаю справлюсь.

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

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


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

Не получается.

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

clc; 
clear all;

f = 90000;          % центральная частота Гц
fs = 360000;        % частота дискретизации Гц
A = 1;           % амплитуда сигнала  
ts = 1/fs;          % период одного дискрета
tm = 200;           % количество проходов участка моделирования  
td = 5;             % коэффициент децимации
w=2*pi*f;           % круговая частота 1
tmin = 0;           % начальное время (начальная фаза)
tmax = tm*ts;       % конечное время
offset = 2*pi/32;   % один минимальный шаг смещения
step = 1;           % множитель миним. шага смещения

% матрица коэффициентов 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];

lkf =length(kf);    % количество коэффициентов
% матрица времени 
t = linspace(tmin, tmax+tmin, fs*tmax+1);
% матрица сдвигов
t_offset = reshape(linspace(0, offset, 32), 32, 1);
% матрица сигналов (32 сигнала)
x = zeros(32,201);
toff = 1:32;
for toff = 1:32
 x(toff,:) = A*sin(w*t + step*offset*toff-offset);
 x(toff,1:60) = 0;
 x(toff, 140:201) = 0;
end

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

z = zeros(32,lkf);
zr = zeros(32,200);
zrf = zeros(32,200);
Xf = zeros(32,200);

for tm_mod = 1:tm

 for tf = 1:32
   % поэлементное умножение
   if tm_mod < 150
     z = x(tf,tm_mod:(tm_mod+50)).*kf;
   end	
   % матрица выходных данных КИХ 90 кГц 32 канала
   zr(tf, tm_mod) = round(sum(z));
 end

 if tm_mod > 1
   zrf(:,tm_mod-1) = 1i*zr(:,tm_mod-1) + zr(:,tm_mod-1);
   % fft complex 32 точки от двух соседних столбцов 
   Xf(:,tm_mod-1) = fft(zrf(:,tm_mod-1), 32);
 end

end

% fft 32 точки от двух соседних столбцов
Z = sqrt((real(Xf)).^2+(imag(Xf)).^2);
%[X, Y] = meshgrid([real(Xf(:,:),real(Xf(:,:)))]);

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

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

% fft
figure(3)
plot3(X, Y, Z); 
axis([1,32 1,200 1,10000])

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

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

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


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

Получилось. Может кому пригодится...

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

clc;  
clear all; 

% центральная частота Гц 
f = 90000;           
% частота дискретизации Гц 
fs = 360000;         
% коэффициент децимации 
td = 1;              
% амплитуда сигнала  
A = 1;             
% период одного дискрета 
ts = 1/fs;           
% количество проходов участка моделирования  
tm = 200;             
% круговая частота 
w=2*pi*f;            
% начальное время (начальная фаза) 
tmin = 0;            
% конечное время 
tmax = tm*ts;        
% один минимальный шаг смещения 
offset = 2*pi/32;    
% множитель миним. шага смещения 
step = -5;    
% вариант коэффициентов КИХ фильтра  
vf = 3;    

% матрица коэффициентов 51 коэффициент (окно Чебышева 85-95 кГц) 
kf1 = [0 116 0 -214 0 354 0 -540 0 772 0 -1042 0 1339 0 -1645 0 1939 ... 
     0 -2199 0 2403 0 -2533 0 2577 0 -2533 0 2403 0 -2199 0 1939 ... 
     0 -1645 0 1339 0 -1042 0 772 0 -540 0 354 0 -214 0 116 0]; 

% матрица коэффициентов 51 коэффициент (окно Хеминга 85-95 кГц) 
kf2 = [0,95,0,-151,0,260,0,-431,0,666,0,-958,0,1292,0,-1644,0,1988, ... 
       0,-2295,0,2537,0,-2692,0,2746,0,-2692,0,2537,0,-2295,0,1988, ... 
               0,-1644,0,1292,0,-958,0,666,0,-431,0,260,0,-151,0,95,0]; 

% матрица коэффициентов 51 коэффициент (Equiripple 75-85-95-105 кГц) 
kf3 = [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]; 

if vf == 1 
 kf = kf1; 
elseif vf == 2   
 kf = kf2; 
elseif vf == 3   
 kf = kf3; 
end  

% количество коэффициентов 
lkf =length(kf);     
% матрица времени  
t = linspace(tmin, tmin+tmax, fs*tmax+1); 
% матрица сигналов (32 сигнала со смещ. step*offset*toff-offset) 
xs = zeros(32,201); 
for toff = 1:32 
 xs(toff,:) = round(A*sin(w*t + step*offset*toff-offset)); 
 xs(toff,1:80) = 0; 
 xs(toff, 140:201) = 0; 
end 

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

zs = zeros(32,lkf); 
zr = zeros(32,200); 
zrf = zeros(32,200); 
Xf = zeros(32,200); 

for tm_mod = 1:td:tm 

 for tf = 1:32 
   % поэлементное умножение 
   if tm_mod < 150   
     zs = xs(tf,tm_mod/td:(tm_mod/td+50)).*kf; 
   end     
   % матрица выходных данных КИХ 90 кГц 32 канала 
   zr(tf, tm_mod/td) = round(sum(zs))*0.0001; 
 end 

 if tm_mod > td 
   zrf(:,tm_mod-1) = 1i*zr(:,tm_mod-1) + zr(:,tm_mod); 
   % fft complex 32 точки от двух соседних столбцов  
   Xf(:,tm_mod-1) = fft(zrf(:,tm_mod-1), 32); 
 end 

end 

% fft 32 точки от двух соседних столбцов 
z = sqrt((real(Xf)).^2+(imag(Xf)).^2); 
% координаты x y  
x = zeros(32,200); 
y = zeros(32,200); 
for tm_mod = 1:1:32 
 x(tm_mod,:) = tm_mod; 
end   
for tm_mod = 1:1:tm 
 y(:,tm_mod) = tm_mod; 
end   

%% графика 

% выборки по сигналу xs 
figure(1) 
plot(xs(1,:), 'r'); 
hold on 
stem(xs(1,:)); 
title('Дискретный сигнал'), 

% графика элементов массива zr 
figure(2) 
plot(zr(1,:), 'r'), grid; 
hold on 
stem(zr(1,:)); 
title('Дискретный сигнал после КИХ фильтра'), 

if step >= 0 
 nl = abs(step)+1; 
else 
 nl = 32-abs(step)+1; 
end   

figure(3) 
plot(z(nl,:), 'r'), grid; 
hold on 
stem(z(nl,:)); 
title('Пространственный БПФ луч nl'), 

figure(4) 
plot3(x, y, z), grid;  
title('БПФ 32 точки'), 
xlabel('Номер выхода БПФ'), ylabel('Дискретное время(выборки)'), zlabel('Амплитуда') 

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


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

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

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

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

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

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

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

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

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

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