Jump to content

    
Sign in to follow this  
acvarif

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

Recommended Posts

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

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

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

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

 

Спасибо.

 

Share this post


Link to post
Share on other sites
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);

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

Edited by Acvarif

Share this post


Link to post
Share on other sites
Правильна-ли такая запись?

 

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

 

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

 

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

Edited by MiPe

Share this post


Link to post
Share on other sites
А делает ли она то, что вы хотите?

 

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

 

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

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

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

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

 

Share this post


Link to post
Share on other sites

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

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

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...

Edited by Acvarif

Share this post


Link to post
Share on other sites

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

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

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('Амплитуда') 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this