реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как объединить матрицы по чет не чет в Matlab
Acvarif
сообщение Sep 28 2016, 08:46
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 838
Регистрация: 27-08-08
Пользователь №: 39 850



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

Спасибо.
Go to the top of the page
 
+Quote Post
MiPe
сообщение Sep 28 2016, 09:11
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 17-08-11
Пользователь №: 66 760



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


Сообщение отредактировал MiPe - Sep 28 2016, 11:17
Go to the top of the page
 
+Quote Post
litv
сообщение Sep 28 2016, 10:59
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 379
Регистрация: 6-10-04
Из: Воронеж
Пользователь №: 806



to Mipe:
постыдились бы за минуту решать сложные головоломки Acvarifa
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Sep 28 2016, 12:10
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 838
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(MiPe @ Sep 28 2016, 12:11) *
Код
C = reshape([A;B], 1, [])

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

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 - Sep 28 2016, 12:28
Go to the top of the page
 
+Quote Post
MiPe
сообщение Sep 28 2016, 12:54
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 17-08-11
Пользователь №: 66 760



Цитата(Acvarif @ Sep 28 2016, 15:10) *
Правильна-ли такая запись?


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

Код
out = complex(zrf(1:2:200,:),zrf(2:2:200,:))


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

Сообщение отредактировал MiPe - Sep 28 2016, 12:55
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Sep 28 2016, 13:08
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 838
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(MiPe @ Sep 28 2016, 15:54) *
А делает ли она то, что вы хотите?

Код
out = complex(zrf(1:2:200,:),zrf(2:2:200,:))


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

Да. Нужно подумать. Может в данном случае можно вообще обойтись без циклов...
Чтобы узнать получилось-ли то, что ожидалось нужно прорисовать 200 точек по каждому из 32_ух выходов БПФ. Для наглядности желательно в трехмерном виде.
Если не сложно, подскажите пожалуйста как это сделать.
Go to the top of the page
 
+Quote Post
MiPe
сообщение Sep 28 2016, 13:15
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 17-08-11
Пользователь №: 66 760



Давайте самостоятельно, это уже перестает быть интересным.

Прикрепленное изображение
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Sep 28 2016, 13:30
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 838
Регистрация: 27-08-08
Пользователь №: 39 850



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

Сообщение отредактировал Acvarif - Sep 28 2016, 13:40
Go to the top of the page
 
+Quote Post
Herz
сообщение Sep 28 2016, 13:39
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 10 507
Регистрация: 23-11-05
Пользователь №: 11 287



А это бестолковое цитирование зачем?
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Sep 30 2016, 06:00
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 838
Регистрация: 27-08-08
Пользователь №: 39 850



Не получается.
CODE
%% инициализация

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,sm.gif = 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(:,sm.gif,real(Xf(:,sm.gif))]);

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

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

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

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

Сообщение отредактировал Acvarif - Sep 30 2016, 07:40
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Oct 4 2016, 17:53
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 838
Регистрация: 27-08-08
Пользователь №: 39 850



Получилось. Может кому пригодится...
CODE
%% инициализация

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,sm.gif = 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,sm.gif = tm_mod;
end
for tm_mod = 1:1:tm
y(:,tm_mod) = tm_mod;
end

%% графика

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

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

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

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

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

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th April 2017 - 20:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01446 секунд с 7
ELECTRONIX ©2004-2016